Revert "listbox: simplify builder"

This reverts commit c38b856a82.
This commit is contained in:
Charles Dang 2024-12-06 00:42:41 -05:00
parent c38b856a82
commit e0bda68b80
2 changed files with 145 additions and 73 deletions

View file

@ -737,7 +737,61 @@ static std::vector<widget_data> parse_list_data(const config& data, const unsign
return list_data;
}
builder_listbox_base::builder_listbox_base(const config& cfg)
builder_listbox::builder_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"]))
, 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))
, allow_selection_(cfg["allow_selection"].to_bool(true))
{
if(auto h = cfg.optional_child("header")) {
header = std::make_shared<builder_grid>(*h);
}
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;
}
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"]))
@ -760,13 +814,9 @@ builder_listbox_base::builder_listbox_base(const config& cfg)
}
}
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
std::unique_ptr<widget> builder_horizontal_listbox::build() const
{
auto widget = std::make_unique<listbox>(*this, placement, list_builder);
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);
@ -778,48 +828,53 @@ std::unique_ptr<widget> builder_listbox_base::generic_build(
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);
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;
}
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")) {
header = std::make_shared<builder_grid>(*h);
}
if(auto f = cfg.optional_child("footer")) {
footer = std::make_shared<builder_grid>(*f);
}
}
std::unique_ptr<widget> builder_listbox::build() const
{
return generic_build(generator_base::vertical_list, header, footer, allow_selection_);
}
builder_horizontal_listbox::builder_horizontal_listbox(const config& cfg)
: builder_listbox_base(cfg)
{
}
std::unique_ptr<widget> builder_horizontal_listbox::build() const
{
return generic_build(generator_base::horizontal_list);
}
builder_grid_listbox::builder_grid_listbox(const config& cfg)
: builder_listbox_base(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))
{
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
{
return generic_build(generator_base::table);
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;
}
} // namespace implementation

View file

@ -33,7 +33,6 @@ namespace gui2
class selectable_item;
namespace implementation
{
struct builder_listbox_base;
struct builder_listbox;
struct builder_horizontal_listbox;
struct builder_grid_listbox;
@ -42,8 +41,9 @@ 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,15 +441,40 @@ struct listbox_definition : public styled_widget_definition
namespace implementation
{
struct builder_listbox_base : public builder_styled_widget
struct builder_listbox : public builder_styled_widget
{
explicit builder_listbox_base(const config& cfg);
explicit builder_listbox(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;
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 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_;
};
struct builder_horizontal_listbox : public builder_styled_widget
{
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;
@ -467,36 +492,28 @@ struct builder_listbox_base : public builder_styled_widget
bool has_minimum_, has_maximum_;
};
struct builder_listbox : public builder_listbox_base
{
explicit builder_listbox(const config& cfg);
using builder_styled_widget::build;
virtual std::unique_ptr<widget> build() const override;
builder_grid_ptr header;
builder_grid_ptr footer;
bool allow_selection_;
};
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;
};
struct builder_grid_listbox : public builder_listbox_base
struct builder_grid_listbox : public builder_styled_widget
{
explicit builder_grid_listbox(const config& cfg);
using builder_listbox_base::build;
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_;
};
} // namespace implementation