From ca7ddfae044d898daf6fec32cdd5d00df74dfa3d Mon Sep 17 00:00:00 2001 From: Mark de Wever Date: Sun, 12 Jul 2009 16:12:48 +0000 Subject: [PATCH] Rewrite the config side for the stacked widget. The widget can now hold different widgets, per stack item. The code side will get a cleanup in the next commit. --- data/gui/default/window/campaign_dialog.cfg | 62 +++++++++++-------- .../window_builder/stacked_widget.cpp | 39 +++--------- .../window_builder/stacked_widget.hpp | 11 +--- src/gui/widgets/stacked_widget.cpp | 22 ++++--- src/gui/widgets/stacked_widget.hpp | 12 ++-- 5 files changed, 65 insertions(+), 81 deletions(-) diff --git a/data/gui/default/window/campaign_dialog.cfg b/data/gui/default/window/campaign_dialog.cfg index e164b98ce7b..1ed3a3cab4c 100644 --- a/data/gui/default/window/campaign_dialog.cfg +++ b/data/gui/default/window/campaign_dialog.cfg @@ -92,47 +92,57 @@ id = "" definition = "default" - [stack_definition] + [stack] - [row] + [layer] - [column] - grow_factor = 1 - horizontal_grow = "true" + [row] - border = "left" - border_size = 3 + [column] + grow_factor = 1 + horizontal_grow = "true" - [image] - definition = "default" - [/image] + border = "left" + border_size = 3 - [/column] + [image] + id = "victory" + definition = "default" - [/row] + label = "misc/laurel.png" + [/image] - [/stack_definition] + [/column] - [stack_data] + [/row] - [row] + [/layer] - [column] - id = "victory" - label = "misc/laurel.png" - [/column] + [layer] - [/row] + [row] - [row] + [column] + grow_factor = 1 + horizontal_grow = "true" - [column] - id = "icon" - [/column] + border = "left" + border_size = 3 - [/row] + [image] + id = "icon" + definition = "default" - [/stack_data] + label = "misc/laurel.png" + [/image] + + [/column] + + [/row] + + [/layer] + + [/stack] [/stacked_widget] diff --git a/src/gui/auxiliary/window_builder/stacked_widget.cpp b/src/gui/auxiliary/window_builder/stacked_widget.cpp index 94230e1fb82..6ecc501898d 100644 --- a/src/gui/auxiliary/window_builder/stacked_widget.cpp +++ b/src/gui/auxiliary/window_builder/stacked_widget.cpp @@ -27,35 +27,14 @@ namespace gui2 { namespace implementation { -tbuilder_stacked_widget::tbuilder_stacked_widget(const config& cfg) : - implementation::tbuilder_control(cfg), - builder(NULL), - data() +tbuilder_stacked_widget::tbuilder_stacked_widget(const config& cfg) + : tbuilder_control(cfg) + , stack() { - const config &stack = cfg.child("stack_definition"); - - VALIDATE(stack, _("No stack defined.")); - builder = new tbuilder_grid(stack); - assert(builder); - - const config &d = cfg.child("stack_data"); - if(!d){ - return; - } - - foreach(const config &row, d.child_range("row")) { - unsigned col = 0; - - foreach(const config &column, row.child_range("column")) { - data.push_back(string_map()); - foreach(const config::attribute &i, column.attribute_range()) { - data.back()[i.first] = i.second; - } - ++col; - } - - VALIDATE(col == builder->cols, _("'stack_data' must have " - "the same number of columns as the 'list_definition'.")); + const config &s = cfg.child("stack"); + VALIDATE(s, _("No stack defined.")); + foreach(const config &layer, s.child_range("layer")) { + stack.push_back(new tbuilder_grid(layer)); } } @@ -65,7 +44,7 @@ twidget* tbuilder_stacked_widget::build() const init_control(widget); - widget->set_item_builder(builder); + widget->set_item_builder(stack); DBG_GUI_G << "Window builder: placed stacked widget '" << id << "' with defintion '" @@ -78,7 +57,7 @@ twidget* tbuilder_stacked_widget::build() const widget->init_grid(conf->grid); - widget->finalize(data); + widget->finalize(); return widget; } diff --git a/src/gui/auxiliary/window_builder/stacked_widget.hpp b/src/gui/auxiliary/window_builder/stacked_widget.hpp index 8ac91746aec..fab72a4af8f 100644 --- a/src/gui/auxiliary/window_builder/stacked_widget.hpp +++ b/src/gui/auxiliary/window_builder/stacked_widget.hpp @@ -33,15 +33,8 @@ struct tbuilder_stacked_widget twidget* build () const; - tbuilder_grid_ptr builder; - - /** - * Multi page data. - * - * Contains a vector with the data to set in every cell, it's used to - * serialize the data in the config, so the config is no longer required. - */ - std::vector data; + /** The builders for all layers of the stack .*/ + std::vector stack; }; } // namespace implementation diff --git a/src/gui/widgets/stacked_widget.cpp b/src/gui/widgets/stacked_widget.cpp index e25376c2325..ca9d41f1b40 100644 --- a/src/gui/widgets/stacked_widget.cpp +++ b/src/gui/widgets/stacked_widget.cpp @@ -16,6 +16,7 @@ #include "gui/widgets/stacked_widget.hpp" +#include "foreach.hpp" #include "gui/widgets/generator.hpp" namespace gui2 { @@ -23,7 +24,7 @@ namespace gui2 { tstacked_widget::tstacked_widget() : tcontainer_(1) , generator_(NULL) - , item_builder_(NULL) + , item_builder_() { generator_ = tgenerator_::build( false, false, tgenerator_::independant, false); @@ -32,16 +33,20 @@ tstacked_widget::tstacked_widget() void tstacked_widget::add_item(const string_map& item) { assert(generator_); - generator_->create_item(-1, item_builder_, item, NULL); - generator_->select_item(get_item_count() - 1, true); + foreach(const tbuilder_grid_const_ptr& builder, item_builder_) { + generator_->create_item(-1, builder, item, NULL); + generator_->select_item(get_item_count() - 1, true); + } } void tstacked_widget::add_item( const std::map& data) { assert(generator_); - generator_->create_item(-1, item_builder_, data, NULL); - generator_->select_item(get_item_count() - 1, true); + foreach(const tbuilder_grid_const_ptr& builder, item_builder_) { + generator_->create_item(-1, builder, data, NULL); + generator_->select_item(get_item_count() - 1, true); + } } unsigned tstacked_widget::get_item_count() const @@ -83,11 +88,12 @@ void swap_grid(tgrid* grid, } // namespace -void tstacked_widget::finalize( - const std::vector& item_data) +void tstacked_widget::finalize() { assert(generator_); - generator_->create_items(-1, item_builder_, item_data, NULL); + foreach(const tbuilder_grid_const_ptr& builder, item_builder_) { + generator_->create_item(-1, builder, string_map(), NULL); + } swap_grid(NULL, &grid(), generator_, "_content_grid"); for(size_t i = 0; i < get_item_count(); ++i) { diff --git a/src/gui/widgets/stacked_widget.hpp b/src/gui/widgets/stacked_widget.hpp index 96be39be8cf..790ff12ff23 100644 --- a/src/gui/widgets/stacked_widget.hpp +++ b/src/gui/widgets/stacked_widget.hpp @@ -78,17 +78,13 @@ public: /***** ***** ***** setters / getters for members ***** ****** *****/ - void set_item_builder(tbuilder_grid_ptr item_builder) + void set_item_builder(std::vector item_builder) { item_builder_ = item_builder; } private: - /** - * Finishes the building initialization of the widget. - * - * @param item_data The initial data to fill the widget with. - */ - void finalize(const std::vector& item_data); + /** Finishes the building initialization of the widget. */ + void finalize(); /** * Contains a pointer to the generator. @@ -98,7 +94,7 @@ private: tgenerator_* generator_; /** Contains the builder for the new items. */ - tbuilder_grid_const_ptr item_builder_; + std::vector item_builder_; /** Inherited from tcontrol. */ const std::string& get_control_type() const