X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcontainer.h;h=61502e44177c2d963f617da91fc1e4e5d86a570d;hb=9f38197854e699a6093a906ab43f4238f3cd2388;hp=3117236daa7463d80961604732de717c778e59f8;hpb=2b3940dd34611a6f669278de9a5146b6e85f6119;p=libs%2Fgltk.git diff --git a/source/container.h b/source/container.h index 3117236..61502e4 100644 --- a/source/container.h +++ b/source/container.h @@ -4,12 +4,13 @@ #include #include #include +#include "mspgltk_api.h" #include "widget.h" namespace Msp { namespace GLtk { -class hierarchy_error: public std::logic_error +class MSPGLTK_API hierarchy_error: public std::logic_error { public: hierarchy_error(const std::string &); @@ -17,13 +18,13 @@ public: }; -class Container: virtual public Widget +class MSPGLTK_API Container: virtual public Widget { protected: struct Child: public sigc::trackable { Container &container; - Widget *widget; + Widget *widget = 0; Time::TimeDelta time_since_animate; Child(Container &, Widget *); @@ -34,17 +35,20 @@ protected: void grab_pointer(); void ungrab_pointer(); void request_animation(const Time::TimeDelta &); + void rebuild_needed(); }; std::list children; - Widget *click_focus; - unsigned click_button; - Widget *pointer_focus; - bool pointer_grabbed; - Widget *input_focus; - Widget *touch_focus; - - Container(); + Widget *click_focus = 0; + unsigned click_button = 0; + Widget *pointer_focus = 0; + bool pointer_grabbed = false; + Widget *input_focus = 0; + Widget *saved_input_focus = 0; + Widget *touch_focus = 0; + bool children_rebuild_needed = false; + + Container() = default; public: virtual ~Container(); @@ -62,7 +66,7 @@ public: void raise(Widget &); protected: - void set_pointer_focus(Widget *); + void set_pointer_focus(Widget *, bool = false); void set_input_focus(Widget *); public: Widget *get_input_focus() const { return input_focus; } @@ -71,6 +75,9 @@ public: private: void check_animation_interval(); +protected: + virtual void rebuild_hierarchy(); + public: virtual void button_press(int, int, unsigned); virtual void button_release(int, int, unsigned); @@ -85,6 +92,7 @@ public: virtual bool key_press(unsigned, unsigned); virtual bool key_release(unsigned, unsigned); virtual bool character(wchar_t); + virtual void focus_in(); virtual void focus_out(); virtual bool navigate(Navigation); virtual void animate(const Time::TimeDelta &);