]> git.tdb.fi Git - libs/gltk.git/blob - source/container.h
Rudimentary touchscreen support
[libs/gltk.git] / source / container.h
1 #ifndef MSP_GLTK_CONTAINER_H_
2 #define MSP_GLTK_CONTAINER_H_
3
4 #include <list>
5 #include <stdexcept>
6 #include <sigc++/trackable.h>
7 #include "widget.h"
8
9 namespace Msp {
10 namespace GLtk {
11
12 class hierarchy_error: public std::logic_error
13 {
14 public:
15         hierarchy_error(const std::string &);
16         virtual ~hierarchy_error() throw() { }
17 };
18
19
20 class Container: virtual public Widget
21 {
22 protected:
23         struct Child: public sigc::trackable
24         {
25                 Container &container;
26                 Widget *widget;
27
28                 Child(Container &, Widget *);
29                 virtual ~Child();
30
31                 void visibility_changed(bool);
32                 void request_focus();
33                 void grab_pointer();
34                 void ungrab_pointer();
35         };
36
37         std::list<Child *> children;
38         Widget *click_focus;
39         unsigned click_button;
40         Widget *pointer_focus;
41         bool pointer_grabbed;
42         Widget *input_focus;
43         Widget *touch_focus;
44
45         Container();
46 public:
47         virtual ~Container();
48
49         void add(Widget &);
50         void remove(Widget &);
51 protected:
52         virtual Child *create_child(Widget *);
53         Geometry determine_child_geometry(const Widget &, const Part &) const;
54         void autosize_child(const Widget &, const Part &, Geometry &) const;
55         void reposition_child(Widget &, const Part &) const;
56 public:
57         std::list<Widget *> get_children() const;
58         Widget *get_child_at(int, int) const;
59         Widget *get_descendant_at(int, int) const;
60         void raise(Widget &);
61
62 protected:
63         void set_pointer_focus(Widget *);
64         void set_input_focus(Widget *);
65 public:
66         Widget *get_input_focus() const { return input_focus; }
67         Widget *get_final_input_focus() const;
68
69         virtual void button_press(int, int, unsigned);
70         virtual void button_release(int, int, unsigned);
71         virtual void pointer_motion(int, int);
72 private:
73         Widget *get_pointer_target(int, int, bool) const;
74 public:
75         virtual void pointer_leave();
76         virtual void key_press(unsigned, unsigned);
77         virtual void key_release(unsigned, unsigned);
78         virtual void touch_press(int, int, unsigned);
79         virtual void touch_release(int, int, unsigned);
80         virtual void touch_motion(int, int, unsigned);
81         virtual void character(wchar_t);
82         virtual void focus_out();
83 protected:
84         virtual void on_reparent();
85         virtual void on_child_added(Widget &) { }
86         virtual void on_child_removed(Widget &) { }
87 };
88
89 } // namespace GLtk
90 } // namespace Msp
91
92 #endif