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:
parent
5801b5bcdb
commit
2d9cc9c89d
12 changed files with 43 additions and 74 deletions
|
@ -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>();
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 << "'.";
|
||||
|
||||
|
|
|
@ -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_;
|
||||
};
|
||||
|
||||
|
|
|
@ -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 << "'.";
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue