From 8eeb6ee5d40c21150839e24996cc3e9ef308374d Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 16 Jun 2013 22:33:52 +0300 Subject: [PATCH] Allow loading generic layout properties from datafiles --- source/layout.cpp | 69 +++++++++++++++++++++++++++++++++++++++++++++++ source/layout.h | 35 ++++++++++++++++++++++++ source/panel.cpp | 7 +++++ source/panel.h | 1 + 4 files changed, 112 insertions(+) diff --git a/source/layout.cpp b/source/layout.cpp index 917d47a..c616ff6 100644 --- a/source/layout.cpp +++ b/source/layout.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include "arrangement.h" #include "container.h" @@ -481,6 +482,74 @@ void Layout::Slot::visibility_changed(bool v) } +Layout::Loader::Loader(Layout &l, const WidgetMap &wm): + DataFile::ObjectLoader(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(); diff --git a/source/layout.h b/source/layout.h index 2de4013..b8c4edd 100644 --- a/source/layout.h +++ b/source/layout.h @@ -86,7 +86,42 @@ public: COPY_HEIGHT = VERTICAL|SELF_DIM|TARGET_DIM }; + class Loader: public DataFile::ObjectLoader + { + public: + typedef std::map 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 diff --git a/source/panel.cpp b/source/panel.cpp index c90c83b..8c5dd38 100644 --- a/source/panel.cpp +++ b/source/panel.cpp @@ -95,6 +95,7 @@ Panel::Loader::Loader(Panel &p, map &m): add("hslider", &Loader::child); add("indicator", &Loader::child); add("label", &Loader::child