]> git.tdb.fi Git - libs/gltk.git/blob - source/container.h
Improve pointer grab handling
[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 *saved_input_focus;
46         Widget *touch_focus;
47
48         Container();
49 public:
50         virtual ~Container();
51
52         void add(Widget &);
53         void remove(Widget &);
54 protected:
55         virtual Child *create_child(Widget *);
56         Geometry determine_child_geometry(const Widget &, const Part &) const;
57         void autosize_child(const Widget &, const Part &, Geometry &) const;
58         void reposition_child(Widget &, const Part &) const;
59 public:
60         std::list<Widget *> get_children() const;
61         Widget *get_child_at(int, int) const;
62         Widget *get_descendant_at(int, int) const;
63         void raise(Widget &);
64
65 protected:
66         void set_pointer_focus(Widget *, bool = false);
67         void set_input_focus(Widget *);
68 public:
69         Widget *get_input_focus() const { return input_focus; }
70         Widget *get_final_input_focus() const;
71
72 private:
73         void check_animation_interval();
74
75 public:
76         virtual void button_press(int, int, unsigned);
77         virtual void button_release(int, int, unsigned);
78         virtual void pointer_motion(int, int);
79 private:
80         Widget *get_pointer_target(int, int, bool) const;
81 public:
82         virtual void pointer_leave();
83         virtual void touch_press(int, int, unsigned);
84         virtual void touch_release(int, int, unsigned);
85         virtual void touch_motion(int, int, unsigned);
86         virtual bool key_press(unsigned, unsigned);
87         virtual bool key_release(unsigned, unsigned);
88         virtual bool character(wchar_t);
89         virtual void focus_in();
90         virtual void focus_out();
91         virtual bool navigate(Navigation);
92         virtual void animate(const Time::TimeDelta &);
93 protected:
94         virtual void on_reparent();
95         virtual void on_child_added(Widget &) { }
96         virtual void on_child_removed(Widget &) { }
97         virtual void on_input_focus_changed(Widget *);
98 };
99
100 } // namespace GLtk
101 } // namespace Msp
102
103 #endif