Skip to content

Commit

Permalink
MP Options Helper: some refactoring to reduce redundant code
Browse files Browse the repository at this point in the history
  • Loading branch information
Vultraz committed Oct 22, 2016
1 parent 16e66fb commit cf670b9
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 49 deletions.
86 changes: 37 additions & 49 deletions src/gui/dialogs/multiplayer/mp_options_helper.cpp
Expand Up @@ -87,6 +87,27 @@ void tmp_options_helper::reset_options_data(const option_source& source, bool& h
halt = true;
}

template<typename T>
std::pair<T*, config::attribute_value> tmp_options_helper::add_node_and_get_widget(
ttree_view_node& option_node, const std::string& id, data_map& data, const config& cfg)
{
ttree_view_node& node = option_node.add_child(id + "_node", data);

T* widget = dynamic_cast<T*>(node.find(id, true));
VALIDATE(widget, missing_widget(id));

const std::string widget_id = cfg["id"];

auto& data_map = options_data_[visible_options_.back()];
if(data_map.find(widget_id) == data_map.end() || data_map[widget_id].empty()) {
data_map[widget_id] = cfg["default"];
}

widget->set_id(widget_id);

return {widget, data_map[widget_id]};
}

void tmp_options_helper::display_custom_options(std::string&& type, const config& cfg)
{
// Needed since some compilers don't like passing just {}
Expand All @@ -100,13 +121,6 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
}

visible_options_.push_back({type, cfg["id"]});
auto& data_map = options_data_[visible_options_.back()];

auto set_default_data_value = [&](const std::string& widget_id, const config& cfg) {
if(data_map.find(widget_id) == data_map.end() || data_map[widget_id].empty()) {
data_map[widget_id] = cfg["default"];
}
};

for(const auto& options : cfg.child_range("options")) {
std::map<std::string, string_map> data;
Expand All @@ -127,18 +141,12 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
item["tooltip"] = checkbox_option["description"];
data.emplace("option_checkbox", item);

ttree_view_node& node = option_node.add_child("option_checkbox_node", data);

ttoggle_button* checkbox = dynamic_cast<ttoggle_button*>(node.find("option_checkbox", true));
ttoggle_button* checkbox;
config::attribute_value val;

VALIDATE(checkbox, missing_widget("option_checkbox"));
std::tie(checkbox, val) = add_node_and_get_widget<ttoggle_button>(option_node, "option_checkbox", data, checkbox_option);

const std::string widget_id = checkbox_option["id"];

set_default_data_value(widget_id, checkbox_option);

checkbox->set_id(widget_id);
checkbox->set_value(data_map[widget_id].to_bool());
checkbox->set_value(val.to_bool());
checkbox->set_callback_state_change(
std::bind(&tmp_options_helper::update_options_data_map<ttoggle_button>, this, checkbox, visible_options_.back()));
} else if(opt.key == "spacer") {
Expand Down Expand Up @@ -175,20 +183,11 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
continue;
}

ttree_view_node& node = option_node.add_child("option_menu_button_node", data);

tmenu_button* menu_button = dynamic_cast<tmenu_button*>(node.find("option_menu_button", true));

VALIDATE(menu_button, missing_widget("option_menu_button"));
tmenu_button* menu_button;
config::attribute_value val;

const std::string widget_id = menu_button_option["id"];

set_default_data_value(widget_id, menu_button_option);

menu_button->set_id(widget_id);
menu_button->set_values(combo_items);
std::tie(menu_button, val) = add_node_and_get_widget<tmenu_button>(option_node, "option_menu_button", data, menu_button_option);

config::attribute_value val = data_map[widget_id];
auto iter = std::find_if(items.begin(), items.end(), [&val](const config& cfg) {
return cfg["value"] == val;
});
Expand All @@ -197,6 +196,7 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
menu_button->set_selected(iter - items.begin());
}

menu_button->set_values(combo_items);
menu_button->connect_click_handler(
std::bind(&tmp_options_helper::update_options_data_map<tmenu_button>, this, menu_button, visible_options_.back()));
} else if(opt.key == "slider") {
Expand All @@ -211,21 +211,15 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
item["tooltip"] = slider_option["description"];
data.emplace("option_slider", item);

ttree_view_node& node = option_node.add_child("option_slider_node", data);

tslider* slider = dynamic_cast<tslider*>(node.find("option_slider", true));

VALIDATE(slider, missing_widget("option_slider"));

const std::string widget_id = slider_option["id"];
tslider* slider;
config::attribute_value val;

set_default_data_value(widget_id, slider_option);
std::tie(slider, val) = add_node_and_get_widget<tslider>(option_node, "option_slider", data, slider_option);

slider->set_id(widget_id);
slider->set_maximum_value(slider_option["max"].to_int());
slider->set_minimum_value(slider_option["min"].to_int());
slider->set_step_size(slider_option["step"].to_int(1));
slider->set_value(data_map[widget_id].to_int());
slider->set_value(val.to_int());

connect_signal_notify_modified(*slider,
std::bind(&tmp_options_helper::update_options_data_map<tslider>, this, slider, visible_options_.back()));
Expand All @@ -241,18 +235,12 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
item["tooltip"] = text_entry_option["description"];
data.emplace("option_text_entry", item);

ttree_view_node& node = option_node.add_child("option_text_entry_node", data);

ttext_box* textbox = dynamic_cast<ttext_box*>(node.find("option_text_entry", true));

VALIDATE(textbox, missing_widget("option_text_entry"));

const std::string widget_id = text_entry_option["id"];
ttext_box* textbox;
config::attribute_value val;

set_default_data_value(widget_id, text_entry_option);
std::tie(textbox, val) = add_node_and_get_widget<ttext_box>(option_node, "option_text_entry", data, text_entry_option);

textbox->set_id(widget_id);
textbox->set_value(data_map[widget_id].str());
textbox->set_value(val.str());
textbox->set_text_changed_callback(
std::bind(&tmp_options_helper::update_options_data_map<ttext_box>, this, textbox, visible_options_.back()));
}
Expand Down
8 changes: 8 additions & 0 deletions src/gui/dialogs/multiplayer/mp_options_helper.hpp
Expand Up @@ -15,6 +15,7 @@
#define GUI_DIALOGS_MP_OPTIONS_HELPER_HPP_INCLUDED

#include "game_initialization/create_engine.hpp"
#include "gui/widgets/generator.hpp"

class config;

Expand All @@ -24,6 +25,7 @@ namespace gui2
class tcontrol;
class ttoggle_button;
class ttree_view;
class ttree_view_node;
class twindow;

class tmp_options_helper
Expand All @@ -44,6 +46,12 @@ class tmp_options_helper
}
};

using data_map = std::map<std::string, string_map>;

template <typename T>
std::pair<T*, config::attribute_value> add_node_and_get_widget(
ttree_view_node& option_node, const std::string& id, data_map& data, const config& cfg);

void display_custom_options(std::string&& type, const config& data);

template<typename T>
Expand Down

0 comments on commit cf670b9

Please sign in to comment.