X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2Fnew_gui.hxx;h=6bc2707157eec18780bbf377ecab6b9441d24a75;hb=fc71333bdd0217a9ff4880305daf6d4d10fb0b40;hp=dbe1904fc876cb5ab0b0f6dafd4a07674072e305;hpb=0ec8fa64a4a12cf18491ec689008316c42640274;p=flightgear.git diff --git a/src/GUI/new_gui.hxx b/src/GUI/new_gui.hxx index dbe1904fc..6bc270715 100644 --- a/src/GUI/new_gui.hxx +++ b/src/GUI/new_gui.hxx @@ -18,18 +18,20 @@ #include #include +#include #include #include -SG_USING_STD(vector); -SG_USING_STD(map); -SG_USING_STD(string); +using std::vector; +using std::map; +using std::string; #include
+class SGBinding; + class FGMenuBar; class FGDialog; -class FGBinding; class FGColor; class FGFontCache; @@ -63,7 +65,7 @@ public: virtual void init (); /** - * Reinitialize the GUI subsystem. + * Reinitialize the GUI subsystem. Reloads all XML dialogs. */ virtual void reinit (); @@ -88,6 +90,11 @@ public: */ virtual void update (double delta_time_sec); + /** + * Redraw the GUI picking up new GUI colors. + */ + virtual void redraw (); + /** * Creates a new dialog box, using the same property format as the * gui/dialogs configuration files. Does not display the @@ -133,12 +140,18 @@ public: */ virtual bool closeDialog (const string &name); + /** + * Get dialog property tree's root node. + * @param name The name of the dialog box. + * @return node pointer if the dialog was found, zero otherwise. + */ + virtual SGPropertyNode_ptr getDialogProperties (const string &name); + /** * Return a pointer to the current menubar. */ virtual FGMenuBar * getMenuBar (); - /** * Ignore this method. * @@ -154,27 +167,29 @@ public: */ virtual FGDialog * getActiveDialog (); + + /** + * Get the named dialog if active. + * + * @return The named dialog, or 0 if it isn't active. + */ + virtual FGDialog * getDialog (const string &name); + + virtual FGColor *getColor (const char * name) const { - _itt_t it = _colors.find(name); - return it->second; + _citt_t it = _colors.find(name); + return (it != _colors.end()) ? it->second : NULL; } virtual FGColor *getColor (const string &name) const { - _itt_t it = _colors.find(name.c_str()); - return it->second; + _citt_t it = _colors.find(name.c_str()); + return (it != _colors.end()) ? it->second : NULL; } - virtual puFont *getDefaultFont() { return &_font; } + virtual puFont *getDefaultFont() { return _font; } - /** - * menu wide font cache, accessible from other classes as well. - */ - FGFontCache *get_fontcache() { return _fontcache; } - protected: - FGFontCache * _fontcache; - /** * Test if the menubar is visible. * @@ -192,14 +207,29 @@ protected: virtual void setStyle (); virtual void setupFont (SGPropertyNode *); + /** + * Used by reinit() and redraw() to close all dialogs and to apply + * current GUI colors. If "reload" is false, reopens all dialogs. + * Otherwise reloads all XML dialog files from disk and reopens all + * but Nasal * generated dialogs, omitting dynamic widgets. (This + * is only useful for GUI development.) + */ + virtual void reset (bool reload); + private: - fntTexFont _tex_font; - puFont _font; - map _colors; - typedef map::const_iterator _itt_t; + struct ltstr + { + bool operator()(const char* s1, const char* s2) const { + return strcmp(s1, s2) < 0; + } + }; + + puFont *_font; + map _colors; + typedef map::iterator _itt_t; + typedef map::const_iterator _citt_t; - // Free all allocated memory. - void clear (); + void clear_colors(); // Read all the configuration files in a directory. void readDir (const char * path); @@ -217,15 +247,17 @@ 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(FGColor *c) { set(c->_red, c->_green, c->_blue, c->_alpha); } + FGColor(FGColor *c) { + if (c) set(c->_red, c->_green, c->_blue, c->_alpha); + } inline void clear() { _red = _green = _blue = _alpha = -1.0f; } // merges in non-negative components from property with children etc. bool merge(const SGPropertyNode *prop); - bool merge(const FGColor& color); + bool merge(const FGColor *color); bool set(const SGPropertyNode *prop) { clear(); return merge(prop); }; - bool set(const FGColor& color) { clear(); return merge(color); } + bool set(const FGColor *color) { clear(); return merge(color); } bool set(float r, float g, float b, float a = 1.0f) { _red = r, _green = g, _blue = b, _alpha = a; return true; @@ -233,10 +265,7 @@ public: bool isValid() const { return _red >= 0.0 && _green >= 0.0 && _blue >= 0.0; } - void print() const { - std::cerr << "red=" << _red << ", green=" << _green - << ", blue=" << _blue << ", alpha=" << _alpha << std::endl; - } + void print() const; inline void setRed(float red) { _red = red; } inline void setGreen(float green) { _green = green; } @@ -258,15 +287,51 @@ private: /** - * A small class to keep all fonts available for future use. + * A class to keep all fonts available for future use. * This also assures a font isn't resident more than once. */ class FGFontCache { private: + // The parameters of a request to the cache. + struct FntParams + { + const std::string name; + const float size; + const float slant; + FntParams() : size(0.0f), slant(0.0f) {} + FntParams(const FntParams& rhs) + : name(rhs.name), size(rhs.size), slant(rhs.slant) + { + } + FntParams(const std::string& name_, float size_, float slant_) + : name(name_), size(size_), slant(slant_) + { + } + }; + struct FntParamsLess + : public std::binary_function + { + bool operator() (const FntParams& f1, const FntParams& f2) const; + }; + struct fnt { + fnt(puFont *pu = 0) : pufont(pu), texfont(0) {} + ~fnt() { if (texfont) { delete pufont; delete texfont; } } + // Font used by plib GUI code + puFont *pufont; + // TXF font + fntTexFont *texfont; + }; + // Path to the font directory SGPath _path; - map _fonts; - typedef map::iterator _itt_t; + typedef map TexFontMap; + typedef map PuFontMap; + TexFontMap _texFonts; + PuFontMap _puFonts; + + bool _initialized; + struct fnt *getfnt(const char *name, float size, float slant); + void init(); public: FGFontCache(); @@ -274,6 +339,18 @@ public: puFont *get(const char *name, float size=15.0, float slant=0.0); puFont *get(SGPropertyNode *node); + + fntTexFont *getTexFont(const char *name, float size=15.0, float slant=0.0); + + SGPath getfntpath(const char *name); + /** + * Preload all the fonts in the FlightGear font directory. It is + * important to load the font textures early, with the proper + * graphics context current, so that no plib (or our own) code + * tries to load a font from disk when there's no current graphics + * context. + */ + bool initializeFonts(); };