Skip to content

Commit

Permalink
GUI2: refactored widget initialization process
Browse files Browse the repository at this point in the history
Essentially, this utilizes the second styled_widget overload that takes a builder reference to allow widgets
to initialize themselves without the extra init_control call. It also removes the need for extra functions such
as styled_widget::load_config_extra or styled_widget::init since the widget definition config and canvases are
loaded in the styled_widget ctor. Any code from the uses of the former function were moved either to widget
builders or their ctors.
  • Loading branch information
Vultraz committed Aug 25, 2017
1 parent d78158d commit a87132a
Show file tree
Hide file tree
Showing 69 changed files with 374 additions and 414 deletions.
6 changes: 2 additions & 4 deletions src/gui/dialogs/drop_down_menu.cpp
Expand Up @@ -139,8 +139,7 @@ void drop_down_menu::pre_show(window& window)
find_widget<toggle_panel>(&new_row, "panel", false).set_tooltip(entry["tooltip"]);

if(entry.has_attribute("image")) {
image* img = new image();
img->set_definition("default");
image* img = build_single_widget_instance<image>("image");
img->set_label(entry["image"]);

grid* mi_grid = dynamic_cast<grid*>(new_row.find("menu_item", false));
Expand All @@ -150,8 +149,7 @@ void drop_down_menu::pre_show(window& window)
}

if(entry.has_attribute("checkbox")) {
toggle_button* checkbox = new toggle_button();
checkbox->set_definition("default");
toggle_button* checkbox = build_single_widget_instance<toggle_button>("toggle_button");
checkbox->set_id("checkbox");
checkbox->set_value_bool(entry["checkbox"].to_bool(false));

Expand Down
9 changes: 3 additions & 6 deletions src/gui/dialogs/preferences_dialog.cpp
Expand Up @@ -604,8 +604,7 @@ void preferences_dialog::post_build(window& window)
}

case ADVANCED_PREF_TYPE::SLIDER: {
slider* setter_widget = new slider();
setter_widget->set_definition("minimal");
slider* setter_widget = build_single_widget_instance<slider>("slider", config {"definition", "minimal"});
setter_widget->set_id("setter");
// Maximum must be set first or this will assert
setter_widget->set_maximum_value(option["max"].to_int());
Expand Down Expand Up @@ -647,8 +646,7 @@ void preferences_dialog::post_build(window& window)
const unsigned selected = std::find(option_ids.begin(), option_ids.end(),
get(pref_name, option["default"].str())) - option_ids.begin();

menu_button* setter_widget = new menu_button();
setter_widget->set_definition("default");
menu_button* setter_widget = build_single_widget_instance<menu_button>("menu_button");
setter_widget->set_id("setter");

details_grid.swap_child("setter", setter_widget, true);
Expand All @@ -671,8 +669,7 @@ void preferences_dialog::post_build(window& window)
case ADVANCED_PREF_TYPE::SPECIAL: {
//main_grid->remove_child("setter");

image* value_widget = new image();
value_widget->set_definition("default");
image* value_widget = build_single_widget_instance<image>("image");
value_widget->set_label("icons/arrows/arrows_blank_right_25.png~CROP(3,3,18,18)");

main_grid->swap_child("value", value_widget, true);
Expand Down
16 changes: 13 additions & 3 deletions src/gui/widgets/addon_list.cpp
Expand Up @@ -39,6 +39,18 @@ namespace gui2

REGISTER_WIDGET(addon_list)

addon_list::addon_list(const implementation::builder_addon_list& builder)
: container_base(builder, get_control_type())
, addon_vector_()
, install_status_visibility_(visibility::visible)
, install_buttons_visibility_(visibility::invisible)
, install_function_()
, uninstall_function_()
, publish_function_()
, delete_function_()
{
}

static color_t color_outdated {255, 127, 0};

std::string addon_list::colorify_addon_state_string(const std::string& str, ADDON_STATUS state, bool verbose)
Expand Down Expand Up @@ -439,9 +451,7 @@ builder_addon_list::builder_addon_list(const config& cfg) :

widget* builder_addon_list::build() const
{
addon_list* widget = new addon_list();

init_control(widget);
addon_list* widget = new addon_list(*this);

DBG_GUI_G << "Window builder: placed add-on list '" << id <<
"' with definition '" << definition << "'.\n";
Expand Down
11 changes: 1 addition & 10 deletions src/gui/widgets/addon_list.hpp
Expand Up @@ -38,16 +38,7 @@ class addon_list : public container_base
friend struct implementation::builder_addon_list;

public:
addon_list()
: container_base()
, addon_vector_()
, install_status_visibility_(visibility::visible)
, install_buttons_visibility_(visibility::invisible)
, install_function_()
, uninstall_function_()
, publish_function_()
, delete_function_()
{}
explicit addon_list(const implementation::builder_addon_list& builder);

/** Special retval for the toggle panels in the addons list */
static const int DEFAULT_ACTION_RETVAL = 200;
Expand Down
10 changes: 6 additions & 4 deletions src/gui/widgets/button.cpp
Expand Up @@ -40,7 +40,11 @@ namespace gui2

REGISTER_WIDGET(button)

button::button() : styled_widget(), clickable_item(), state_(ENABLED), retval_(0)
button::button(const implementation::builder_button& builder)
: styled_widget(builder, get_control_type())
, clickable_item()
, state_(ENABLED)
, retval_(0)
{
connect_signal<event::MOUSE_ENTER>(
std::bind(&button::signal_handler_mouse_enter, this, _2, _3));
Expand Down Expand Up @@ -246,9 +250,7 @@ builder_button::builder_button(const config& cfg)

widget* builder_button::build() const
{
button* widget = new button();

init_control(widget);
button* widget = new button(*this);

widget->set_retval(get_retval(retval_id_, retval_, id));

Expand Down
6 changes: 5 additions & 1 deletion src/gui/widgets/button.hpp
Expand Up @@ -22,6 +22,10 @@

namespace gui2
{
namespace implementation
{
struct builder_button;
}

// ------------ WIDGET -----------{

Expand All @@ -31,7 +35,7 @@ namespace gui2
class button : public styled_widget, public clickable_item
{
public:
button();
explicit button(const implementation::builder_button& builder);

/***** ***** ***** ***** Inherited ***** ***** ***** *****/

Expand Down
8 changes: 3 additions & 5 deletions src/gui/widgets/chatbox.cpp
Expand Up @@ -52,8 +52,8 @@ namespace gui2

REGISTER_WIDGET(chatbox)

chatbox::chatbox()
: container_base()
chatbox::chatbox(const implementation::builder_chatbox& builder)
: container_base(builder, get_control_type())
, roomlistbox_(nullptr)
, chat_log_container_(nullptr)
, chat_input_(nullptr)
Expand Down Expand Up @@ -758,9 +758,7 @@ builder_chatbox::builder_chatbox(const config& cfg)

widget* builder_chatbox::build() const
{
chatbox* widget = new chatbox();

init_control(widget);
chatbox* widget = new chatbox(*this);

DBG_GUI_G << "Window builder: placed unit preview pane '" << id
<< "' with definition '" << definition << "'.\n";
Expand Down
2 changes: 1 addition & 1 deletion src/gui/widgets/chatbox.hpp
Expand Up @@ -57,7 +57,7 @@ class chatbox : public container_base, public events::chat_handler
friend struct implementation::builder_chatbox;

public:
chatbox();
explicit chatbox(const implementation::builder_chatbox& builder);

/** See @ref styled_widget::set_active. */
virtual void set_active(const bool active) override;
Expand Down
5 changes: 3 additions & 2 deletions src/gui/widgets/container_base.cpp
Expand Up @@ -28,8 +28,9 @@
namespace gui2
{

container_base::container_base()
: styled_widget(), grid_()
container_base::container_base(const implementation::builder_styled_widget& builder, const std::string& control_type)
: styled_widget(builder, control_type)
, grid_()
{
grid_.set_parent(this);
connect_signal<event::REQUEST_PLACEMENT>(
Expand Down
6 changes: 5 additions & 1 deletion src/gui/widgets/container_base.hpp
Expand Up @@ -20,6 +20,10 @@

namespace gui2
{
namespace implementation
{
struct builder_styled_widget;
}

/**
* A generic container base class.
Expand All @@ -33,7 +37,7 @@ class container_base : public styled_widget
friend class debug_layout_graph;

public:
container_base();
explicit container_base(const implementation::builder_styled_widget& builder, const std::string& control_type);

/**
* Returns the client rect.
Expand Down
10 changes: 7 additions & 3 deletions src/gui/widgets/drawing.cpp
Expand Up @@ -31,6 +31,12 @@ namespace gui2

REGISTER_WIDGET(drawing)

drawing::drawing(const implementation::builder_drawing& builder)
: styled_widget(builder, get_control_type())
, best_size_(0, 0)
{
}

point drawing::calculate_best_size() const
{
return best_size_ != point() ? best_size_
Expand Down Expand Up @@ -177,9 +183,7 @@ builder_drawing::builder_drawing(const config& cfg)

widget* builder_drawing::build() const
{
drawing* widget = new drawing();

init_control(widget);
drawing* widget = new drawing(*this);

const wfl::map_formula_callable& size = get_screen_size_variables();

Expand Down
9 changes: 5 additions & 4 deletions src/gui/widgets/drawing.hpp
Expand Up @@ -23,7 +23,10 @@ class config;

namespace gui2
{

namespace implementation
{
struct builder_drawing;
}
// ------------ WIDGET -----------{

/**
Expand All @@ -35,9 +38,7 @@ namespace gui2
class drawing : public styled_widget
{
public:
drawing() : styled_widget(), best_size_(0, 0)
{
}
explicit drawing(const implementation::builder_drawing& builder);

canvas& get_drawing_canvas()
{
Expand Down
9 changes: 7 additions & 2 deletions src/gui/widgets/horizontal_scrollbar.cpp
Expand Up @@ -33,6 +33,11 @@ namespace gui2

REGISTER_WIDGET(horizontal_scrollbar)

horizontal_scrollbar::horizontal_scrollbar(const implementation::builder_horizontal_scrollbar& builder)
: scrollbar_base(builder, get_control_type())
{
}

unsigned horizontal_scrollbar::minimum_positioner_length() const
{
const auto conf = cast_config_to<horizontal_scrollbar_definition>();
Expand Down Expand Up @@ -217,9 +222,9 @@ builder_horizontal_scrollbar::builder_horizontal_scrollbar(const config& cfg)

widget* builder_horizontal_scrollbar::build() const
{
horizontal_scrollbar* widget = new horizontal_scrollbar();
horizontal_scrollbar* widget = new horizontal_scrollbar(*this);

init_control(widget);
widget->finalize_setup();

DBG_GUI_G << "Window builder:"
<< " placed horizontal scrollbar '" << id << "' with definition '"
Expand Down
10 changes: 7 additions & 3 deletions src/gui/widgets/horizontal_scrollbar.hpp
Expand Up @@ -21,16 +21,20 @@

namespace gui2
{
namespace implementation
{
struct builder_horizontal_scrollbar;
}

// ------------ WIDGET -----------{

/** A horizontal scrollbar. */
class horizontal_scrollbar : public scrollbar_base
{
friend struct implementation::builder_horizontal_scrollbar;

public:
horizontal_scrollbar() : scrollbar_base()
{
}
explicit horizontal_scrollbar(const implementation::builder_horizontal_scrollbar& builder);

private:
/** Inherited from tscrollbar. */
Expand Down
9 changes: 6 additions & 3 deletions src/gui/widgets/image.cpp
Expand Up @@ -36,6 +36,11 @@ namespace gui2

REGISTER_WIDGET(image)

image::image(const implementation::builder_image& builder)
: styled_widget(builder, get_control_type())
{
}

point image::calculate_best_size() const
{
surface image(::image::get_image(::image::locator(get_label())));
Expand Down Expand Up @@ -168,9 +173,7 @@ builder_image::builder_image(const config& cfg) : builder_styled_widget(cfg)

widget* builder_image::build() const
{
image* widget = new image();

init_control(widget);
image* widget = new image(*this);

DBG_GUI_G << "Window builder: placed image '" << id << "' with definition '"
<< definition << "'.\n";
Expand Down
8 changes: 5 additions & 3 deletions src/gui/widgets/image.hpp
Expand Up @@ -21,16 +21,18 @@

namespace gui2
{
namespace implementation
{
struct builder_image;
}

// ------------ WIDGET -----------{

/** An image. */
class image : public styled_widget
{
public:
image() : styled_widget()
{
}
explicit image(const implementation::builder_image& builder);

/**
* Wrapper for set_label.
Expand Down

0 comments on commit a87132a

Please sign in to comment.