# error This library requires C++
#endif
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
#include <plib/pu.h>
#include <simgear/compiler.h> // for SG_USING_STD
class FGMenuBar;
class FGDialog;
class FGBinding;
+class FGColor;
/**
*/
virtual void update (double delta_time_sec);
+ /**
+ * Creates a new dialog box, using the same property format as the
+ * gui/dialogs configuration files. Does not display the
+ * resulting dialog. If a pre-existing dialog of the same name
+ * exists, it will be deleted. The node argument will be stored
+ * in the GUI subsystem using SGPropertNode_ptr reference counting.
+ * It should not be deleted by user code.
+ *
+ * @param node A property node containing the dialog definition
+ */
+ virtual void newDialog (SGPropertyNode* node);
+
/**
* Display a dialog box.
*
/**
- * Close the currently-active dialog, if any.
+ * Close the currenty active dialog. This function is intended to
+ * be called from code (pui callbacks, for instance) that registers
+ * its dialog object as active via setActiveDialog(). Other
+ * user-level code should use the closeDialog(name) API.
*
- * @return true if a dialog was active, false otherwise.
+ * @return true if a dialog was active, false otherwise
*/
virtual bool closeActiveDialog ();
+ /**
+ * Close a named dialog, if it is open.
+ *
+ * @param name The name of the dialog box.
+ * @return true if the dialog was active, false otherwise.
+ */
+ virtual bool closeDialog (const string &name);
/**
* Return a pointer to the current menubar.
*/
virtual FGDialog * getActiveDialog ();
+ const FGColor& getColor (const char * which) { return _colors[which]; }
+ const FGColor& getColor (string which) { return _colors[which.c_str()]; }
+
protected:
/**
*/
virtual void setMenuBarVisible (bool visible);
+ virtual void setStyle ();
+ virtual void setupFont ();
private:
+ fntTexFont _tex_font;
+ puFont _font;
+ map<string,FGColor> _colors;
// Free all allocated memory.
void clear ();
FGMenuBar * _menubar;
FGDialog * _active_dialog;
- map<string,SGPropertyNode *> _dialog_props;
+ map<string,FGDialog *> _active_dialogs;
+ map<string,SGPropertyNode_ptr> _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& 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 <red> 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; }
};