1 // dialog.hxx - XML-configured dialog box.
7 # error This library requires C++
10 #include <plib/puAux.h>
12 #include <simgear/compiler.h> // for SG_USING_STD
13 #include <simgear/props/props.hxx>
14 #include <simgear/misc/sg_path.hxx>
15 #include <simgear/props/condition.hxx>
21 // ugly temporary workaround for plib's lack of user defined class ids FIXME
22 #define FGCLASS_LIST 0x00000001
23 #define FGCLASS_AIRPORTLIST 0x00000002
24 #define FGCLASS_PROPERTYLIST 0x00000004
25 #define FGCLASS_WAYPOINTLIST 0x00000008
27 class GUI_ID { public: GUI_ID(int id) : id(id) {} virtual ~GUI_ID() {} int id; };
37 * An XML-configured dialog box.
39 * The GUI manager stores only the property tree for the dialog
40 * boxes. This class creates a PUI dialog box on demand from
41 * the properties in that tree. The manager recreates the dialog
42 * every time it needs to show it.
49 * Construct a new GUI widget configured by a property tree.
51 * The configuration properties are not part of the main
52 * FlightGear property tree; the GUI manager reads them
53 * from individual configuration files.
55 * @param props A property tree describing the dialog.
57 FGDialog (SGPropertyNode * props);
67 * Update the values of all GUI objects with a specific name,
68 * or all if name is 0 (default).
70 * This method copies values from the FlightGear property tree to
73 * @param objectName The name of the GUI object(s) to update.
74 * Use the empty name for all unnamed objects.
76 virtual void updateValues (const char * objectName = 0);
80 * Apply the values of all GUI objects with a specific name,
81 * or all if name is 0 (default)
83 * This method copies values from the GUI object(s) to the
84 * FlightGear property tree.
86 * @param objectName The name of the GUI object(s) to update.
87 * Use the empty name for all unnamed objects.
89 virtual void applyValues (const char * objectName = 0);
93 * Update state. Called on active dialogs before rendering.
95 virtual void update ();
98 * Recompute the dialog's layout
103 void setNeedsLayout() {
104 _needsRelayout = true;
118 // Private copy constructor to avoid unpleasant surprises.
119 FGDialog (const FGDialog &);
122 void display (SGPropertyNode * props);
124 // Build the dialog or a subobject of it.
125 puObject * makeObject (SGPropertyNode * props,
126 int parentWidth, int parentHeight);
128 // Common configuration for all GUI objects.
129 void setupObject (puObject * object, SGPropertyNode * props);
131 // Common configuration for all GUI group objects.
132 void setupGroup (puGroup * group, SGPropertyNode * props,
133 int width, int height, bool makeFrame = false);
135 // Set object colors: the "which" argument defines which color qualities
136 // (PUCOL_LABEL, etc.) should pick up the <color> property.
137 void setColor(puObject * object, SGPropertyNode * props, int which = 0);
139 // return key code number for keystring
140 int getKeyCode(const char *keystring);
143 * Apply layout sizes to a tree of puObjects
145 void applySize(puObject *object);
147 // The top-level PUI object.
150 // The GUI subsystem.
153 // The dialog font. Defaults to the global gui font, but can get
154 // overridden by a top level font definition.
157 // The source xml tree, so that we can pass data back, such as the
159 SGPropertyNode_ptr _props;
165 SGPropertyNode_ptr _nasal_close;
167 // PUI provides no way for userdata to be deleted automatically
168 // with a GUI object, so we have to keep track of all the special
169 // data we allocated and then free it manually when the dialog
171 vector<void *> _info;
172 struct PropertyObject {
173 PropertyObject (const char * name,
175 SGPropertyNode_ptr node);
178 SGPropertyNode_ptr node;
180 vector<PropertyObject *> _propertyObjects;
181 vector<PropertyObject *> _liveObjects;
183 class ConditionalObject : public SGConditional
186 ConditionalObject(const std::string& aName, puObject* aPu) :
191 void update(FGDialog* aDlg);
194 const std::string _name;
198 typedef SGSharedPtr<ConditionalObject> ConditionalObjectRef;
199 vector<ConditionalObjectRef> _conditionalObjects;
203 // Custom subclass of puPopup to implement "draggable" windows in the
204 // interface. Note that this is a subclass of puPopup, not
205 // puDialogBox. Sadly, PUI (mis)uses subclassing to implement a
206 // boolean property: modality. That means that we can't implement
207 // dragging of both puPopup windows and puDialogBoxes with the same
208 // code. Rather than duplicate code, I've chosen to implement only
209 // "non-modal dragability" here. Modal dialog boxes (like the exit
210 // confirmation) are not draggable.
212 class fgPopup : public puPopup {
214 fgPopup(int x, int y, bool r = true, bool d = true) :
215 puPopup(x, y), _draggable(d), _resizable(r), _dragging(false)
217 int checkHit(int b, int up, int x, int y);
218 int checkKey(int key, int updown);
219 int getHitObjects(puObject *, int x, int y);
220 puObject *getKeyObject(puObject *, int key);
221 puObject *getActiveInputField(puObject *);
222 void applySize(puObject *);
224 enum { LEFT = 1, RIGHT = 2, TOP = 4, BOTTOM = 8 };
231 int _dlgX, _dlgY, _dlgW, _dlgH;
232 int _startX, _startY;
238 fgValueList(SGPropertyNode *p);
239 virtual ~fgValueList();
240 virtual void update();
248 SGPropertyNode_ptr _props;
252 class fgList : public fgValueList, public puaList, public GUI_ID {
254 fgList(int x1, int y1, int x2, int y2, SGPropertyNode *p, int sw) :
255 fgValueList(p), puaList(x1, y1, x2, y2, _list, sw), GUI_ID(FGCLASS_LIST) {}
259 class fgComboBox : public fgValueList, public puaComboBox {
261 fgComboBox(int x1, int y1, int x2, int y2, SGPropertyNode *p, bool editable) :
263 puaComboBox(x1, y1, x2, y2, _list, editable),
269 virtual void setSize(int w, int h);
271 virtual int checkHit(int b, int up, int x, int y);
273 virtual void recalc_bbox();
278 class fgSelectBox : public fgValueList, public puaSelectBox {
280 fgSelectBox(int x1, int y1, int x2, int y2, SGPropertyNode *p) :
281 fgValueList(p), puaSelectBox(x1, y1, x2, y2, _list) {}
284 #endif // __DIALOG_HXX