]> git.tdb.fi Git - libs/gltk.git/blob - source/container.h
Refactor child positioning logic
[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
44         Container();
45 public:
46         virtual ~Container();
47
48         void add(Widget &);
49         void remove(Widget &);
50 protected:
51         virtual Child *create_child(Widget *);
52         Geometry determine_child_geometry(const Widget &, const Part &) const;
53         void autosize_child(const Widget &, const Part &, Geometry &) const;
54         void reposition_child(Widget &, const Part &) const;
55 public:
56         std::list<Widget *> get_children() const;
57         Widget *get_child_at(int, int);
58         Widget *get_descendant_at(int, int);
59         void raise(Widget &);
60
61 protected:
62         void set_pointer_focus(Widget *);
63         void set_input_focus(Widget *);
64 public:
65         Widget *get_input_focus() const { return input_focus; }
66         Widget *get_final_input_focus() const;
67
68         virtual void button_press(int, int, unsigned);
69         virtual void button_release(int, int, unsigned);
70         virtual void pointer_motion(int, int);
71 private:
72         Widget *get_pointer_target(int, int);
73 public:
74         virtual void pointer_leave();
75         virtual void key_press(unsigned, unsigned);
76         virtual void key_release(unsigned, unsigned);
77         virtual void character(wchar_t);
78         virtual void focus_out();
79 protected:
80         virtual void on_reparent();
81         virtual void on_child_added(Widget &) { }
82         virtual void on_child_removed(Widget &) { }
83 };
84
85 } // namespace GLtk
86 } // namespace Msp
87
88 #endif