diff --git a/src/GUI/dialog.hxx b/src/GUI/dialog.hxx index de2e900a9..4b4752d16 100644 --- a/src/GUI/dialog.hxx +++ b/src/GUI/dialog.hxx @@ -1,4 +1,4 @@ -// dialog.hxx - XML-configurable dialog box. +// dialog.hxx - XML-configured dialog box. #ifndef __DIALOG_HXX #define __DIALOG_HXX 1 @@ -20,28 +20,25 @@ class FGBinding; /** - * PUI userdata describing a GUI object. - */ -struct GUIInfo -{ - GUIInfo (FGDialog * w); - virtual ~GUIInfo (); - - FGDialog * widget; - vector bindings; -}; - - -/** - * Top-level GUI widget. + * An XML-configured dialog box. + * + * The GUI manager stores only the property tree for the dialog + * boxes. This class creates a PUI dialog box on demand from + * the properties in that tree. The manager recreates the dialog + * every time it needs to show it. */ class FGDialog { public: - /** * Construct a new GUI widget configured by a property tree. + * + * The configuration properties are not part of the main + * FlightGear property tree; the GUI manager reads them + * from individual configuration files. + * + * @param props A property tree describing the dialog. */ FGDialog (SGPropertyNode_ptr props); @@ -55,7 +52,8 @@ public: /** * Update the values of all GUI objects with a specific name. * - * This method copies from the property to the GUI object. + * 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. @@ -66,7 +64,8 @@ public: /** * Apply the values of all GUI objects with a specific name. * - * This method copies from the GUI object to the property. + * 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. @@ -77,7 +76,8 @@ public: /** * Update the values of all GUI objects. * - * This method copies from the properties to the GUI objects. + * This method copies values from the FlightGear property tree to + * the GUI objects. */ virtual void updateValues (); @@ -85,23 +85,39 @@ public: /** * Apply the values of all GUI objects. * - * This method copies from the GUI objects to the properties. + * This method copies from the GUI objects to the FlightGear + * property tree properties. */ virtual void applyValues (); private: - FGDialog (const FGDialog &); // just for safety + // Private copy constructor to avoid unpleasant surprises. + FGDialog (const FGDialog &); + + // Show the dialog. void display (SGPropertyNode_ptr props); + + // Build the dialog or a subobject of it. puObject * makeObject (SGPropertyNode * props, int parentWidth, int parentHeight); + + // Common configuration for all GUI objects. void setupObject (puObject * object, SGPropertyNode * props); + + // Common configuration for all GUI group objects. void setupGroup (puGroup * group, SGPropertyNode * props, int width, int height, bool makeFrame = false); + // The top-level PUI object. puObject * _object; - vector _info; + + // 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. + vector _info; struct PropertyObject { PropertyObject (const char * name, puObject * object, @@ -111,6 +127,12 @@ private: SGPropertyNode_ptr node; }; vector _propertyObjects; + + // 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; }; #endif // __DIALOG_HXX