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, std::size_t> signal_item_added;
18 sigc::signal<void, std::size_t> signal_item_removed;
19 sigc::signal<void> signal_cleared;
20 sigc::signal<void, std::size_t> signal_refresh_item;
25 virtual ~ListData() = default;
27 virtual std::size_t size() const = 0;
28 virtual std::string get_string(std::size_t) const = 0;
29 void refresh(std::size_t 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(std::size_t 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(std::size_t i) const
60 throw std::out_of_range("ListDataStore::get");
65 std::size_t find(const T &v) const
67 for(std::size_t i=0; i<items.size(); ++i)
70 return std::numeric_limits<std::size_t>::max();
73 using ListData::refresh;
74 void refresh(const T &v) const
76 std::size_t i = find(v);
78 signal_refresh_item.emit(i);
81 void remove(std::size_t 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 std::size_t size() const override { return items.size(); }
100 class BasicListData: public ListDataStore<T>
103 virtual std::string get_string(std::size_t 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 std::string get_string(std::size_t i) const override
120 { return func(this->get(i)); }