]> git.tdb.fi Git - libs/gltk.git/blobdiff - source/list.h
More flexible storage for Lsit and Dropdown items
[libs/gltk.git] / source / list.h
index 1c7a65dc161e0eae62011cbad1a50a14b06014d7..1ecd854c26e048ddd9a10ba6178d2752e5f2b494 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <sigc++/signal.h>
 #include "container.h"
+#include "listdata.h"
 #include "vslider.h"
 
 namespace Msp {
@@ -23,10 +24,29 @@ public:
                void item(const std::string &);
        };
 
-       sigc::signal<void, unsigned, const std::string &> signal_item_selected;
+private:
+       /// This exists to make disconnecting signals easier
+       class DataObserver: public sigc::trackable
+       {
+       private:
+               List &list;
+
+       public:
+               DataObserver(List &);
+
+               void item_added(unsigned);
+               void item_removed(unsigned);
+               void cleared();
+               void refresh_strings();
+       };
+
+public:
+       sigc::signal<void, unsigned> signal_item_selected;
 
 private:
-       std::vector<std::string> items;
+       ListData *data;
+       bool own_data;
+       DataObserver *observer;
        int sel_index;
        unsigned first;
        unsigned n_visible;
@@ -38,6 +58,11 @@ private:
 
 public:
        List();
+       List(ListData &);
+private:
+       void init();
+public:
+       virtual ~List();
 
        virtual const char *get_class() const { return "list"; }
 
@@ -45,17 +70,14 @@ public:
        void autosize_rows(unsigned);
        void autosize_all();
 
-       void append(const std::string &);
-       void insert(unsigned, const std::string &);
-       void remove(unsigned);
-       void clear();
+       void set_data(ListData &);
+       ListData &get_data() { return *data; }
+       const ListData &get_data() const { return *data; }
 private:
        void items_changed();
 public:
-       unsigned get_n_items() const { return items.size(); }
 
        void set_selected_index(int);
-       const std::string &get_selected() const;
        int get_selected_index() const { return sel_index; }
 
 private: