X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2Fdialog.hxx;h=63aef704b1d2ec3354c7b4261749a2054db43515;hb=5cad5aa7da2476ca8323a61f81dea59676dca085;hp=65c010395f069d25d5ca03e306300f86fd398cb1;hpb=ff52ed507264067b62d19a06d3071c8f5bf61ea9;p=flightgear.git diff --git a/src/GUI/dialog.hxx b/src/GUI/dialog.hxx index 65c010395..63aef704b 100644 --- a/src/GUI/dialog.hxx +++ b/src/GUI/dialog.hxx @@ -7,18 +7,26 @@ # error This library requires C++ #endif -#include -#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; @@ -84,6 +92,15 @@ public: */ virtual void update (); + /** + * Recompute the dialog's layout + */ + void relayout(); + + + void setNeedsLayout() { + _needsRelayout = true; + } private: enum { @@ -120,6 +137,11 @@ private: // return key code number for keystring int getKeyCode(const char *keystring); + /** + * Apply layout sizes to a tree of puObjects + */ + void applySize(puObject *object); + // The top-level PUI object. puObject * _object; @@ -134,6 +156,8 @@ private: // last position. SGPropertyNode_ptr _props; + bool _needsRelayout; + // Nasal module. string _module; SGPropertyNode_ptr _nasal_close; @@ -141,30 +165,36 @@ private: // 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 - // closes. "values" is a node with "value" children and only used - // by the widget. + // closes. vector _info; struct PropertyObject { PropertyObject (const char * name, puObject * object, - SGPropertyNode_ptr node, - SGPropertyNode_ptr values = 0); + SGPropertyNode_ptr node); string name; puObject * object; SGPropertyNode_ptr node; - SGPropertyNode_ptr values; }; vector _propertyObjects; vector _liveObjects; - - // 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. value_list() builds such a list from "value" - // children. - char ** make_char_array (int size); - char ** value_list(const SGPropertyNode * prop); - void destroy_char_array (char **array); - vector _char_arrays; + + class ConditionalObject : public SGConditional + { + public: + ConditionalObject(const std::string& aName, puObject* aPu) : + _name(aName), + _pu(aPu) + { ; } + + void update(FGDialog* aDlg); + + private: + const std::string _name; + puObject* _pu; + }; + + typedef SGSharedPtr ConditionalObjectRef; + vector _conditionalObjects; }; // @@ -179,16 +209,63 @@ private: // class fgPopup : public puPopup { public: - fgPopup(int x, int y, bool d = true) : puPopup(x, y) { _dragging = false; _draggable = d;} + 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 _dX, _dY; + 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(); +}; + +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) {} + + void update(); +}; + +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