1 #ifndef MSP_GLTK_LISTDATA_H_
2 #define MSP_GLTK_LISTDATA_H_
7 #include <sigc++/signal.h>
8 #include <msp/strings/lexicalcast.h>
9 #include "mspgltk_api.h"
14 class MSPGLTK_API ListData
17 sigc::signal<void, unsigned> signal_item_added;
18 sigc::signal<void, unsigned> signal_item_removed;
19 sigc::signal<void> signal_cleared;
20 sigc::signal<void, unsigned> signal_refresh_item;
25 virtual ~ListData() = default;
27 virtual unsigned size() const = 0;
28 virtual std::string get_string(unsigned) const = 0;
29 void refresh(unsigned i) const
32 throw std::out_of_range("ListData::refresh");
33 signal_refresh_item.emit(i);
38 class ListDataStore: public ListData
43 ListDataStore() = default;
46 void append(const T &v) { insert(items.size(), v); }
48 void insert(unsigned i, const T &v)
51 throw std::out_of_range("ListDataStore::insert");
53 items.insert(items.begin()+i, v);
54 signal_item_added.emit(i);
57 const T &get(unsigned i) const
60 throw std::out_of_range("ListDataStore::get");
65 int find(const T &v) const
67 for(unsigned i=0; i<items.size(); ++i)
73 using ListData::refresh;
74 void refresh(const T &v) const
78 signal_refresh_item.emit(i);
81 void remove(unsigned i)
84 throw std::out_of_range("ListDataStore::remove");
86 items.erase(items.begin()+i);
87 signal_item_removed.emit(i);
93 signal_cleared.emit();
96 virtual unsigned size() const { return items.size(); }
100 class BasicListData: public ListDataStore<T>
103 virtual std::string get_string(unsigned i) const
104 { return lexical_cast<std::string>(this->get(i)); }
108 class FunctionListData: public ListDataStore<T>
111 typedef std::string Func(const T &);
117 FunctionListData(Func f): func(f) { }
119 virtual std::string get_string(unsigned i) const
120 { return func(this->get(i)); }