listbox: simplify builder
This commit is contained in:
parent
20242ffc84
commit
c38b856a82
2 changed files with 80 additions and 152 deletions
|
@ -737,16 +737,55 @@ static std::vector<widget_data> parse_list_data(const config& data, const unsign
|
|||
return list_data;
|
||||
}
|
||||
|
||||
builder_listbox::builder_listbox(const config& cfg)
|
||||
builder_listbox_base::builder_listbox_base(const config& cfg)
|
||||
: builder_styled_widget(cfg)
|
||||
, vertical_scrollbar_mode(get_scrollbar_mode(cfg["vertical_scrollbar_mode"]))
|
||||
, horizontal_scrollbar_mode(get_scrollbar_mode(cfg["horizontal_scrollbar_mode"]))
|
||||
, header(nullptr)
|
||||
, footer(nullptr)
|
||||
, list_builder(nullptr)
|
||||
, list_data()
|
||||
, has_minimum_(cfg["has_minimum"].to_bool(true))
|
||||
, has_maximum_(cfg["has_maximum"].to_bool(true))
|
||||
{
|
||||
auto l = cfg.optional_child("list_definition");
|
||||
|
||||
VALIDATE(l, _("No list defined."));
|
||||
|
||||
list_builder = std::make_shared<builder_grid>(*l);
|
||||
assert(list_builder);
|
||||
|
||||
VALIDATE(list_builder->rows == 1, _("A ‘list_definition’ should contain one row."));
|
||||
|
||||
if(cfg.has_child("list_data")) {
|
||||
list_data = parse_list_data(cfg.mandatory_child("list_data"), list_builder->cols);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<widget> builder_listbox_base::generic_build(
|
||||
generator_base::placement placement,
|
||||
const builder_grid_const_ptr& header,
|
||||
const builder_grid_const_ptr& footer,
|
||||
bool allow_selection) const
|
||||
{
|
||||
auto widget = std::make_unique<listbox>(*this, placement, list_builder);
|
||||
|
||||
widget->set_vertical_scrollbar_mode(vertical_scrollbar_mode);
|
||||
widget->set_horizontal_scrollbar_mode(horizontal_scrollbar_mode);
|
||||
|
||||
DBG_GUI_G << "Window builder: placed listbox '" << id << "' with definition '" << definition << "'.";
|
||||
|
||||
const auto conf = widget->cast_config_to<listbox_definition>();
|
||||
assert(conf);
|
||||
|
||||
widget->init_grid(*conf->grid);
|
||||
|
||||
auto generator = generator_base::build(has_minimum_, has_maximum_, placement, allow_selection);
|
||||
widget->finalize(std::move(generator), header, footer, list_data);
|
||||
|
||||
return widget;
|
||||
}
|
||||
|
||||
builder_listbox::builder_listbox(const config& cfg)
|
||||
: builder_listbox_base(cfg)
|
||||
, allow_selection_(cfg["allow_selection"].to_bool(true))
|
||||
{
|
||||
if(auto h = cfg.optional_child("header")) {
|
||||
|
@ -756,125 +795,31 @@ builder_listbox::builder_listbox(const config& cfg)
|
|||
if(auto f = cfg.optional_child("footer")) {
|
||||
footer = std::make_shared<builder_grid>(*f);
|
||||
}
|
||||
|
||||
auto l = cfg.optional_child("list_definition");
|
||||
|
||||
VALIDATE(l, _("No list defined."));
|
||||
|
||||
list_builder = std::make_shared<builder_grid>(*l);
|
||||
assert(list_builder);
|
||||
|
||||
VALIDATE(list_builder->rows == 1, _("A ‘list_definition’ should contain one row."));
|
||||
|
||||
if(cfg.has_child("list_data")) {
|
||||
list_data = parse_list_data(cfg.mandatory_child("list_data"), list_builder->cols);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<widget> builder_listbox::build() const
|
||||
{
|
||||
auto widget = std::make_unique<listbox>(*this, generator_base::vertical_list, list_builder);
|
||||
|
||||
widget->set_vertical_scrollbar_mode(vertical_scrollbar_mode);
|
||||
widget->set_horizontal_scrollbar_mode(horizontal_scrollbar_mode);
|
||||
|
||||
DBG_GUI_G << "Window builder: placed listbox '" << id << "' with definition '" << definition << "'.";
|
||||
|
||||
const auto conf = widget->cast_config_to<listbox_definition>();
|
||||
assert(conf);
|
||||
|
||||
widget->init_grid(*conf->grid);
|
||||
|
||||
auto generator = generator_base::build(has_minimum_, has_maximum_, generator_base::vertical_list, allow_selection_);
|
||||
widget->finalize(std::move(generator), header, footer, list_data);
|
||||
|
||||
return widget;
|
||||
return generic_build(generator_base::vertical_list, header, footer, allow_selection_);
|
||||
}
|
||||
|
||||
builder_horizontal_listbox::builder_horizontal_listbox(const config& cfg)
|
||||
: builder_styled_widget(cfg)
|
||||
, vertical_scrollbar_mode(get_scrollbar_mode(cfg["vertical_scrollbar_mode"]))
|
||||
, horizontal_scrollbar_mode(get_scrollbar_mode(cfg["horizontal_scrollbar_mode"]))
|
||||
, list_builder(nullptr)
|
||||
, list_data()
|
||||
, has_minimum_(cfg["has_minimum"].to_bool(true))
|
||||
, has_maximum_(cfg["has_maximum"].to_bool(true))
|
||||
: builder_listbox_base(cfg)
|
||||
{
|
||||
auto l = cfg.optional_child("list_definition");
|
||||
|
||||
VALIDATE(l, _("No list defined."));
|
||||
|
||||
list_builder = std::make_shared<builder_grid>(*l);
|
||||
assert(list_builder);
|
||||
|
||||
VALIDATE(list_builder->rows == 1, _("A ‘list_definition’ should contain one row."));
|
||||
|
||||
if(cfg.has_child("list_data")) {
|
||||
list_data = parse_list_data(cfg.mandatory_child("list_data"), list_builder->cols);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<widget> builder_horizontal_listbox::build() const
|
||||
{
|
||||
auto widget = std::make_unique<listbox>(*this, generator_base::horizontal_list, list_builder);
|
||||
|
||||
widget->set_vertical_scrollbar_mode(vertical_scrollbar_mode);
|
||||
widget->set_horizontal_scrollbar_mode(horizontal_scrollbar_mode);
|
||||
|
||||
DBG_GUI_G << "Window builder: placed listbox '" << id << "' with definition '" << definition << "'.";
|
||||
|
||||
const auto conf = widget->cast_config_to<listbox_definition>();
|
||||
assert(conf);
|
||||
|
||||
widget->init_grid(*conf->grid);
|
||||
|
||||
auto generator = generator_base::build(has_minimum_, has_maximum_, generator_base::horizontal_list, true);
|
||||
widget->finalize(std::move(generator), nullptr, nullptr, list_data);
|
||||
|
||||
return widget;
|
||||
return generic_build(generator_base::horizontal_list);
|
||||
}
|
||||
|
||||
builder_grid_listbox::builder_grid_listbox(const config& cfg)
|
||||
: builder_styled_widget(cfg)
|
||||
, vertical_scrollbar_mode(get_scrollbar_mode(cfg["vertical_scrollbar_mode"]))
|
||||
, horizontal_scrollbar_mode(get_scrollbar_mode(cfg["horizontal_scrollbar_mode"]))
|
||||
, list_builder(nullptr)
|
||||
, list_data()
|
||||
, has_minimum_(cfg["has_minimum"].to_bool(true))
|
||||
, has_maximum_(cfg["has_maximum"].to_bool(true))
|
||||
: builder_listbox_base(cfg)
|
||||
{
|
||||
auto l = cfg.optional_child("list_definition");
|
||||
|
||||
VALIDATE(l, _("No list defined."));
|
||||
|
||||
list_builder = std::make_shared<builder_grid>(*l);
|
||||
assert(list_builder);
|
||||
|
||||
VALIDATE(list_builder->rows == 1, _("A ‘list_definition’ should contain one row."));
|
||||
|
||||
if(cfg.has_child("list_data")) {
|
||||
list_data = parse_list_data(cfg.mandatory_child("list_data"), list_builder->cols);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<widget> builder_grid_listbox::build() const
|
||||
{
|
||||
auto widget = std::make_unique<listbox>(*this, generator_base::table, list_builder);
|
||||
|
||||
widget->set_vertical_scrollbar_mode(vertical_scrollbar_mode);
|
||||
widget->set_horizontal_scrollbar_mode(horizontal_scrollbar_mode);
|
||||
|
||||
DBG_GUI_G << "Window builder: placed listbox '" << id << "' with definition '" << definition << "'.";
|
||||
|
||||
const auto conf = widget->cast_config_to<listbox_definition>();
|
||||
assert(conf);
|
||||
|
||||
widget->init_grid(*conf->grid);
|
||||
|
||||
auto generator = generator_base::build(has_minimum_, has_maximum_, generator_base::table, true);
|
||||
widget->finalize(std::move(generator), nullptr, nullptr, list_data);
|
||||
|
||||
return widget;
|
||||
return generic_build(generator_base::table);
|
||||
}
|
||||
|
||||
} // namespace implementation
|
||||
|
|
|
@ -33,6 +33,7 @@ namespace gui2
|
|||
class selectable_item;
|
||||
namespace implementation
|
||||
{
|
||||
struct builder_listbox_base;
|
||||
struct builder_listbox;
|
||||
struct builder_horizontal_listbox;
|
||||
struct builder_grid_listbox;
|
||||
|
@ -41,9 +42,8 @@ struct builder_grid_listbox;
|
|||
/** The listbox class. */
|
||||
class listbox : public scrollbar_container
|
||||
{
|
||||
friend struct implementation::builder_listbox_base;
|
||||
friend struct implementation::builder_listbox;
|
||||
friend struct implementation::builder_horizontal_listbox;
|
||||
friend struct implementation::builder_grid_listbox;
|
||||
|
||||
friend class debug_layout_graph;
|
||||
|
||||
|
@ -441,7 +441,33 @@ struct listbox_definition : public styled_widget_definition
|
|||
namespace implementation
|
||||
{
|
||||
|
||||
struct builder_listbox : public builder_styled_widget
|
||||
struct builder_listbox_base : public builder_styled_widget
|
||||
{
|
||||
explicit builder_listbox_base(const config& cfg);
|
||||
|
||||
std::unique_ptr<widget> generic_build(
|
||||
generator_base::placement placement,
|
||||
const builder_grid_const_ptr& header = nullptr,
|
||||
const builder_grid_const_ptr& footer = nullptr,
|
||||
bool allow_selection = true) const;
|
||||
|
||||
scrollbar_container::scrollbar_mode vertical_scrollbar_mode;
|
||||
scrollbar_container::scrollbar_mode horizontal_scrollbar_mode;
|
||||
|
||||
builder_grid_ptr list_builder;
|
||||
|
||||
/**
|
||||
* Listbox 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<widget_data> list_data;
|
||||
|
||||
bool has_minimum_, has_maximum_;
|
||||
};
|
||||
|
||||
struct builder_listbox : public builder_listbox_base
|
||||
{
|
||||
explicit builder_listbox(const config& cfg);
|
||||
|
||||
|
@ -449,71 +475,28 @@ struct builder_listbox : public builder_styled_widget
|
|||
|
||||
virtual std::unique_ptr<widget> build() const override;
|
||||
|
||||
scrollbar_container::scrollbar_mode vertical_scrollbar_mode;
|
||||
scrollbar_container::scrollbar_mode horizontal_scrollbar_mode;
|
||||
|
||||
builder_grid_ptr header;
|
||||
builder_grid_ptr footer;
|
||||
|
||||
builder_grid_ptr list_builder;
|
||||
|
||||
/**
|
||||
* Listbox 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<widget_data> list_data;
|
||||
|
||||
bool has_minimum_, has_maximum_, allow_selection_;
|
||||
bool allow_selection_;
|
||||
};
|
||||
|
||||
struct builder_horizontal_listbox : public builder_styled_widget
|
||||
struct builder_horizontal_listbox : public builder_listbox_base
|
||||
{
|
||||
explicit builder_horizontal_listbox(const config& cfg);
|
||||
|
||||
using builder_styled_widget::build;
|
||||
|
||||
virtual std::unique_ptr<widget> build() const override;
|
||||
|
||||
scrollbar_container::scrollbar_mode vertical_scrollbar_mode;
|
||||
scrollbar_container::scrollbar_mode horizontal_scrollbar_mode;
|
||||
|
||||
builder_grid_ptr list_builder;
|
||||
|
||||
/**
|
||||
* Listbox 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<widget_data> list_data;
|
||||
|
||||
bool has_minimum_, has_maximum_;
|
||||
};
|
||||
|
||||
struct builder_grid_listbox : public builder_styled_widget
|
||||
struct builder_grid_listbox : public builder_listbox_base
|
||||
{
|
||||
explicit builder_grid_listbox(const config& cfg);
|
||||
|
||||
using builder_styled_widget::build;
|
||||
using builder_listbox_base::build;
|
||||
|
||||
virtual std::unique_ptr<widget> build() const override;
|
||||
|
||||
scrollbar_container::scrollbar_mode vertical_scrollbar_mode;
|
||||
scrollbar_container::scrollbar_mode horizontal_scrollbar_mode;
|
||||
|
||||
builder_grid_ptr list_builder;
|
||||
|
||||
/**
|
||||
* Listbox 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<widget_data> list_data;
|
||||
|
||||
bool has_minimum_, has_maximum_;
|
||||
};
|
||||
|
||||
} // namespace implementation
|
||||
|
|
Loading…
Add table
Reference in a new issue