#endif
#include <plib/puAux.h>
-#include <plib/sg.h>
#include <simgear/compiler.h> // for SG_USING_STD
#include <simgear/props/props.hxx>
#include <simgear/misc/sg_path.hxx>
+#include <simgear/props/condition.hxx>
#include <vector>
-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;
/**
- * 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).
* @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.
* @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 ();
-
-
- /**
- * Apply the values of all GUI objects.
- *
- * This method copies from the GUI objects to the FlightGear
- * property tree properties.
- */
- virtual void applyValues ();
+ virtual void applyValues (const char * objectName = 0);
/**
*/
virtual void update ();
+ /**
+ * Recompute the dialog's layout
+ */
+ void relayout();
+
+
+ void setNeedsLayout() {
+ _needsRelayout = true;
+ }
private:
enum {
HIGHLIGHT = 0x04,
LABEL = 0x08,
LEGEND = 0x10,
- MISC = 0x20
+ MISC = 0x20,
+ EDITFIELD = 0x40
};
// Private copy constructor to avoid unpleasant surprises.
// (PUCOL_LABEL, etc.) should pick up the <color> property.
void setColor(puObject * object, SGPropertyNode * props, int which = 0);
+ // 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;
// 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;
+
+ bool _needsRelayout;
+
+ // 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
};
vector<PropertyObject *> _propertyObjects;
vector<PropertyObject *> _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 **> _char_arrays;
-
- SGPath _font_path;
+
+ 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<ConditionalObject> ConditionalObjectRef;
+ vector<ConditionalObjectRef> _conditionalObjects;
};
//
//
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