From e1a5398e4f29825ba02d0ae1d1e1c32cc32304b9 Mon Sep 17 00:00:00 2001 From: mfranz Date: Thu, 7 Jul 2005 21:28:15 +0000 Subject: [PATCH] - add gui color support: maintain color map with default colors and all colors from /sim/gui/colors/ into map; - set default color scheme - handle fonts - implement color class - close all dialogs on reinit, set up style again, and then reopen all (non-nasal generated) dialogs again --- src/GUI/new_gui.cxx | 154 +++++++++++++++++++++++++++++++++++++++++++- src/GUI/new_gui.hxx | 60 +++++++++++++++++ 2 files changed, 212 insertions(+), 2 deletions(-) diff --git a/src/GUI/new_gui.cxx b/src/GUI/new_gui.cxx index fce518055..eda5ef861 100644 --- a/src/GUI/new_gui.cxx +++ b/src/GUI/new_gui.cxx @@ -15,16 +15,32 @@ SG_USING_STD(map); +extern puFont FONT_HELVETICA_14; +extern puFont FONT_VERA_12B; + + + //////////////////////////////////////////////////////////////////////// // Implementation of NewGUI. //////////////////////////////////////////////////////////////////////// + NewGUI::NewGUI () - : _menubar(new FGMenuBar), + : _font(FONT_HELVETICA_14), + _menubar(new FGMenuBar), _active_dialog(0) { + // set up the traditional colors as default + _colors["background"] = FGColor(0.8f, 0.8f, 0.9f, 0.85f); + _colors["foreground"] = FGColor(0.0f, 0.0f, 0.0f, 1.0f); + _colors["highlight"] = FGColor(0.7f, 0.7f, 0.7f, 1.0f); + _colors["label"] = FGColor(0.0f, 0.0f, 0.0f, 1.0f); + _colors["legend"] = FGColor(0.0f, 0.0f, 0.0f, 1.0f); + _colors["misc"] = FGColor(0.0f, 0.0f, 0.0f, 1.0f); + + setStyle(); } NewGUI::~NewGUI () @@ -46,11 +62,24 @@ NewGUI::init () void NewGUI::reinit () { + map::iterator iter; + vector dlg; + // close all open dialogs and remember them ... + for (iter = _active_dialogs.begin(); iter != _active_dialogs.end(); iter++) { + dlg.push_back(iter->first); + closeDialog(iter->first); + } + unbind(); clear(); + setStyle(); _menubar = new FGMenuBar; init(); bind(); + + // open remembered dialogs again (no nasal generated ones, unfortunately) + for (unsigned int i = 0; i < dlg.size(); i++) + showDialog(dlg[i]); } void @@ -169,7 +198,7 @@ test_extension (const char * path, const char * ext) { int pathlen = strlen(path); int extlen = strlen(ext); - + for (int i = 1; i <= pathlen && i <= extlen; i++) { if (path[pathlen-i] != ext[extlen-i]) return false; @@ -236,4 +265,125 @@ NewGUI::readDir (const char * path) ulCloseDir(dir); } + + +//////////////////////////////////////////////////////////////////////// +// Style handling. +//////////////////////////////////////////////////////////////////////// + +void +NewGUI::setStyle (void) +{ + setupFont(); + + //puSetDefaultStyle(); + + SGPropertyNode *n = fgGetNode("/sim/gui/colors"); + if (!n) + return; + + for (int i = 0; i < n->nChildren(); i++) { + SGPropertyNode *child = n->getChild(i); + _colors[child->getName()] = FGColor(child); + } + + FGColor c = _colors["background"]; + puSetDefaultColourScheme(c.red(), c.green(), c.blue(), c.alpha()); +} + + + + +static const struct { + char *name; + puFont font; +} guifonts[] = { + "default", FONT_HELVETICA_14, + "FIXED_8x13", PUFONT_8_BY_13, + "FIXED_9x15", PUFONT_9_BY_15, + "TIMES_10", PUFONT_TIMES_ROMAN_10, + "TIMES_24", PUFONT_TIMES_ROMAN_24, + "HELVETICA_10", PUFONT_HELVETICA_10, + "HELVETICA_12", PUFONT_HELVETICA_12, + "HELVETICA_14", FONT_HELVETICA_14, + "HELVETICA_18", PUFONT_HELVETICA_18, + "VERA_12B", FONT_VERA_12B, + 0, 0, +}; + +void +NewGUI::setupFont () +{ + SGPropertyNode *node = fgGetNode("/sim/gui/font", true); + string fontname = node->getStringValue("name", "Helvetica.txf"); + float size = node->getFloatValue("size", 15.0); + float slant = node->getFloatValue("slant", 0.0); + + int i; + for (i = 0; guifonts[i].name; i++) + if (fontname == guifonts[i].name) + break; + if (guifonts[i].name) + _font = guifonts[i].font; + else { + SGPath fontpath; + char* envp = ::getenv("FG_FONTS"); + if (envp != NULL) { + fontpath.set(envp); + } else { + fontpath.set(globals->get_fg_root()); + fontpath.append("Fonts"); + } + + SGPath path(fontpath); + path.append(fontname); + + if (_tex_font.load((char *)path.c_str())) { + _font.initialize((fntFont *)&_tex_font, size, slant); + } else { + _font = guifonts[0].font; + fontname = "default"; + } + } + puSetDefaultFonts(_font, _font); + fgSetString("/sim/gui/font", fontname.c_str()); +} + + + + +//////////////////////////////////////////////////////////////////////// +// FGColor class. +//////////////////////////////////////////////////////////////////////// + +void +FGColor::merge(const SGPropertyNode *node) +{ + if (!node) + return; + + const SGPropertyNode * n; + if ((n = node->getNode("red"))) + _red = n->getFloatValue(); + if ((n = node->getNode("green"))) + _green = n->getFloatValue(); + if ((n = node->getNode("blue"))) + _blue = n->getFloatValue(); + if ((n = node->getNode("alpha"))) + _alpha = n->getFloatValue(); +} + +void +FGColor::merge(const FGColor& color) +{ + if (color._red >= 0.0) + _red = color._red; + if (color._green >= 0.0) + _green = color._green; + if (color._blue >= 0.0) + _blue = color._blue; + if (color._alpha >= 0.0) + _alpha = color._alpha; +} + // end of new_gui.cxx diff --git a/src/GUI/new_gui.hxx b/src/GUI/new_gui.hxx index 6e96a5aa0..9ed87fe8c 100644 --- a/src/GUI/new_gui.hxx +++ b/src/GUI/new_gui.hxx @@ -28,6 +28,7 @@ SG_USING_STD(map); class FGMenuBar; class FGDialog; class FGBinding; +class FGColor; /** @@ -150,6 +151,9 @@ public: */ virtual FGDialog * getActiveDialog (); + const FGColor& getColor (const char * which) { return _colors[which]; } + const FGColor& getColor (string which) { return _colors[which.c_str()]; } + protected: /** @@ -166,8 +170,13 @@ protected: */ virtual void setMenuBarVisible (bool visible); + virtual void setStyle (); + virtual void setupFont (); private: + fntTexFont _tex_font; + puFont _font; + map _colors; // Free all allocated memory. void clear (); @@ -183,5 +192,56 @@ private: }; +class FGColor { +public: + FGColor() { clear(); } + FGColor(float r, float g, float b, float a = 1.0f) { set(r, g, b, a); } + FGColor(const SGPropertyNode *prop) { set(prop); } + + FGColor& operator=(const FGColor& c) { + _red = c._red; + _green = c._green; + _blue = c._blue; + _alpha = c._alpha; + return *this; + } + + inline void clear() { _red = _green = _blue = -1.0f; _alpha = 1.0f; } + // merges in non-negative components from property with children etc. + void merge(const SGPropertyNode *prop); + void merge(const FGColor& color); + + void set(const SGPropertyNode *prop) { clear(); merge(prop); }; + void set(const FGColor& color) { clear(); merge(color); } + void set(float r, float g, float b, float a = 1.0f) { + _red = clamp(r), _green = clamp(g), _blue = clamp(b), _alpha = clamp(a); + } + bool isValid() const { + return _red >= 0.0 && _green >= 0.0 && _blue >= 0.0 + && _alpha >= 0.0; + } + void print() const { + std::cerr << "red=" << _red << ", green=" << _green + << ", blue=" << _blue << ", alpha=" << _alpha << std::endl; + } + + inline void setRed(float red) { _red = clamp(red); } + inline void setGreen(float green) { _green = clamp(green); } + inline void setBlue(float blue) { _blue = clamp(blue); } + inline void setAlpha(float alpha) { _alpha = clamp(alpha); } + + inline float red() const { return _red; } + inline float green() const { return _green; } + inline float blue() const { return _blue; } + inline float alpha() const { return _alpha; } + +protected: + float _red, _green, _blue, _alpha; + +private: + float clamp(float f) { return f < 0.0 ? 0.0 : f > 1.0 ? 1.0 : f; } +}; + + #endif // __NEW_GUI_HXX -- 2.39.2