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.
This commit is contained in:
Mark de Wever 2009-07-12 16:12:48 +00:00
parent 27f9afea7f
commit ca7ddfae04
5 changed files with 65 additions and 81 deletions

View file

@ -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]

View file

@ -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;
}

View file

@ -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<string_map> data;
/** The builders for all layers of the stack .*/
std::vector<tbuilder_grid_const_ptr> stack;
};
} // namespace implementation

View file

@ -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<std::string /* widget id */, string_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<string_map>& 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) {

View file

@ -78,17 +78,13 @@ public:
/***** ***** ***** setters / getters for members ***** ****** *****/
void set_item_builder(tbuilder_grid_ptr item_builder)
void set_item_builder(std::vector<tbuilder_grid_const_ptr> 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<string_map>& 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<tbuilder_grid_const_ptr> item_builder_;
/** Inherited from tcontrol. */
const std::string& get_control_type() const