#include <algorithm>
#include <limits>
+#include <msp/core/maputils.h>
#include <msp/strings/format.h>
#include "arrangement.h"
#include "container.h"
}
+Layout::Loader::Loader(Layout &l, const WidgetMap &wm):
+ DataFile::ObjectLoader<Layout>(l),
+ wdg_map(wm)
+{
+ add("column_spacing", &Loader::column_spacing);
+ add("margin", &Loader::margin);
+ add("row_spacing", &Loader::row_spacing);
+ add("spacing", &Loader::spacing);
+ add("widget", &Loader::widget);
+}
+
+void Layout::Loader::column_spacing(unsigned s)
+{
+ obj.set_column_spacing(s);
+}
+
+void Layout::Loader::margin()
+{
+ Sides sides;
+ load_sub(sides);
+ obj.set_margin(sides);
+}
+
+void Layout::Loader::spacing(unsigned s)
+{
+ obj.set_spacing(s);
+}
+
+void Layout::Loader::row_spacing(unsigned s)
+{
+ obj.set_row_spacing(s);
+}
+
+void Layout::Loader::widget(const string &n)
+{
+ Widget &wdg = *get_item(wdg_map, n);
+ WidgetLoader ldr(obj, wdg, wdg_map);
+ load_sub_with(ldr);
+}
+
+
+Layout::WidgetLoader::WidgetLoader(Layout &l, Widget &w, const Layout::Loader::WidgetMap &wm):
+ layout(l),
+ widget(w),
+ wdg_map(wm)
+{
+ add("constraint", &WidgetLoader::constraint);
+ add("expand", &WidgetLoader::expand);
+ add("gravity", &WidgetLoader::gravity);
+}
+
+void Layout::WidgetLoader::constraint(ConstraintType type, const string &n)
+{
+ Widget &target = *get_item(wdg_map, n);
+ layout.add_constraint(widget, type, target);
+}
+
+void Layout::WidgetLoader::expand(bool h, bool v)
+{
+ layout.set_expand(widget, h, v);
+}
+
+void Layout::WidgetLoader::gravity(int h, int v)
+{
+ layout.set_gravity(widget, h, v);
+}
+
+
void operator>>(const LexicalConverter &conv, Layout::ConstraintType &ctype)
{
const string &str = conv.get();
COPY_HEIGHT = VERTICAL|SELF_DIM|TARGET_DIM
};
+ class Loader: public DataFile::ObjectLoader<Layout>
+ {
+ public:
+ typedef std::map<std::string, Widget *> WidgetMap;
+
+ private:
+ const WidgetMap &wdg_map;
+
+ public:
+ Loader(Layout &, const WidgetMap &);
+
+ private:
+ void column_spacing(unsigned);
+ void margin();
+ void row_spacing(unsigned);
+ void spacing(unsigned);
+ void widget(const std::string &);
+ };
+
private:
+ class WidgetLoader: public DataFile::Loader
+ {
+ private:
+ Layout &layout;
+ Widget &widget;
+ const Layout::Loader::WidgetMap &wdg_map;
+
+ public:
+ WidgetLoader(Layout &, Widget &, const Layout::Loader::WidgetMap &);
+
+ private:
+ void constraint(ConstraintType, const std::string &);
+ void expand(bool, bool);
+ void gravity(int, int);
+ };
+
struct Slot;
struct Constraint
add("hslider", &Loader::child<HSlider>);
add("indicator", &Loader::child<Indicator>);
add("label", &Loader::child<Label>);
+ add("layout", &Loader::layout);
add("list", &Loader::child<List>);
add("panel", &Loader::panel);
add("row", &Loader::arrangement<Row>);
load_sub_with(ldr);
}
+void Panel::Loader::layout()
+{
+ Layout::Loader ldr(get_layout(), wdg_map);
+ load_sub_with(ldr);
+}
+
void Panel::Loader::panel(const string &n)
{
RefPtr<Panel> p = new Panel();