1 // dialog.hxx - XML-configured dialog box.
7 # error This library requires C++
10 #include <plib/puAux.h>
13 #include <simgear/compiler.h> // for SG_USING_STD
14 #include <simgear/props/props.hxx>
15 #include <simgear/misc/sg_path.hxx>
24 // ugly temproary workaround for plib's lack of user defined class ids FIXME
25 #define FGCLASS_LIST 0x00000001
26 #define FGCLASS_AIRPORTLIST 0x00000002
27 #define FGCLASS_PROPERTYLIST 0x00000004
28 class GUI_ID { public: GUI_ID(int id) : id(id) {} int id; };
38 * An XML-configured dialog box.
40 * The GUI manager stores only the property tree for the dialog
41 * boxes. This class creates a PUI dialog box on demand from
42 * the properties in that tree. The manager recreates the dialog
43 * every time it needs to show it.
50 * Construct a new GUI widget configured by a property tree.
52 * The configuration properties are not part of the main
53 * FlightGear property tree; the GUI manager reads them
54 * from individual configuration files.
56 * @param props A property tree describing the dialog.
58 FGDialog (SGPropertyNode * props);
68 * Update the values of all GUI objects with a specific name,
69 * or all if name is 0 (default).
71 * This method copies values from the FlightGear property tree to
74 * @param objectName The name of the GUI object(s) to update.
75 * Use the empty name for all unnamed objects.
77 virtual void updateValues (const char * objectName = 0);
81 * Apply the values of all GUI objects with a specific name,
82 * or all if name is 0 (default)
84 * This method copies values from the GUI object(s) to the
85 * FlightGear property tree.
87 * @param objectName The name of the GUI object(s) to update.
88 * Use the empty name for all unnamed objects.
90 virtual void applyValues (const char * objectName = 0);
94 * Update state. Called on active dialogs before rendering.
96 virtual void update ();
110 // Private copy constructor to avoid unpleasant surprises.
111 FGDialog (const FGDialog &);
114 void display (SGPropertyNode * props);
116 // Build the dialog or a subobject of it.
117 puObject * makeObject (SGPropertyNode * props,
118 int parentWidth, int parentHeight);
120 // Common configuration for all GUI objects.
121 void setupObject (puObject * object, SGPropertyNode * props);
123 // Common configuration for all GUI group objects.
124 void setupGroup (puGroup * group, SGPropertyNode * props,
125 int width, int height, bool makeFrame = false);
127 // Set object colors: the "which" argument defines which color qualities
128 // (PUCOL_LABEL, etc.) should pick up the <color> property.
129 void setColor(puObject * object, SGPropertyNode * props, int which = 0);
131 // return key code number for keystring
132 int getKeyCode(const char *keystring);
134 // The top-level PUI object.
137 // The GUI subsystem.
140 // The dialog font. Defaults to the global gui font, but can get
141 // overridden by a top level font definition.
144 // The source xml tree, so that we can pass data back, such as the
146 SGPropertyNode_ptr _props;
150 SGPropertyNode_ptr _nasal_close;
152 // PUI provides no way for userdata to be deleted automatically
153 // with a GUI object, so we have to keep track of all the special
154 // data we allocated and then free it manually when the dialog
156 vector<void *> _info;
157 struct PropertyObject {
158 PropertyObject (const char * name,
160 SGPropertyNode_ptr node);
163 SGPropertyNode_ptr node;
165 vector<PropertyObject *> _propertyObjects;
166 vector<PropertyObject *> _liveObjects;
170 // Custom subclass of puPopup to implement "draggable" windows in the
171 // interface. Note that this is a subclass of puPopup, not
172 // puDialogBox. Sadly, PUI (mis)uses subclassing to implement a
173 // boolean property: modality. That means that we can't implement
174 // dragging of both puPopup windows and puDialogBoxes with the same
175 // code. Rather than duplicate code, I've chosen to implement only
176 // "non-modal dragability" here. Modal dialog boxes (like the exit
177 // confirmation) are not draggable.
179 class fgPopup : public puPopup {
181 fgPopup(int x, int y, bool d = true) : puPopup(x, y) { _dragging = false; _draggable = d;}
182 int checkHit(int b, int up, int x, int y);
183 int checkKey(int key, int updown);
184 int getHitObjects(puObject *, int x, int y);
185 puObject *getKeyObject(puObject *, int key);
186 puObject *getActiveInputField(puObject *);
196 fgValueList(SGPropertyNode *p);
197 virtual ~fgValueList();
198 virtual void update();
206 SGPropertyNode_ptr _props;
210 class fgList : public fgValueList, public puList, public GUI_ID {
212 fgList(int x1, int y1, int x2, int y2, SGPropertyNode *p, int sw) :
213 fgValueList(p), puList(x1, y1, x2, y2, _list, sw), GUI_ID(FGCLASS_LIST) {}
217 class fgComboBox : public fgValueList, public puaComboBox {
219 fgComboBox(int x1, int y1, int x2, int y2, SGPropertyNode *p, bool editable) :
220 fgValueList(p), puaComboBox(x1, y1, x2, y2, _list, editable) {}
223 class fgSelectBox : public fgValueList, public puaSelectBox {
225 fgSelectBox(int x1, int y1, int x2, int y2, SGPropertyNode *p) :
226 fgValueList(p), puaSelectBox(x1, y1, x2, y2, _list) {}
229 #endif // __DIALOG_HXX