X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcontainer.h;h=a80cc4e214551cda4348ee10a2986024b030684c;hb=878faa0c9283ee1e6e5e67b6ea1324cc52385742;hp=0384521d4c8657a9a6282618b90f7b6de7dafa38;hpb=91997dd3189b93a67179822ec2fed5f2a7bddb74;p=libs%2Fgltk.git diff --git a/source/container.h b/source/container.h index 0384521..a80cc4e 100644 --- a/source/container.h +++ b/source/container.h @@ -1,20 +1,22 @@ -/* $Id$ - -This file is part of libmspgltk -Copyright © 2009 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - #ifndef MSP_GLTK_CONTAINER_H_ #define MSP_GLTK_CONTAINER_H_ #include +#include #include #include "widget.h" namespace Msp { namespace GLtk { +class hierarchy_error: public std::logic_error +{ +public: + hierarchy_error(const std::string &); + virtual ~hierarchy_error() throw() { } +}; + + class Container: virtual public Widget { protected: @@ -22,16 +24,28 @@ protected: { Container &container; Widget *widget; + Time::TimeDelta time_since_animate; Child(Container &, Widget *); virtual ~Child(); void visibility_changed(bool); + void request_focus(); + 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 *saved_input_focus; + Widget *touch_focus; + bool children_rebuild_needed; Container(); public: @@ -39,17 +53,53 @@ public: void add(Widget &); void remove(Widget &); +protected: + virtual Child *create_child(Widget *); + Geometry determine_child_geometry(const Widget &, const Part &) const; + void autosize_child(const Widget &, const Part &, Geometry &) const; + void reposition_child(Widget &, const Part &) const; +public: std::list get_children() const; - Widget *get_child_at(int, int); - Widget *get_descendant_at(int, int); + Widget *get_child_at(int, int) const; + Widget *get_descendant_at(int, int) const; + void raise(Widget &); +protected: + void set_pointer_focus(Widget *, bool = false); + void set_input_focus(Widget *); +public: + Widget *get_input_focus() const { return input_focus; } + Widget *get_final_input_focus() const; + +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); virtual void pointer_motion(int, int); +private: + Widget *get_pointer_target(int, int, bool) const; +public: virtual void pointer_leave(); + virtual void touch_press(int, int, unsigned); + virtual void touch_release(int, int, unsigned); + virtual void touch_motion(int, int, unsigned); + 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 &); protected: - virtual Child *create_child(Widget *); virtual void on_reparent(); + virtual void on_child_added(Widget &) { } + virtual void on_child_removed(Widget &) { } + virtual void on_input_focus_changed(Widget *); }; } // namespace GLtk