#ifndef MSP_GLTK_CONTAINER_H_
#define MSP_GLTK_CONTAINER_H_
-#include <list>
#include <stdexcept>
+#include <vector>
#include <sigc++/trackable.h>
+#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 &);
- virtual ~hierarchy_error() throw() { }
};
-class Container: virtual public Widget
+class MSPGLTK_API Container: virtual public Widget
{
protected:
struct Child: public sigc::trackable
{
Container &container;
- Widget *widget;
+ Widget *widget = nullptr;
Time::TimeDelta time_since_animate;
Child(Container &, Widget *);
void grab_pointer();
void ungrab_pointer();
void request_animation(const Time::TimeDelta &);
+ void rebuild_needed();
};
- std::list<Child *> children;
- Widget *click_focus;
- unsigned click_button;
- Widget *pointer_focus;
- bool pointer_grabbed;
- Widget *input_focus;
- Widget *touch_focus;
+ std::vector<Child *> children;
+ Widget *click_focus = nullptr;
+ unsigned click_button = 0;
+ Widget *pointer_focus = nullptr;
+ bool pointer_grabbed = false;
+ Widget *input_focus = nullptr;
+ Widget *saved_input_focus = nullptr;
+ Widget *touch_focus = nullptr;
+ bool children_rebuild_needed = false;
- Container();
+ Container() = default;
public:
virtual ~Container();
void autosize_child(const Widget &, const Part &, Geometry &) const;
void reposition_child(Widget &, const Part &) const;
public:
- std::list<Widget *> get_children() const;
- Widget *get_child_at(int, int) const;
- Widget *get_descendant_at(int, int) const;
+ std::vector<Widget *> get_children() const;
+ Widget *find_child_at(int, int) const;
+ Widget *find_descendant_at(int, int) const;
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; }
private:
void check_animation_interval();
+protected:
+ void rebuild_hierarchy() override;
+
public:
- virtual void button_press(int, int, unsigned);
- virtual void button_release(int, int, unsigned);
- virtual void pointer_motion(int, int);
+ void button_press(int, int, unsigned) override;
+ void button_release(int, int, unsigned) override;
+ void pointer_motion(int, int) override;
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_out();
- virtual bool navigate(Navigation);
- virtual void animate(const Time::TimeDelta &);
+ void pointer_leave() override;
+ void touch_press(int, int, unsigned) override;
+ void touch_release(int, int, unsigned) override;
+ void touch_motion(int, int, unsigned) override;
+ bool key_press(unsigned, unsigned) override;
+ bool key_release(unsigned, unsigned) override;
+ bool character(wchar_t) override;
+ void focus_in() override;
+ void focus_out() override;
+ bool navigate(Navigation) override;
+ void animate(const Time::TimeDelta &) override;
protected:
- virtual void on_reparent();
+ void on_reparent() override;
virtual void on_child_added(Widget &) { }
virtual void on_child_removed(Widget &) { }
+ virtual void on_input_focus_changed(Widget *);
};
} // namespace GLtk