X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FGUI%2Fdialog.hxx;h=0895ce9c27473f7c3a439cccab27d4c8d3c36393;hb=9c28ed02577e6d32e1365567107adbd048f3d743;hp=4b4752d16913d2d700424dfec7a0e2178ae057fa;hpb=4dc28f11f4dfa53480a44d693b59fcfd35852f43;p=flightgear.git diff --git a/src/GUI/dialog.hxx b/src/GUI/dialog.hxx index 4b4752d16..0895ce9c2 100644 --- a/src/GUI/dialog.hxx +++ b/src/GUI/dialog.hxx @@ -8,15 +8,19 @@ #endif #include +#include #include // for SG_USING_STD -#include +#include +#include #include SG_USING_STD(vector); class FGDialog; class FGBinding; +class NewGUI; +class FGColor; /** @@ -40,7 +44,7 @@ public: * * @param props A property tree describing the dialog. */ - FGDialog (SGPropertyNode_ptr props); + FGDialog (SGPropertyNode * props); /** @@ -91,13 +95,28 @@ public: virtual void applyValues (); + /** + * Update state. Called on active dialogs before rendering. + */ + 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 +129,19 @@ 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; + // 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 +156,39 @@ private: SGPropertyNode_ptr node; }; 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. char ** make_char_array (int size); vector _char_arrays; + + SGPath _font_path; +}; + +// +// 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 d = true) : puPopup(x, y) { _dragging = false; _draggable = d;} + 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 *); +private: + bool _draggable; + bool _dragging; + int _dX, _dY; }; #endif // __DIALOG_HXX