- use color map information from new_gui.cxx and set puObject colors
accordingly; - cleanup (call all puObjects "obj" for easier editing/copying) - commented out code: (not-yet functional props preprocessor)
This commit is contained in:
parent
e1a5398e4f
commit
f2bf0a7cb3
2 changed files with 189 additions and 119 deletions
|
@ -256,7 +256,8 @@ GUIInfo::~GUIInfo ()
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
FGDialog::FGDialog (SGPropertyNode * props)
|
FGDialog::FGDialog (SGPropertyNode * props)
|
||||||
: _object(0)
|
: _object(0),
|
||||||
|
_gui((NewGUI *)globals->get_subsystem("gui"))
|
||||||
{
|
{
|
||||||
char* envp = ::getenv( "FG_FONTS" );
|
char* envp = ::getenv( "FG_FONTS" );
|
||||||
if ( envp != NULL ) {
|
if ( envp != NULL ) {
|
||||||
|
@ -266,10 +267,6 @@ FGDialog::FGDialog (SGPropertyNode * props)
|
||||||
_font_path.append( "Fonts" );
|
_font_path.append( "Fonts" );
|
||||||
}
|
}
|
||||||
|
|
||||||
const sgVec4 background = {0.8, 0.8, 0.9, 0.85};
|
|
||||||
const sgVec4 foreground = {0, 0, 0, 1};
|
|
||||||
sgCopyVec4(_bgcolor, background);
|
|
||||||
sgCopyVec4(_fgcolor, foreground);
|
|
||||||
display(props);
|
display(props);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,6 +365,9 @@ FGDialog::display (SGPropertyNode * props)
|
||||||
bool userw = props->hasValue("width");
|
bool userw = props->hasValue("width");
|
||||||
bool userh = props->hasValue("height");
|
bool userh = props->hasValue("height");
|
||||||
|
|
||||||
|
// Expand some elements. Has to be done before the layouter sees them.
|
||||||
|
// preprocess(props);
|
||||||
|
|
||||||
// Let the layout widget work in the same property subtree.
|
// Let the layout widget work in the same property subtree.
|
||||||
LayoutWidget wid(props);
|
LayoutWidget wid(props);
|
||||||
|
|
||||||
|
@ -413,91 +413,101 @@ FGDialog::makeObject (SGPropertyNode * props, int parentWidth, int parentHeight)
|
||||||
int y = props->getIntValue("y", (parentHeight - height) / 2);
|
int y = props->getIntValue("y", (parentHeight - height) / 2);
|
||||||
string type = props->getName();
|
string type = props->getName();
|
||||||
|
|
||||||
sgVec4 color;
|
|
||||||
|
|
||||||
if (type == "hrule" || type == "vrule")
|
|
||||||
sgCopyVec4(color, _fgcolor);
|
|
||||||
else
|
|
||||||
sgCopyVec4(color, _bgcolor);
|
|
||||||
|
|
||||||
getColor(props->getNode("color"), color);
|
|
||||||
|
|
||||||
if (type == "")
|
if (type == "")
|
||||||
type = "dialog";
|
type = "dialog";
|
||||||
|
|
||||||
if (type == "dialog") {
|
if (type == "dialog") {
|
||||||
puPopup * dialog;
|
puPopup * obj;
|
||||||
bool draggable = props->getBoolValue("draggable", true);
|
bool draggable = props->getBoolValue("draggable", true);
|
||||||
if (props->getBoolValue("modal", false))
|
if (props->getBoolValue("modal", false))
|
||||||
dialog = new puDialogBox(x, y);
|
obj = new puDialogBox(x, y);
|
||||||
else
|
else
|
||||||
dialog = new fgPopup(x, y, draggable);
|
obj = new fgPopup(x, y, draggable);
|
||||||
setupGroup(dialog, props, width, height, color, true);
|
setupGroup(obj, props, width, height, true);
|
||||||
return dialog;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "group") {
|
} else if (type == "group") {
|
||||||
puGroup * group = new puGroup(x, y);
|
puGroup * obj = new puGroup(x, y);
|
||||||
setupGroup(group, props, width, height, color, false);
|
setupGroup(obj, props, width, height, false);
|
||||||
return group;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "frame") {
|
} else if (type == "frame") {
|
||||||
puGroup * group = new puGroup(x, y);
|
puGroup * obj = new puGroup(x, y);
|
||||||
setupGroup(group, props, width, height, color, true);
|
setupGroup(obj, props, width, height, true);
|
||||||
return group;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "hrule" || type == "vrule") {
|
} else if (type == "hrule" || type == "vrule") {
|
||||||
puFrame * rule = new puFrame(x, y, x + width, y + height);
|
puFrame * obj = new puFrame(x, y, x + width, y + height);
|
||||||
rule->setBorderThickness(0);
|
obj->setBorderThickness(0);
|
||||||
rule->setColorScheme(color[0], color[1], color[2], color[3]);
|
setColor(obj, props, FOREGROUND);
|
||||||
return rule;
|
return obj;
|
||||||
|
|
||||||
} else if (type == "list") {
|
} else if (type == "list") {
|
||||||
puList * list = new puList(x, y, x + width, y + height);
|
puList * obj = new puList(x, y, x + width, y + height);
|
||||||
setupObject(list, props);
|
setupObject(obj, props);
|
||||||
return list;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "airport-list") {
|
} else if (type == "airport-list") {
|
||||||
AirportList * list = new AirportList(x, y, x + width, y + height);
|
AirportList * obj = new AirportList(x, y, x + width, y + height);
|
||||||
setupObject(list, props);
|
setupObject(obj, props);
|
||||||
return list;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "input") {
|
} else if (type == "input") {
|
||||||
puInput * input = new puInput(x, y, x + width, y + height);
|
puInput * obj = new puInput(x, y, x + width, y + height);
|
||||||
setupObject(input, props);
|
setupObject(obj, props);
|
||||||
return input;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "text") {
|
} else if (type == "text") {
|
||||||
puText * text = new puText(x, y);
|
puText * obj = new puText(x, y);
|
||||||
setupObject(text, props);
|
setupObject(obj, props);
|
||||||
|
|
||||||
if (props->getNode("format")) {
|
if (props->getNode("format")) {
|
||||||
SGPropertyNode *live = props->getNode("live");
|
SGPropertyNode *live = props->getNode("live");
|
||||||
if (live && live->getBoolValue())
|
if (live && live->getBoolValue())
|
||||||
text->setRenderCallback(format_callback, props);
|
obj->setRenderCallback(format_callback, props);
|
||||||
else
|
else
|
||||||
format_callback(text, x, y, props);
|
format_callback(obj, x, y, props);
|
||||||
}
|
}
|
||||||
// Layed-out objects need their size set, and non-layout ones
|
// Layed-out objects need their size set, and non-layout ones
|
||||||
// get a different placement.
|
// get a different placement.
|
||||||
if(presetSize) text->setSize(width, height);
|
if(presetSize) obj->setSize(width, height);
|
||||||
else text->setLabelPlace(PUPLACE_LABEL_DEFAULT);
|
else obj->setLabelPlace(PUPLACE_LABEL_DEFAULT);
|
||||||
return text;
|
setColor(obj, props, LABEL);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "checkbox") {
|
} else if (type == "checkbox") {
|
||||||
puButton * b;
|
puButton * obj;
|
||||||
b = new puButton(x, y, x + width, y + height, PUBUTTON_XCHECK);
|
obj = new puButton(x, y, x + width, y + height, PUBUTTON_XCHECK);
|
||||||
b->setColourScheme(.8, .7, .7); // matches "PUI input pink"
|
setupObject(obj, props);
|
||||||
setupObject(b, props);
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
return b;
|
return obj;
|
||||||
|
|
||||||
} else if (type == "radio") {
|
} else if (type == "radio") {
|
||||||
puButton * b;
|
puButton * obj;
|
||||||
b = new puButton(x, y, x + width, y + height, PUBUTTON_CIRCLE);
|
obj = new puButton(x, y, x + width, y + height, PUBUTTON_CIRCLE);
|
||||||
b->setColourScheme(.8, .7, .7); // matches "PUI input pink"
|
setupObject(obj, props);
|
||||||
setupObject(b, props);
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
return b;
|
return obj;
|
||||||
|
|
||||||
} else if (type == "button") {
|
} else if (type == "button") {
|
||||||
puButton * b;
|
puButton * obj;
|
||||||
const char * legend = props->getStringValue("legend", "[none]");
|
const char * legend = props->getStringValue("legend", "[none]");
|
||||||
if (props->getBoolValue("one-shot", true))
|
if (props->getBoolValue("one-shot", true))
|
||||||
b = new puOneShot(x, y, legend);
|
obj = new puOneShot(x, y, legend);
|
||||||
else
|
else
|
||||||
b = new puButton(x, y, legend);
|
obj = new puButton(x, y, legend);
|
||||||
if(presetSize)
|
if(presetSize)
|
||||||
b->setSize(width, height);
|
obj->setSize(width, height);
|
||||||
setupObject(b, props);
|
setupObject(obj, props);
|
||||||
return b;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "combo") {
|
} else if (type == "combo") {
|
||||||
vector<SGPropertyNode_ptr> value_nodes = props->getChildren("value");
|
vector<SGPropertyNode_ptr> value_nodes = props->getChildren("value");
|
||||||
char ** entries = make_char_array(value_nodes.size());
|
char ** entries = make_char_array(value_nodes.size());
|
||||||
|
@ -505,42 +515,49 @@ FGDialog::makeObject (SGPropertyNode * props, int parentWidth, int parentHeight)
|
||||||
i < value_nodes.size();
|
i < value_nodes.size();
|
||||||
i++, j--)
|
i++, j--)
|
||||||
entries[i] = strdup((char *)value_nodes[i]->getStringValue());
|
entries[i] = strdup((char *)value_nodes[i]->getStringValue());
|
||||||
puComboBox * combo =
|
puComboBox * obj = new puComboBox(x, y, x + width, y + height, entries,
|
||||||
new puComboBox(x, y, x + width, y + height, entries,
|
|
||||||
props->getBoolValue("editable", false));
|
props->getBoolValue("editable", false));
|
||||||
setupObject(combo, props);
|
setupObject(obj, props);
|
||||||
return combo;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "slider") {
|
} else if (type == "slider") {
|
||||||
bool vertical = props->getBoolValue("vertical", false);
|
bool vertical = props->getBoolValue("vertical", false);
|
||||||
puSlider * slider = new puSlider(x, y, (vertical ? height : width));
|
puSlider * obj = new puSlider(x, y, (vertical ? height : width));
|
||||||
slider->setMinValue(props->getFloatValue("min", 0.0));
|
obj->setMinValue(props->getFloatValue("min", 0.0));
|
||||||
slider->setMaxValue(props->getFloatValue("max", 1.0));
|
obj->setMaxValue(props->getFloatValue("max", 1.0));
|
||||||
setupObject(slider, props);
|
setupObject(obj, props);
|
||||||
if(presetSize)
|
if(presetSize)
|
||||||
slider->setSize(width, height);
|
obj->setSize(width, height);
|
||||||
return slider;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "dial") {
|
} else if (type == "dial") {
|
||||||
puDial * dial = new puDial(x, y, width);
|
puDial * obj = new puDial(x, y, width);
|
||||||
dial->setMinValue(props->getFloatValue("min", 0.0));
|
obj->setMinValue(props->getFloatValue("min", 0.0));
|
||||||
dial->setMaxValue(props->getFloatValue("max", 1.0));
|
obj->setMaxValue(props->getFloatValue("max", 1.0));
|
||||||
dial->setWrap(props->getBoolValue("wrap", true));
|
obj->setWrap(props->getBoolValue("wrap", true));
|
||||||
setupObject(dial, props);
|
setupObject(obj, props);
|
||||||
return dial;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "textbox") {
|
} else if (type == "textbox") {
|
||||||
int slider_width = props->getIntValue("slider", parentHeight);
|
int slider_width = props->getIntValue("slider", parentHeight);
|
||||||
int wrap = props->getBoolValue("wrap", true);
|
int wrap = props->getBoolValue("wrap", true);
|
||||||
if (slider_width==0) slider_width=20;
|
if (slider_width==0) slider_width=20;
|
||||||
puLargeInput * puTextBox =
|
puLargeInput * obj = new puLargeInput(x, y,
|
||||||
new puLargeInput(x, y, x+width, x+height, 2, slider_width, wrap);
|
x+width, x+height, 2, slider_width, wrap);
|
||||||
if (props->hasValue("editable"))
|
|
||||||
{
|
if (props->hasValue("editable")) {
|
||||||
if (props->getBoolValue("editable")==false)
|
if (props->getBoolValue("editable")==false)
|
||||||
puTextBox->disableInput();
|
obj->disableInput();
|
||||||
else
|
else
|
||||||
puTextBox->enableInput();
|
obj->enableInput();
|
||||||
}
|
}
|
||||||
setupObject(puTextBox,props);
|
setupObject(obj, props);
|
||||||
return puTextBox;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
|
|
||||||
} else if (type == "select") {
|
} else if (type == "select") {
|
||||||
vector<SGPropertyNode_ptr> value_nodes;
|
vector<SGPropertyNode_ptr> value_nodes;
|
||||||
SGPropertyNode * selection_node =
|
SGPropertyNode * selection_node =
|
||||||
|
@ -554,10 +571,11 @@ FGDialog::makeObject (SGPropertyNode * props, int parentWidth, int parentHeight)
|
||||||
i < value_nodes.size();
|
i < value_nodes.size();
|
||||||
i++, j--)
|
i++, j--)
|
||||||
entries[i] = strdup((char *)value_nodes[i]->getName());
|
entries[i] = strdup((char *)value_nodes[i]->getName());
|
||||||
puSelectBox * select =
|
puSelectBox * obj =
|
||||||
new puSelectBox(x, y, x + width, y + height, entries);
|
new puSelectBox(x, y, x + width, y + height, entries);
|
||||||
setupObject(select, props);
|
setupObject(obj, props);
|
||||||
return select;
|
setColor(obj, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
|
return obj;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -592,11 +610,6 @@ FGDialog::setupObject (puObject * object, SGPropertyNode * props)
|
||||||
object->setLabelFont( lfnt );
|
object->setLabelFont( lfnt );
|
||||||
}
|
}
|
||||||
|
|
||||||
sgVec4 color;
|
|
||||||
sgCopyVec4(color, _fgcolor);
|
|
||||||
getColor(props->getNode("color"), color);
|
|
||||||
object->setColor(PUCOL_LABEL, color[0], color[1], color[2], color[3]);
|
|
||||||
|
|
||||||
if (props->hasValue("property")) {
|
if (props->hasValue("property")) {
|
||||||
const char * name = props->getStringValue("name");
|
const char * name = props->getStringValue("name");
|
||||||
if (name == 0)
|
if (name == 0)
|
||||||
|
@ -635,13 +648,13 @@ FGDialog::setupObject (puObject * object, SGPropertyNode * props)
|
||||||
|
|
||||||
void
|
void
|
||||||
FGDialog::setupGroup (puGroup * group, SGPropertyNode * props,
|
FGDialog::setupGroup (puGroup * group, SGPropertyNode * props,
|
||||||
int width, int height, sgVec4 color, bool makeFrame)
|
int width, int height, bool makeFrame)
|
||||||
{
|
{
|
||||||
setupObject(group, props);
|
setupObject(group, props);
|
||||||
|
|
||||||
if (makeFrame) {
|
if (makeFrame) {
|
||||||
puFrame* f = new puFrame(0, 0, width, height);
|
puFrame* f = new puFrame(0, 0, width, height);
|
||||||
f->setColorScheme(color[0], color[1], color[2], color[3]);
|
setColor(f, props, BACKGROUND|FOREGROUND|HIGHLIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
int nChildren = props->nChildren();
|
int nChildren = props->nChildren();
|
||||||
|
@ -651,20 +664,62 @@ FGDialog::setupGroup (puGroup * group, SGPropertyNode * props,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
FGDialog::getColor (const SGPropertyNode * prop, sgVec4 color)
|
FGDialog::setColor(puObject * object, SGPropertyNode * props, int which)
|
||||||
{
|
{
|
||||||
if (!prop)
|
string type = props->getName();
|
||||||
return;
|
// first set whole color scheme (see below for a description)
|
||||||
|
FGColor c = _gui->getColor("background");
|
||||||
|
c.merge(_gui->getColor(type));
|
||||||
|
c.merge(props->getNode("color"));
|
||||||
|
object->setColourScheme(c.red(), c.green(), c.blue(), c.alpha());
|
||||||
|
|
||||||
const SGPropertyNode *p;
|
// now look for the 6 plib color qualities
|
||||||
if ((p = prop->getChild("red")))
|
const int numcol = 6;
|
||||||
color[0] = p->getFloatValue();
|
const struct {
|
||||||
if ((p = prop->getChild("green")))
|
int mask;
|
||||||
color[1] = p->getFloatValue();
|
int id;
|
||||||
if ((p = prop->getChild("blue")))
|
const char *name;
|
||||||
color[2] = p->getFloatValue();
|
} pucol[numcol] = {
|
||||||
if ((p = prop->getChild("alpha")))
|
BACKGROUND, PUCOL_BACKGROUND, "background",
|
||||||
color[3] = p->getFloatValue();
|
FOREGROUND, PUCOL_FOREGROUND, "foreground",
|
||||||
|
HIGHLIGHT, PUCOL_HIGHLIGHT, "highlight",
|
||||||
|
LABEL, PUCOL_LABEL, "label",
|
||||||
|
LEGEND, PUCOL_LEGEND, "legend",
|
||||||
|
MISC, PUCOL_MISC, "misc",
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int i = 0; i < numcol; i++) {
|
||||||
|
// merge in object color quality components (e.g. "button-background")
|
||||||
|
FGColor c(_gui->getColor(type));
|
||||||
|
c.merge(_gui->getColor(type + '-' + pucol[i].name));
|
||||||
|
if (c.isValid()) {
|
||||||
|
// merge in explicit color components from the XML structure (<color>)
|
||||||
|
if (which & pucol[i].mask)
|
||||||
|
c.merge(props->getNode("color"));
|
||||||
|
object->setColor(pucol[i].id, c.red(), c.green(), c.blue(), c.alpha());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FGDialog::preprocess (SGPropertyNode * prop)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < prop->nChildren(); i++) {
|
||||||
|
SGPropertyNode *child = prop->getChild(i);
|
||||||
|
const char *name = child->getName();
|
||||||
|
|
||||||
|
if (!strcmp(name, "title")) {
|
||||||
|
prop->removeChild("title", child->getIndex(), false);
|
||||||
|
SGPropertyNode *tit = fgGetNode("/sim/gui/title");
|
||||||
|
if (!tit) {
|
||||||
|
fprintf(stderr, "no tits here!\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
copyProperties(tit, prop->getChild(child->getIndex()));
|
||||||
|
writeProperties(cerr, prop, true);
|
||||||
|
} else
|
||||||
|
preprocess(prop->getChild(i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char **
|
char **
|
||||||
|
|
|
@ -19,6 +19,8 @@ SG_USING_STD(vector);
|
||||||
|
|
||||||
class FGDialog;
|
class FGDialog;
|
||||||
class FGBinding;
|
class FGBinding;
|
||||||
|
class NewGUI;
|
||||||
|
class FGColor;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -100,6 +102,15 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
enum {
|
||||||
|
BACKGROUND = 0x01,
|
||||||
|
FOREGROUND = 0x02,
|
||||||
|
HIGHLIGHT = 0x04,
|
||||||
|
LABEL = 0x08,
|
||||||
|
LEGEND = 0x10,
|
||||||
|
MISC = 0x20
|
||||||
|
};
|
||||||
|
|
||||||
// Private copy constructor to avoid unpleasant surprises.
|
// Private copy constructor to avoid unpleasant surprises.
|
||||||
FGDialog (const FGDialog &);
|
FGDialog (const FGDialog &);
|
||||||
|
|
||||||
|
@ -115,15 +126,21 @@ private:
|
||||||
|
|
||||||
// Common configuration for all GUI group objects.
|
// Common configuration for all GUI group objects.
|
||||||
void setupGroup (puGroup * group, SGPropertyNode * props,
|
void setupGroup (puGroup * group, SGPropertyNode * props,
|
||||||
int width, int height, sgVec4 color,
|
int width, int height, bool makeFrame = false);
|
||||||
bool makeFrame = false);
|
|
||||||
|
|
||||||
// Read color properties and merge them into color vector.
|
// Set object colors: the "which" argument defines which color qualities
|
||||||
void getColor(const SGPropertyNode * prop, sgVec4 color);
|
// (PUCOL_LABEL, etc.) should pick up the <color> property.
|
||||||
|
void setColor(puObject * object, SGPropertyNode * props, int which = 0);
|
||||||
|
|
||||||
|
// Expand some elements according to style templates.
|
||||||
|
void preprocess (SGPropertyNode * props);
|
||||||
|
|
||||||
// The top-level PUI object.
|
// The top-level PUI object.
|
||||||
puObject * _object;
|
puObject * _object;
|
||||||
|
|
||||||
|
// The GUI subsystem.
|
||||||
|
NewGUI * _gui;
|
||||||
|
|
||||||
// PUI provides no way for userdata to be deleted automatically
|
// PUI provides no way for userdata to be deleted automatically
|
||||||
// with a GUI object, so we have to keep track of all the special
|
// with a GUI object, so we have to keep track of all the special
|
||||||
// data we allocated and then free it manually when the dialog
|
// data we allocated and then free it manually when the dialog
|
||||||
|
@ -147,8 +164,6 @@ private:
|
||||||
vector<char **> _char_arrays;
|
vector<char **> _char_arrays;
|
||||||
|
|
||||||
SGPath _font_path;
|
SGPath _font_path;
|
||||||
sgVec4 _fgcolor;
|
|
||||||
sgVec4 _bgcolor;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
Loading…
Add table
Reference in a new issue