]> git.tdb.fi Git - libs/gltk.git/blob - source/list.h
More flexible storage for Lsit and Dropdown items
[libs/gltk.git] / source / list.h
1 #ifndef MSP_GLTK_LIST_H_
2 #define MSP_GLTK_LIST_H_
3
4 #include <sigc++/signal.h>
5 #include "container.h"
6 #include "listdata.h"
7 #include "vslider.h"
8
9 namespace Msp {
10 namespace GLtk {
11
12 /**
13 Shows a list of items, allowing the user to select one.  A slider is included
14 to allow scrolling through a long list.
15 */
16 class List: virtual public Widget, private Container
17 {
18 public:
19         class Loader: public Widget::Loader
20         {
21         public:
22                 Loader(List &);
23         private:
24                 void item(const std::string &);
25         };
26
27 private:
28         /// This exists to make disconnecting signals easier
29         class DataObserver: public sigc::trackable
30         {
31         private:
32                 List &list;
33
34         public:
35                 DataObserver(List &);
36
37                 void item_added(unsigned);
38                 void item_removed(unsigned);
39                 void cleared();
40                 void refresh_strings();
41         };
42
43 public:
44         sigc::signal<void, unsigned> signal_item_selected;
45
46 private:
47         ListData *data;
48         bool own_data;
49         DataObserver *observer;
50         int sel_index;
51         unsigned first;
52         unsigned n_visible;
53         unsigned row_height;
54
55         const Part *items_part;
56
57         VSlider slider;
58
59 public:
60         List();
61         List(ListData &);
62 private:
63         void init();
64 public:
65         virtual ~List();
66
67         virtual const char *get_class() const { return "list"; }
68
69         virtual void autosize();
70         void autosize_rows(unsigned);
71         void autosize_all();
72
73         void set_data(ListData &);
74         ListData &get_data() { return *data; }
75         const ListData &get_data() const { return *data; }
76 private:
77         void items_changed();
78 public:
79
80         void set_selected_index(int);
81         int get_selected_index() const { return sel_index; }
82
83 private:
84         virtual void rebuild_special(const Part &, CachedPart &);
85         virtual void render_special(const Part &, GL::Renderer &) const;
86
87 public:
88         virtual void button_press(int, int, unsigned);
89 private:
90         virtual void on_geometry_change();
91         virtual void on_style_change();
92
93         void reposition_slider();
94         void check_view_range();
95         void slider_value_changed(double);
96 };
97
98 } // namespace GLtk
99 } // namespace Msp
100
101 #endif