]> git.tdb.fi Git - libs/gltk.git/blob - source/container.h
61502e44177c2d963f617da91fc1e4e5d86a570d
[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 "mspgltk_api.h"
8 #include "widget.h"
9
10 namespace Msp {
11 namespace GLtk {
12
13 class MSPGLTK_API hierarchy_error: public std::logic_error
14 {
15 public:
16         hierarchy_error(const std::string &);
17         virtual ~hierarchy_error() throw() { }
18 };
19
20
21 class MSPGLTK_API Container: virtual public Widget
22 {
23 protected:
24         struct Child: public sigc::trackable
25         {
26                 Container &container;
27                 Widget *widget = 0;
28                 Time::TimeDelta time_since_animate;
29
30                 Child(Container &, Widget *);
31                 virtual ~Child();
32
33                 void visibility_changed(bool);
34                 void request_focus();
35                 void grab_pointer();
36                 void ungrab_pointer();
37                 void request_animation(const Time::TimeDelta &);
38                 void rebuild_needed();
39         };
40
41         std::list<Child *> children;
42         Widget *click_focus = 0;
43         unsigned click_button = 0;
44         Widget *pointer_focus = 0;
45         bool pointer_grabbed = false;
46         Widget *input_focus = 0;
47         Widget *saved_input_focus = 0;
48         Widget *touch_focus = 0;
49         bool children_rebuild_needed = false;
50
51         Container() = default;
52 public:
53         virtual ~Container();
54
55         void add(Widget &);
56         void remove(Widget &);
57 protected:
58         virtual Child *create_child(Widget *);
59         Geometry determine_child_geometry(const Widget &, const Part &) const;
60         void autosize_child(const Widget &, const Part &, Geometry &) const;
61         void reposition_child(Widget &, const Part &) const;
62 public:
63         std::list<Widget *> get_children() const;
64         Widget *get_child_at(int, int) const;
65         Widget *get_descendant_at(int, int) const;
66         void raise(Widget &);
67
68 protected:
69         void set_pointer_focus(Widget *, bool = false);
70         void set_input_focus(Widget *);
71 public:
72         Widget *get_input_focus() const { return input_focus; }
73         Widget *get_final_input_focus() const;
74
75 private:
76         void check_animation_interval();
77
78 protected:
79         virtual void rebuild_hierarchy();
80
81 public:
82         virtual void button_press(int, int, unsigned);
83         virtual void button_release(int, int, unsigned);
84         virtual void pointer_motion(int, int);
85 private:
86         Widget *get_pointer_target(int, int, bool) const;
87 public:
88         virtual void pointer_leave();
89         virtual void touch_press(int, int, unsigned);
90         virtual void touch_release(int, int, unsigned);
91         virtual void touch_motion(int, int, unsigned);
92         virtual bool key_press(unsigned, unsigned);
93         virtual bool key_release(unsigned, unsigned);
94         virtual bool character(wchar_t);
95         virtual void focus_in();
96         virtual void focus_out();
97         virtual bool navigate(Navigation);
98         virtual void animate(const Time::TimeDelta &);
99 protected:
100         virtual void on_reparent();
101         virtual void on_child_added(Widget &) { }
102         virtual void on_child_removed(Widget &) { }
103         virtual void on_input_focus_changed(Widget *);
104 };
105
106 } // namespace GLtk
107 } // namespace Msp
108
109 #endif