]> git.tdb.fi Git - libs/gltk.git/blob - source/container.h
Add an event handler to allow containers to reach to focus changes
[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                 Time::TimeDelta time_since_animate;
28
29                 Child(Container &, Widget *);
30                 virtual ~Child();
31
32                 void visibility_changed(bool);
33                 void request_focus();
34                 void grab_pointer();
35                 void ungrab_pointer();
36                 void request_animation(const Time::TimeDelta &);
37         };
38
39         std::list<Child *> children;
40         Widget *click_focus;
41         unsigned click_button;
42         Widget *pointer_focus;
43         bool pointer_grabbed;
44         Widget *input_focus;
45         Widget *touch_focus;
46
47         Container();
48 public:
49         virtual ~Container();
50
51         void add(Widget &);
52         void remove(Widget &);
53 protected:
54         virtual Child *create_child(Widget *);
55         Geometry determine_child_geometry(const Widget &, const Part &) const;
56         void autosize_child(const Widget &, const Part &, Geometry &) const;
57         void reposition_child(Widget &, const Part &) const;
58 public:
59         std::list<Widget *> get_children() const;
60         Widget *get_child_at(int, int) const;
61         Widget *get_descendant_at(int, int) const;
62         void raise(Widget &);
63
64 protected:
65         void set_pointer_focus(Widget *);
66         void set_input_focus(Widget *);
67 public:
68         Widget *get_input_focus() const { return input_focus; }
69         Widget *get_final_input_focus() const;
70
71 private:
72         void check_animation_interval();
73
74 public:
75         virtual void button_press(int, int, unsigned);
76         virtual void button_release(int, int, unsigned);
77         virtual void pointer_motion(int, int);
78 private:
79         Widget *get_pointer_target(int, int, bool) const;
80 public:
81         virtual void pointer_leave();
82         virtual void touch_press(int, int, unsigned);
83         virtual void touch_release(int, int, unsigned);
84         virtual void touch_motion(int, int, unsigned);
85         virtual bool key_press(unsigned, unsigned);
86         virtual bool key_release(unsigned, unsigned);
87         virtual bool character(wchar_t);
88         virtual void focus_out();
89         virtual bool navigate(Navigation);
90         virtual void animate(const Time::TimeDelta &);
91 protected:
92         virtual void on_reparent();
93         virtual void on_child_added(Widget &) { }
94         virtual void on_child_removed(Widget &) { }
95         virtual void on_input_focus_changed(Widget *);
96 };
97
98 } // namespace GLtk
99 } // namespace Msp
100
101 #endif