#ifndef MSP_GLTK_PANEL_H_
#define MSP_GLTK_PANEL_H_
+#include <msp/datafile/loadabletyperegistry.h>
#include "container.h"
#include "layout.h"
typedef std::map<std::string, Widget *> WidgetMap;
protected:
+ template<typename T>
+ struct AddChildType
+ {
+ static void add(Loader &, const std::string &);
+ };
+
WidgetMap &wdg_map;
Widget *last_widget;
-
+
public:
Loader(Panel &, WidgetMap &);
+
private:
Layout &get_layout();
Widget &get_last_widget();
void gravity(int, int);
void grid(unsigned);
void layout();
- void panel(const std::string &);
+ template<typename T>
+ void unnamed_child();
+
+ friend class Panel;
};
private:
};
protected:
+ std::vector<Widget *> nav_order;
Layout *layout;
+ static DataFile::LoadableTypeRegistry<Loader, Loader::AddChildType> widget_registry;
+ static bool widget_registry_init_done;
+
Panel(const Panel &);
Panel &operator=(const Panel &);
public:
Panel();
virtual ~Panel();
+ template<typename T>
+ static void register_child_type(const std::string &);
+
virtual const char *get_class() const { return "panel"; }
void set_layout(Layout *);
Layout *get_layout() { return layout; }
protected:
- virtual void autosize_special(const Part &, Geometry &);
+ virtual void autosize_special(const Part &, Geometry &) const;
virtual void render_special(const Part &, GL::Renderer &) const;
+public:
+ virtual bool navigate(Navigation);
+protected:
+ Widget *find_next_child(int, int, int, int, int) const;
+ static int compute_delta(int, int, int, int, int);
+
virtual void on_geometry_change();
virtual void on_child_added(Widget &);
virtual void on_child_removed(Widget &);
};
+
+template<typename T>
+void Panel::register_child_type(const std::string &name)
+{
+ widget_registry.register_type<T>(name);
+}
+
+
+template<typename T>
+void Panel::Loader::child(const std::string &n)
+{
+ unnamed_child<T>();
+ wdg_map[n] = last_widget;
+}
+
+template<typename T>
+void Panel::Loader::unnamed_child()
+{
+ RefPtr<T> chl = new T();
+ load_sub(*chl);
+ obj.add(*chl.get());
+ last_widget = chl.release();
+}
+
+
+template<typename T>
+void Panel::Loader::AddChildType<T>::add(Loader &ldr, const std::string &kwd)
+{
+ ldr.add(kwd, &Loader::child<T>);
+ ldr.add(kwd, &Loader::unnamed_child<T>);
+}
+
} // namespace GLtk
} // namespace Msp