X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2Fdialog.hxx;h=749c355cbdd6f215e75e7b5441e95cac783016db;hb=1ae2b59333dc914d10bcc726bc94e71cbf3e411e;hp=4b4752d16913d2d700424dfec7a0e2178ae057fa;hpb=4dc28f11f4dfa53480a44d693b59fcfd35852f43;p=flightgear.git diff --git a/src/GUI/dialog.hxx b/src/GUI/dialog.hxx index 4b4752d16..749c355cb 100644 --- a/src/GUI/dialog.hxx +++ b/src/GUI/dialog.hxx @@ -7,16 +7,27 @@ # error This library requires C++ #endif -#include +#include #include // for SG_USING_STD -#include +#include +#include #include -SG_USING_STD(vector); +using std::vector; + + +// ugly temporary workaround for plib's lack of user defined class ids FIXME +#define FGCLASS_LIST 0x00000001 +#define FGCLASS_AIRPORTLIST 0x00000002 +#define FGCLASS_PROPERTYLIST 0x00000004 +class GUI_ID { public: GUI_ID(int id) : id(id) {} virtual ~GUI_ID() {} int id; }; + + class FGDialog; -class FGBinding; +class NewGUI; +class FGColor; /** @@ -40,7 +51,7 @@ public: * * @param props A property tree describing the dialog. */ - FGDialog (SGPropertyNode_ptr props); + FGDialog (SGPropertyNode * props); /** @@ -50,7 +61,8 @@ public: /** - * Update the values of all GUI objects with a specific name. + * Update the values of all GUI objects with a specific name, + * or all if name is 0 (default). * * This method copies values from the FlightGear property tree to * the GUI object(s). @@ -58,11 +70,12 @@ public: * @param objectName The name of the GUI object(s) to update. * Use the empty name for all unnamed objects. */ - virtual void updateValue (const char * objectName); + virtual void updateValues (const char * objectName = 0); /** - * Apply the values of all GUI objects with a specific name. + * Apply the values of all GUI objects with a specific name, + * or all if name is 0 (default) * * This method copies values from the GUI object(s) to the * FlightGear property tree. @@ -70,34 +83,31 @@ public: * @param objectName The name of the GUI object(s) to update. * Use the empty name for all unnamed objects. */ - virtual void applyValue (const char * objectName); - - - /** - * Update the values of all GUI objects. - * - * This method copies values from the FlightGear property tree to - * the GUI objects. - */ - virtual void updateValues (); + virtual void applyValues (const char * objectName = 0); /** - * Apply the values of all GUI objects. - * - * This method copies from the GUI objects to the FlightGear - * property tree properties. + * Update state. Called on active dialogs before rendering. */ - virtual void applyValues (); - + virtual void update (); private: + enum { + BACKGROUND = 0x01, + FOREGROUND = 0x02, + HIGHLIGHT = 0x04, + LABEL = 0x08, + LEGEND = 0x10, + MISC = 0x20, + EDITFIELD = 0x40 + }; + // Private copy constructor to avoid unpleasant surprises. FGDialog (const FGDialog &); // Show the dialog. - void display (SGPropertyNode_ptr props); + void display (SGPropertyNode * props); // Build the dialog or a subobject of it. puObject * makeObject (SGPropertyNode * props, @@ -110,9 +120,31 @@ private: void setupGroup (puGroup * group, SGPropertyNode * props, int width, int height, bool makeFrame = false); + // Set object colors: the "which" argument defines which color qualities + // (PUCOL_LABEL, etc.) should pick up the property. + void setColor(puObject * object, SGPropertyNode * props, int which = 0); + + // return key code number for keystring + int getKeyCode(const char *keystring); + // The top-level PUI object. puObject * _object; + // The GUI subsystem. + NewGUI * _gui; + + // The dialog font. Defaults to the global gui font, but can get + // overridden by a top level font definition. + puFont * _font; + + // The source xml tree, so that we can pass data back, such as the + // last position. + SGPropertyNode_ptr _props; + + // Nasal module. + string _module; + SGPropertyNode_ptr _nasal_close; + // PUI provides no way for userdata to be deleted automatically // 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 @@ -127,12 +159,76 @@ private: SGPropertyNode_ptr node; }; vector _propertyObjects; + vector _liveObjects; +}; + +// +// Custom subclass of puPopup to implement "draggable" windows in the +// interface. Note that this is a subclass of puPopup, not +// puDialogBox. Sadly, PUI (mis)uses subclassing to implement a +// boolean property: modality. That means that we can't implement +// dragging of both puPopup windows and puDialogBoxes with the same +// code. Rather than duplicate code, I've chosen to implement only +// "non-modal dragability" here. Modal dialog boxes (like the exit +// confirmation) are not draggable. +// +class fgPopup : public puPopup { +public: + fgPopup(int x, int y, bool r = true, bool d = true) : + puPopup(x, y), _draggable(d), _resizable(r), _dragging(false) + {} + int checkHit(int b, int up, int x, int y); + int checkKey(int key, int updown); + int getHitObjects(puObject *, int x, int y); + puObject *getKeyObject(puObject *, int key); + puObject *getActiveInputField(puObject *); + void applySize(puObject *); +private: + enum { LEFT = 1, RIGHT = 2, TOP = 4, BOTTOM = 8 }; + bool _draggable; + bool _resizable; + bool _dragging; + int _resizing; + int _start_cursor; + int _cursor; + int _dlgX, _dlgY, _dlgW, _dlgH; + int _startX, _startY; +}; + + +class fgValueList { +public: + fgValueList(SGPropertyNode *p); + virtual ~fgValueList(); + virtual void update(); + +protected: + char **_list; + +private: + void make_list(); + void destroy_list(); + SGPropertyNode_ptr _props; +}; + + +class fgList : public fgValueList, public puaList, public GUI_ID { +public: + fgList(int x1, int y1, int x2, int y2, SGPropertyNode *p, int sw) : + fgValueList(p), puaList(x1, y1, x2, y2, _list, sw), GUI_ID(FGCLASS_LIST) {} + void update(); +}; - // PUI doesn't copy arrays, so we have to allocate string arrays - // and then keep pointers so that we can delete them when the - // dialog closes. - char ** make_char_array (int size); - vector _char_arrays; +class fgComboBox : public fgValueList, public puaComboBox { +public: + fgComboBox(int x1, int y1, int x2, int y2, SGPropertyNode *p, bool editable) : + fgValueList(p), puaComboBox(x1, y1, x2, y2, _list, editable) {} +}; + +class fgSelectBox : public fgValueList, public puaSelectBox { +public: + fgSelectBox(int x1, int y1, int x2, int y2, SGPropertyNode *p) : + fgValueList(p), puaSelectBox(x1, y1, x2, y2, _list) {} }; #endif // __DIALOG_HXX