]> git.tdb.fi Git - libs/gltk.git/blob - source/list.h
Refresh list items one at a time
[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 "label.h"
7 #include "listdata.h"
8 #include "vslider.h"
9
10 namespace Msp {
11 namespace GLtk {
12
13 /**
14 Shows a list of items, allowing the user to select one.  A slider is included
15 to allow scrolling through a long list.
16 */
17 class List: virtual public Widget, private Container
18 {
19 public:
20         class Loader: public DataFile::DerivedObjectLoader<List, Widget::Loader>
21         {
22         public:
23                 Loader(List &);
24         private:
25                 void item(const std::string &);
26         };
27
28 private:
29         /// This exists to make disconnecting signals easier
30         class DataObserver: public sigc::trackable
31         {
32         private:
33                 List &list;
34
35         public:
36                 DataObserver(List &);
37
38                 void item_added(unsigned);
39                 void item_removed(unsigned);
40                 void cleared();
41                 void refresh_item(unsigned);
42         };
43
44 protected:
45         class Item: public Container
46         {
47         public:
48                 virtual const char *get_class() const { return "listitem"; }
49
50         protected:
51                 virtual void autosize_special(const Part &, Geometry &);
52         public:
53                 void set_active(bool);
54
55                 virtual void render_special(const Part &, GL::Renderer &) const;
56         };
57
58 public:
59         class BasicItem: public Item
60         {
61         private:
62                 Label label;
63
64         public:
65                 BasicItem(const std::string &);
66
67         private:
68                 virtual void on_style_change();
69         };
70
71 public:
72         sigc::signal<void, unsigned> signal_item_selected;
73
74 private:
75         ListData *data;
76         bool own_data;
77         DataObserver *observer;
78         int sel_index;
79         unsigned first;
80         unsigned max_scroll;
81         unsigned view_size;
82
83         VSlider slider;
84         std::vector<Item *> items;
85
86 public:
87         List();
88         List(ListData &);
89 private:
90         void init();
91 public:
92         virtual ~List();
93
94         virtual const char *get_class() const { return "list"; }
95
96 private:
97         virtual void autosize_special(const Part &, Geometry &);
98
99 public:
100         void set_data(ListData &);
101         ListData &get_data() { return *data; }
102         const ListData &get_data() const { return *data; }
103 private:
104         void items_changed();
105 protected:
106         virtual Item *create_item(unsigned);
107
108 public:
109         void set_view_size(unsigned);
110         void set_view_all();
111
112         void set_selected_index(int);
113         int get_selected_index() const { return sel_index; }
114
115 private:
116         virtual void render_special(const Part &, GL::Renderer &) const;
117
118 public:
119         virtual void button_press(int, int, unsigned);
120 private:
121         virtual void on_geometry_change();
122         virtual void on_style_change();
123
124         void reposition_slider();
125         void reposition_items();
126         void check_view_range();
127         void slider_value_changed(double);
128 };
129
130 } // namespace GLtk
131 } // namespace Msp
132
133 #endif