]> git.mxchange.org Git - flightgear.git/blobdiff - src/GUI/property_list.hxx
accomodate changes to osgDB::DatabasePager interface
[flightgear.git] / src / GUI / property_list.hxx
index b044361b1abd049ce7566596330c81414e84273c..046c09435b3872c4d7d9871b7d04c48a5fd75032 100644 (file)
 #ifndef _PROPERTY_LIST_HXX
 #define _PROPERTY_LIST_HXX
 
+#include <string>
 
-#include <plib/pu.h>
+#include <plib/puAux.h>
 #include <simgear/props/props.hxx>
 #include "dialog.hxx"
 
-#include "puList.hxx"
 
-class PropertyList : public puList, public SGPropertyChangeListener, public GUI_ID {
+class PropertyList : public puaList, public SGPropertyChangeListener, public GUI_ID {
 public:
     PropertyList(int minx, int miny, int maxx, int maxy, SGPropertyNode *);
     ~PropertyList();
@@ -39,36 +39,56 @@ public:
     void setCurrent(SGPropertyNode *p);
     SGPropertyNode *getCurrent() const { return _curr; }
     void publish(SGPropertyNode *p) { _return = p; invokeCallback(); }
-    void toggleFlags() { _flags->setBoolValue(!_flags->getBoolValue()); }
+    void toggleVerbosity() { _verbose = !_verbose; }
 
     // overridden plib pui methods
-    virtual char *getListStringValue() { return (char *)(_return ? _return->getPath(true) : ""); }
-    //virtual char *getStringValue(void) { return (char *)(_return ? _return->getPath(true) : ""); }
+    virtual char *getStringValue(void)
+    {
+        _return_path.clear();
+        if (_return)
+            _return_path = _return->getPath(true);
+        return const_cast<char*>(_return_path.c_str());
+    }
+    //virtual char *getListStringValue() { return (char *)(_return ? _return->getPath(true) : ""); }
     virtual void setValue(const char *);
 
     // listener method
     virtual void valueChanged(SGPropertyNode *node);
 
 private:
+    struct NodeData {
+        NodeData() : listener(0) {}
+        ~NodeData() {
+            if (listener)
+                node->removeChangeListener(listener);
+        }
+        void setListener(SGPropertyChangeListener *l) {
+            node->addChangeListener(listener = l);
+        }
+        SGPropertyNode_ptr node;
+        SGPropertyChangeListener *listener;
+        char **text;
+    };
+
     // update the text string in the puList using the given node and
-    // updating the requested offset. The value of dotFiles is taken
-    // into account before the index is applied, i.e this should be
-    // an index into 'children'
-    void updateTextForEntry(int index);
+    // updating the requested offset.
+    void updateTextForEntry(NodeData&);
     void delete_arrays();
     static void handle_select(puObject *b);
+    static int nodeNameCompare(const void *, const void *);
 
     SGPropertyNode_ptr _curr;
-    SGPropertyNode_ptr _flags;
     SGPropertyNode_ptr _return;
 
     char **_entries;
     int _num_entries;
 
-    SGPropertyNode_ptr *_children;
+    NodeData *_children;
     int _num_children;
 
-    bool dotFiles;      // . and .. pseudo-dirs currently shown?
+    bool _dot_files;      // . and .. pseudo-dirs currently shown?
+    bool _verbose;        // show SGPropertyNode flags
+    std::string _return_path;
 };