1
0
Fork 0

- 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:
mfranz 2005-07-07 21:30:34 +00:00
parent e1a5398e4f
commit f2bf0a7cb3
2 changed files with 189 additions and 119 deletions

View file

@ -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 **

View file

@ -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;
}; };
// //