1 #ifndef MSP_GLTK_LIST_H_
2 #define MSP_GLTK_LIST_H_
6 #include <sigc++/signal.h>
16 Thrown if a list's item type is incompatible with its data.
18 class incompatible_data: public std::logic_error
21 incompatible_data(const std::type_info &);
22 virtual ~incompatible_data() throw() { }
27 Shows a list of items, allowing the user to select one. A slider is included
28 to allow scrolling through a long list.
30 class List: virtual public Widget, private Container
39 class Loader: public DataFile::DerivedObjectLoader<List, Widget::Loader>
44 void item(const std::string &);
48 /// This exists to make disconnecting signals easier
49 class DataObserver: public sigc::trackable
57 void item_added(unsigned);
58 void item_removed(unsigned);
60 void refresh_item(unsigned);
64 class Item: public Container
67 virtual const char *get_class() const { return "listitem"; }
70 virtual void autosize_special(const Part &, Geometry &) const;
72 void set_active(bool);
74 virtual void render_special(const Part &, GL::Renderer &) const;
77 class SimpleItem: public Item
80 virtual void on_style_change();
83 class MultiColumnItem: public Item
86 virtual void check_widths(std::vector<unsigned> &) const;
87 virtual void set_widths(const std::vector<unsigned> &);
90 virtual void on_style_change();
94 class BasicItem: public SimpleItem
100 BasicItem(const std::string &);
108 virtual ~ItemFactory() { }
110 virtual void set_data(const ListData &) = 0;
111 virtual Item *create_item(unsigned) const = 0;
115 class TypedItemFactory: public ItemFactory
118 typedef typename I::ValueType ValueType;
120 const ListDataStore<ValueType> *data;
123 TypedItemFactory(const ListData &d)
126 virtual void set_data(const ListData &d)
128 if(const ListDataStore<ValueType> *ds = dynamic_cast<const ListDataStore<ValueType> *>(&d))
131 throw incompatible_data(typeid(ValueType));
134 virtual Item *create_item(unsigned i) const
136 return new I(data->get(i));
145 Row(unsigned f): first(f), height(0) { }
149 sigc::signal<void, unsigned> signal_item_selected;
150 sigc::signal<void> signal_selection_cleared;
155 DataObserver *observer;
156 ItemFactory *item_factory;
163 unsigned view_columns;
164 const Part *items_part;
165 bool ignore_slider_change;
171 std::vector<Item *> items;
172 std::vector<Row> rows;
182 virtual const char *get_class() const { return "list"; }
185 virtual void autosize_special(const Part &, Geometry &) const;
188 void set_data(ListData &);
189 ListData &get_data() { return *data; }
190 const ListData &get_data() const { return *data; }
192 void items_changed();
198 ItemFactory *f = new TypedItemFactory<I>(*data);
203 Item *create_item(unsigned);
206 void set_view_mode(ViewMode);
207 void set_view_size(unsigned);
208 void set_view_size(unsigned, unsigned);
211 void set_selected_index(int);
212 int get_selected_index() const { return sel_index; }
214 void set_selected_item(Widget *);
216 virtual void rebuild_special(const Part &);
217 virtual void render_special(const Part &, GL::Renderer &) const;
220 virtual bool key_press(unsigned, unsigned);
221 virtual void button_press(int, int, unsigned);
222 virtual void touch_press(int, int, unsigned);
223 virtual void touch_release(int, int, unsigned);
224 virtual void touch_motion(int, int, unsigned);
225 virtual void focus_in();
226 virtual bool navigate(Navigation);
228 virtual void on_style_change();
230 void move_focus(Navigation, bool);
231 void set_focus_index(int);
233 void item_autosize_changed(Item *);
234 void reposition_items(bool);
235 unsigned last_to_first_row(unsigned) const;
236 unsigned item_index_to_row(unsigned) const;
237 void check_view_range();
238 void scroll_to_focus();
239 void slider_value_changed(double);
240 static void adjust_index(int &, int, int);
243 void operator>>(const LexicalConverter &, List::ViewMode &);