#ifndef MSP_GLTK_CONTAINER_H_
#define MSP_GLTK_CONTAINER_H_
-#include <list>
+#include <memory>
#include <stdexcept>
+#include <vector>
#include <sigc++/trackable.h>
#include "mspgltk_api.h"
#include "widget.h"
struct Child: public sigc::trackable
{
Container &container;
+ std::unique_ptr<Widget> own_widget;
Widget *widget = nullptr;
Time::TimeDelta time_since_animate;
Child(Container &, Widget *);
+ Child(Container &, std::unique_ptr<Widget>);
virtual ~Child();
void visibility_changed(bool);
void rebuild_needed();
};
- std::list<Child *> children;
+ std::vector<std::unique_ptr<Child>> children;
Widget *click_focus = nullptr;
unsigned click_button = 0;
Widget *pointer_focus = nullptr;
public:
virtual ~Container();
- void add(Widget &);
+ void add(Widget &w) { add_child(w); }
+ void add(std::unique_ptr<Widget>);
+
+ template<typename T, typename... Args>
+ T &add_new(Args &&...);
+
void remove(Widget &);
protected:
- virtual Child *create_child(Widget *);
+ Child &add_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<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:
virtual void on_input_focus_changed(Widget *);
};
+
+template<typename T, typename... Args>
+T &Container::add_new(Args &&... args)
+{
+ std::unique_ptr<T> wdg = std::make_unique<T>(std::forward<Args>(args)...);
+ T *ptr = wdg.get();
+ add(move(wdg));
+ return *ptr;
+}
+
} // namespace GLtk
} // namespace Msp