#ifndef MSP_GLTK_PANEL_H_
#define MSP_GLTK_PANEL_H_
-#include <msp/datafile/loadabletyperegistry.h>
+#include <memory>
+#include <msp/core/typeregistry.h>
#include "container.h"
#include "layout.h"
+#include "mspgltk_api.h"
namespace Msp {
namespace GLtk {
part "children" to render the child widgets. All properties of this part are
ignored.
*/
-class Panel: public Container
+class MSPGLTK_API Panel: public Container
{
public:
class Loader: public DataFile::DerivedObjectLoader<Panel, Widget::Loader>
template<typename T>
struct AddChildType
{
- static void add(Loader &, const std::string &);
+ void operator()(const std::string &, Loader &) const;
};
WidgetMap &wdg_map;
Loader(Panel &, WidgetMap &);
private:
- Layout &get_layout();
Widget &get_last_widget();
template<typename T>
void arrangement();
void expand(bool, bool);
void ghost(bool);
void gravity(int, int);
- void grid(unsigned);
+ void grid(std::size_t);
void layout();
template<typename T>
void unnamed_child();
protected:
std::vector<Widget *> nav_order;
- Layout *layout;
+ std::unique_ptr<Layout> layout;
- static DataFile::LoadableTypeRegistry<Loader, Loader::AddChildType> widget_registry;
+ static TypeRegistry<Loader::AddChildType, Loader &> 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"; }
+ const char *get_class() const override { return "panel"; }
- void set_layout(Layout *);
- Layout *get_layout() { return layout; }
+ Layout &get_or_create_layout();
protected:
- virtual void autosize_special(const Part &, Geometry &) const;
- virtual void render_special(const Part &, GL::Renderer &) const;
+ void autosize_special(const Part &, Geometry &) const override;
+ void render_special(const Part &, GL::Renderer &) const override;
public:
- virtual bool navigate(Navigation);
+ bool navigate(Navigation) override;
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 &);
+ void on_size_change() override;
+ void on_child_added(Widget &) override;
+ void on_child_removed(Widget &) override;
};
template<typename T>
void Panel::Loader::unnamed_child()
{
- RefPtr<T> chl = new T();
+ std::unique_ptr<T> chl = std::make_unique<T>();
load_sub(*chl);
- obj.add(*chl.get());
- last_widget = chl.release();
+ Widget *wdg = chl.get();
+ obj.add(move(chl));
+ last_widget = wdg;
}
template<typename T>
-void Panel::Loader::AddChildType<T>::add(Loader &ldr, const std::string &kwd)
+void Panel::Loader::AddChildType<T>::operator()(const std::string &kwd, Loader &ldr) const
{
ldr.add(kwd, &Loader::child<T>);
ldr.add(kwd, &Loader::unnamed_child<T>);