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:
parent
27f9afea7f
commit
ca7ddfae04
5 changed files with 65 additions and 81 deletions
|
@ -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]
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue