1 #ifndef MSP_GLTK_PANEL_H_
2 #define MSP_GLTK_PANEL_H_
4 #include <msp/core/typeregistry.h>
7 #include "mspgltk_api.h"
13 Panels are containers for other widgets. Panel styles should have a special
14 part "children" to render the child widgets. All properties of this part are
17 class MSPGLTK_API Panel: public Container
20 class Loader: public DataFile::DerivedObjectLoader<Panel, Widget::Loader>
23 typedef std::map<std::string, Widget *> WidgetMap;
29 void operator()(const std::string &, Loader &) const;
36 Loader(Panel &, WidgetMap &);
40 Widget &get_last_widget();
44 void child(const std::string &);
45 void constraint(Layout::ConstraintType, const std::string &);
46 void expand(bool, bool);
48 void gravity(int, int);
49 void grid(std::size_t);
59 class ArrangedLoader: public DataFile::Loader
62 typename T::Loader arr_loader;
65 ArrangedLoader(Loader &, T &);
69 std::vector<Widget *> nav_order;
70 Layout *layout = nullptr;
72 static TypeRegistry<Loader::AddChildType, Loader &> widget_registry;
73 static bool widget_registry_init_done;
76 Panel &operator=(const Panel &);
82 static void register_child_type(const std::string &);
84 const char *get_class() const override { return "panel"; }
86 void set_layout(Layout *);
87 Layout *get_layout() { return layout; }
90 void autosize_special(const Part &, Geometry &) const override;
91 void render_special(const Part &, GL::Renderer &) const override;
94 bool navigate(Navigation) override;
96 Widget *find_next_child(int, int, int, int, int) const;
97 static int compute_delta(int, int, int, int, int);
99 void on_size_change() override;
100 void on_child_added(Widget &) override;
101 void on_child_removed(Widget &) override;
106 void Panel::register_child_type(const std::string &name)
108 widget_registry.register_type<T>(name);
113 void Panel::Loader::child(const std::string &n)
116 wdg_map[n] = last_widget;
120 void Panel::Loader::unnamed_child()
122 RefPtr<T> chl = new T();
125 last_widget = chl.release();
130 void Panel::Loader::AddChildType<T>::operator()(const std::string &kwd, Loader &ldr) const
132 ldr.add(kwd, &Loader::child<T>);
133 ldr.add(kwd, &Loader::unnamed_child<T>);