X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2Fnew_gui.hxx;h=a0e4e69af6b963fddd6b03ff6f8074085bf6f8c8;hb=846fd2169832c8938f04386139de746a06e80d4b;hp=980b7871f86d2420e812f5bcc4a442c82831bdb0;hpb=685076e9ceb2bf14b63c400ef23467f235ba0198;p=flightgear.git diff --git a/src/GUI/new_gui.hxx b/src/GUI/new_gui.hxx index 980b7871f..a0e4e69af 100644 --- a/src/GUI/new_gui.hxx +++ b/src/GUI/new_gui.hxx @@ -3,36 +3,20 @@ #ifndef __NEW_GUI_HXX #define __NEW_GUI_HXX 1 -#ifndef __cplusplus -# error This library requires C++ -#endif - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -#include // for SG_USING_STD #include #include #include #include #include - -SG_USING_STD(vector); -SG_USING_STD(map); -SG_USING_STD(string); - -#include
+#include // for auto_ptr on some systems +#include // for strcmp in lstr() (in this header, alas) class FGMenuBar; class FGDialog; -class FGBinding; class FGColor; class FGFontCache; - +class puFont; /** * XML-configured GUI subsystem. @@ -62,8 +46,10 @@ public: */ virtual void init (); + virtual void shutdown (); + /** - * Reinitialize the GUI subsystem. + * Reinitialize the GUI subsystem. Reloads all XML dialogs. */ virtual void reinit (); @@ -88,6 +74,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 @@ -112,7 +103,7 @@ public: * @param name The name of the dialog box. * @return true if the dialog exists, false otherwise. */ - virtual bool showDialog (const string &name); + virtual bool showDialog (const std::string &name); /** @@ -131,21 +122,20 @@ public: * @param name The name of the dialog box. * @return true if the dialog was active, false otherwise. */ - virtual bool closeDialog (const string &name); + virtual bool closeDialog (const std::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 getDialog (const string &name); + virtual SGPropertyNode_ptr getDialogProperties (const std::string &name); /** * Return a pointer to the current menubar. */ virtual FGMenuBar * getMenuBar (); - /** * Ignore this method. * @@ -161,27 +151,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 std::string &name); + + virtual FGColor *getColor (const char * name) const { _citt_t it = _colors.find(name); return (it != _colors.end()) ? it->second : NULL; } - virtual FGColor *getColor (const string &name) const { + virtual FGColor *getColor (const std::string &name) const { _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. * @@ -199,7 +191,18 @@ 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: + void createMenuBarImplementation(); + struct ltstr { bool operator()(const char* s1, const char* s2) const { @@ -207,90 +210,31 @@ private: } }; - fntTexFont _tex_font; - puFont _font; - map _colors; - typedef map::iterator _itt_t; - typedef map::const_iterator _citt_t; + puFont *_font; + typedef std::map ColourDict; + ColourDict _colors; + typedef ColourDict::iterator _itt_t; + typedef ColourDict::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); + void readDir (const SGPath& path); - FGMenuBar * _menubar; + std::auto_ptr _menubar; FGDialog * _active_dialog; - map _active_dialogs; - map _dialog_props; - -}; - - -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(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 set(const SGPropertyNode *prop) { clear(); return merge(prop); }; - 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; - } - 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; - } - - inline void setRed(float red) { _red = red; } - inline void setGreen(float green) { _green = green; } - inline void setBlue(float blue) { _blue = blue; } - inline void setAlpha(float alpha) { _alpha = alpha; } - - inline float red() const { return clamp(_red); } - inline float green() const { return clamp(_green); } - inline float blue() const { return clamp(_blue); } - inline float alpha() const { return _alpha < 0.0 ? 1.0 : clamp(_alpha); } - -protected: - float _red, _green, _blue, _alpha; - -private: - float clamp(float f) const { return f < 0.0 ? 0.0 : f > 1.0 ? 1.0 : f; } -}; - - - -/** - * A small class to keep all fonts available for future use. - * This also assures a font isn't resident more than once. - */ -class FGFontCache { -private: - SGPath _path; - - map _fonts; - typedef map::iterator _itt_t; - -public: - FGFontCache(); - ~FGFontCache(); + typedef std::map DialogDict; + DialogDict _active_dialogs; + + typedef std::map NamePathDict; + // mapping from dialog names to the corresponding XML property list + // which defines them + NamePathDict _dialog_names; + + // cache of loaded dialog proeprties + typedef std::map NameDialogDict; + NameDialogDict _dialog_props; - puFont *get(const char *name, float size=15.0, float slant=0.0); - puFont *get(SGPropertyNode *node); };