GUI2: add a scrollbar_container builder

This unifies handling of the scrollbar modes without having to manually set them in the builders. At one point, this wasn't too common, but it's become common enough that having a separate builder is cleaner
This commit is contained in:
Charles Dang 2024-12-06 00:05:55 -05:00
parent 5801b5bcdb
commit 2d9cc9c89d
12 changed files with 43 additions and 74 deletions

View file

@ -43,7 +43,7 @@ REGISTER_WIDGET(listbox)
REGISTER_WIDGET3(listbox_definition, horizontal_listbox, nullptr)
REGISTER_WIDGET3(listbox_definition, grid_listbox, nullptr)
listbox::listbox(const implementation::builder_styled_widget& builder,
listbox::listbox(const implementation::builder_scrollbar_container& builder,
const generator_base::placement placement,
const builder_grid_ptr& list_builder)
: scrollbar_container(builder, type())
@ -738,9 +738,7 @@ static std::vector<widget_data> parse_list_data(const config& data, const unsign
}
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"]))
: builder_scrollbar_container(cfg)
, header(nullptr)
, footer(nullptr)
, list_builder(nullptr)
@ -775,9 +773,6 @@ 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>();
@ -792,9 +787,7 @@ std::unique_ptr<widget> builder_listbox::build() const
}
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"]))
: builder_scrollbar_container(cfg)
, list_builder(nullptr)
, list_data()
, has_minimum_(cfg["has_minimum"].to_bool(true))
@ -818,9 +811,6 @@ 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>();
@ -835,9 +825,7 @@ std::unique_ptr<widget> builder_horizontal_listbox::build() const
}
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"]))
: builder_scrollbar_container(cfg)
, list_builder(nullptr)
, list_data()
, has_minimum_(cfg["has_minimum"].to_bool(true))
@ -861,9 +849,6 @@ 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>();

View file

@ -55,7 +55,7 @@ public:
* @param placement How are the items placed.
* @param list_builder Grid builder for the listbox definition grid.
*/
listbox(const implementation::builder_styled_widget& builder,
listbox(const implementation::builder_scrollbar_container& builder,
const generator_base::placement placement,
const builder_grid_ptr& list_builder);
@ -441,7 +441,7 @@ struct listbox_definition : public styled_widget_definition
namespace implementation
{
struct builder_listbox : public builder_styled_widget
struct builder_listbox : public builder_scrollbar_container
{
explicit builder_listbox(const config& cfg);
@ -449,9 +449,6 @@ 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;
@ -468,7 +465,7 @@ struct builder_listbox : public builder_styled_widget
bool has_minimum_, has_maximum_, allow_selection_;
};
struct builder_horizontal_listbox : public builder_styled_widget
struct builder_horizontal_listbox : public builder_scrollbar_container
{
explicit builder_horizontal_listbox(const config& cfg);
@ -476,9 +473,6 @@ struct builder_horizontal_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 list_builder;
/**
@ -492,7 +486,7 @@ struct builder_horizontal_listbox : public builder_styled_widget
bool has_minimum_, has_maximum_;
};
struct builder_grid_listbox : public builder_styled_widget
struct builder_grid_listbox : public builder_scrollbar_container
{
explicit builder_grid_listbox(const config& cfg);
@ -500,9 +494,6 @@ struct builder_grid_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 list_builder;
/**

View file

@ -186,9 +186,7 @@ namespace implementation
{
builder_scroll_label::builder_scroll_label(const config& cfg)
: implementation::builder_styled_widget(cfg)
, vertical_scrollbar_mode(get_scrollbar_mode(cfg["vertical_scrollbar_mode"]))
, horizontal_scrollbar_mode(get_scrollbar_mode(cfg["horizontal_scrollbar_mode"]))
: builder_scrollbar_container(cfg)
, wrap_on(cfg["wrap"].to_bool(true))
, text_alignment(decode_text_alignment(cfg["text_alignment"]))
, link_aware(cfg["link_aware"].to_bool(false))
@ -199,9 +197,6 @@ std::unique_ptr<widget> builder_scroll_label::build() const
{
auto widget = std::make_unique<scroll_label>(*this);
widget->set_vertical_scrollbar_mode(vertical_scrollbar_mode);
widget->set_horizontal_scrollbar_mode(horizontal_scrollbar_mode);
const auto conf = widget->cast_config_to<scroll_label_definition>();
assert(conf);

View file

@ -147,7 +147,7 @@ struct scroll_label_definition : public styled_widget_definition
namespace implementation
{
struct builder_scroll_label : public builder_styled_widget
struct builder_scroll_label : public builder_scrollbar_container
{
explicit builder_scroll_label(const config& cfg);

View file

@ -240,9 +240,7 @@ namespace implementation
{
builder_scroll_text::builder_scroll_text(const config& cfg)
: implementation::builder_styled_widget(cfg)
, vertical_scrollbar_mode(get_scrollbar_mode(cfg["vertical_scrollbar_mode"]))
, horizontal_scrollbar_mode(get_scrollbar_mode(cfg["horizontal_scrollbar_mode"]))
: builder_scrollbar_container(cfg)
, text_alignment(decode_text_alignment(cfg["text_alignment"]))
, editable(cfg["editable"].to_bool(true))
, link_aware(cfg["link_aware"].to_bool(false))
@ -261,9 +259,6 @@ std::unique_ptr<widget> builder_scroll_text::build() const
{
auto widget = std::make_unique<scroll_text>(*this);
widget->set_vertical_scrollbar_mode(vertical_scrollbar_mode);
widget->set_horizontal_scrollbar_mode(horizontal_scrollbar_mode);
const auto conf = widget->cast_config_to<scroll_text_definition>();
assert(conf);

View file

@ -178,7 +178,7 @@ struct scroll_text_definition : public styled_widget_definition
namespace implementation
{
struct builder_scroll_text : public builder_styled_widget
struct builder_scroll_text : public builder_scrollbar_container
{
explicit builder_scroll_text(const config& cfg);
@ -186,8 +186,6 @@ struct builder_scroll_text : 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;
const PangoAlignment text_alignment;
bool editable;
bool link_aware;

View file

@ -21,6 +21,7 @@
#include "gui/core/event/message.hpp"
#include "gui/core/layout_exception.hpp"
#include "gui/core/log.hpp"
#include "gui/core/window_builder/helper.hpp"
#include "gui/widgets/clickable_item.hpp"
#include "gui/widgets/spacer.hpp"
#include "gui/widgets/window.hpp"
@ -68,11 +69,11 @@ const std::map<std::string, scrollbar_base::scroll_mode>& scroll_lookup()
} // namespace
scrollbar_container::scrollbar_container(
const implementation::builder_styled_widget& builder, const std::string& control_type)
const implementation::builder_scrollbar_container& builder, const std::string& control_type)
: container_base(builder, control_type)
, state_(ENABLED)
, vertical_scrollbar_mode_(AUTO_VISIBLE_FIRST_RUN)
, horizontal_scrollbar_mode_(AUTO_VISIBLE_FIRST_RUN)
, vertical_scrollbar_mode_(builder.vertical_scrollbar_mode)
, horizontal_scrollbar_mode_(builder.horizontal_scrollbar_mode)
, vertical_scrollbar_grid_(nullptr)
, horizontal_scrollbar_grid_(nullptr)
, vertical_scrollbar_(nullptr)
@ -1239,6 +1240,15 @@ scrollbar_container::signal_handler_sdl_touch_motion(const event::ui_event event
}
}
namespace implementation
{
builder_scrollbar_container::builder_scrollbar_container(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"]))
{
}
} // namespace implementation
} // namespace gui2

View file

@ -24,6 +24,7 @@ class spacer;
namespace implementation
{
struct builder_scrollbar_container;
struct builder_scroll_label;
struct builder_scrollbar_panel;
struct builder_styled_widget;
@ -48,7 +49,7 @@ class scrollbar_container : public container_base
friend struct scrollbar_container_implementation;
public:
explicit scrollbar_container(const implementation::builder_styled_widget& builder, const std::string& control_type);
explicit scrollbar_container(const implementation::builder_scrollbar_container& builder, const std::string& control_type);
virtual ~scrollbar_container()
{
@ -586,4 +587,16 @@ public:
}
};
namespace implementation
{
struct builder_scrollbar_container : public builder_styled_widget
{
explicit builder_scrollbar_container(const config& cfg);
scrollbar_container::scrollbar_mode vertical_scrollbar_mode;
scrollbar_container::scrollbar_mode horizontal_scrollbar_mode;
};
} // namespace implementation
} // namespace gui2

View file

@ -78,11 +78,7 @@ namespace implementation
{
builder_scrollbar_panel::builder_scrollbar_panel(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"]))
: builder_scrollbar_container(cfg)
, grid_(nullptr)
{
auto grid_definition = cfg.optional_child("definition");
@ -96,9 +92,6 @@ std::unique_ptr<widget> builder_scrollbar_panel::build() const
{
auto panel = std::make_unique<scrollbar_panel>(*this);
panel->set_vertical_scrollbar_mode(vertical_scrollbar_mode);
panel->set_horizontal_scrollbar_mode(horizontal_scrollbar_mode);
DBG_GUI_G << "Window builder: placed scrollbar_panel '" << id
<< "' with definition '" << definition << "'.";

View file

@ -77,7 +77,7 @@ struct scrollbar_panel_definition : public styled_widget_definition
namespace implementation
{
struct builder_scrollbar_panel : public builder_styled_widget
struct builder_scrollbar_panel : public builder_scrollbar_container
{
explicit builder_scrollbar_panel(const config& cfg);
@ -85,9 +85,6 @@ struct builder_scrollbar_panel : 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 grid_;
};

View file

@ -277,9 +277,7 @@ tree_view_definition::resolution::resolution(const config& cfg)
namespace implementation
{
builder_tree_view::builder_tree_view(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"]))
: builder_scrollbar_container(cfg)
, indentation_step_size(cfg["indentation_step_size"].to_unsigned())
, nodes()
{
@ -298,9 +296,6 @@ std::unique_ptr<widget> builder_tree_view::build() const
*/
auto widget = std::make_unique<tree_view>(*this);
widget->set_vertical_scrollbar_mode(vertical_scrollbar_mode);
widget->set_horizontal_scrollbar_mode(horizontal_scrollbar_mode);
widget->set_indentation_step_size(indentation_step_size);
DBG_GUI_G << "Window builder: placed tree_view '" << id << "' with definition '" << definition << "'.";

View file

@ -219,7 +219,7 @@ struct tree_view_definition : public styled_widget_definition
namespace implementation
{
struct builder_tree_view : public builder_styled_widget
struct builder_tree_view : public builder_scrollbar_container
{
explicit builder_tree_view(const config& cfg);
@ -227,9 +227,6 @@ struct builder_tree_view : 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;
unsigned indentation_step_size;
/**