1 #ifndef MSP_GLTK_LISTDATA_H_
2 #define MSP_GLTK_LISTDATA_H_
6 #include <sigc++/signal.h>
7 #include <msp/strings/lexicalcast.h>
15 sigc::signal<void, unsigned> signal_item_added;
16 sigc::signal<void, unsigned> signal_item_removed;
17 sigc::signal<void> signal_cleared;
18 sigc::signal<void> signal_refresh_strings;
23 virtual ~ListData() { }
25 virtual unsigned size() const = 0;
26 virtual std::string get_string(unsigned) const = 0;
27 void refresh_strings() const { signal_refresh_strings.emit(); }
31 class ListDataStore: public ListData
39 void append(const T &v) { insert(items.size(), v); }
41 void insert(unsigned i, const T & v)
44 throw std::out_of_range("ListDataStore::insert");
46 items.insert(items.begin()+i, v);
47 signal_item_added.emit(i);
50 const T &get(unsigned i) const
53 throw std::out_of_range("ListDataStore::get");
58 int find(const T &v) const
60 for(unsigned i=0; i<items.size(); ++i)
66 void remove(unsigned i)
69 throw std::out_of_range("ListDataStore::remove");
71 items.erase(items.begin()+i);
72 signal_item_removed.emit(i);
78 signal_cleared.emit();
81 virtual unsigned size() const { return items.size(); }
85 class BasicListData: public ListDataStore<T>
88 virtual std::string get_string(unsigned i) const
89 { return lexical_cast<std::string>(this->get(i)); }
93 class FunctionListData: public ListDataStore<T>
96 typedef std::string Func(const T &);
102 FunctionListData(Func f): func(f) { }
104 virtual std::string get_string(unsigned i) const
105 { return func(this->get(i)); }