X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flist.h;h=1ecd854c26e048ddd9a10ba6178d2752e5f2b494;hb=1d84ac50711ce9d23cb1dafd83158d4ffa938a15;hp=1c7a65dc161e0eae62011cbad1a50a14b06014d7;hpb=371dd319aea53d727a91c64240b942dab983783a;p=libs%2Fgltk.git diff --git a/source/list.h b/source/list.h index 1c7a65d..1ecd854 100644 --- a/source/list.h +++ b/source/list.h @@ -3,6 +3,7 @@ #include #include "container.h" +#include "listdata.h" #include "vslider.h" namespace Msp { @@ -23,10 +24,29 @@ public: void item(const std::string &); }; - sigc::signal 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 signal_item_selected; private: - std::vector 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: