MP Options Helper: some refactoring to reduce redundant code
This commit is contained in:
parent
16e66fb1aa
commit
cf670b99c6
2 changed files with 45 additions and 49 deletions
|
@ -87,6 +87,27 @@ void tmp_options_helper::reset_options_data(const option_source& source, bool& h
|
||||||
halt = true;
|
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)
|
void tmp_options_helper::display_custom_options(std::string&& type, const config& cfg)
|
||||||
{
|
{
|
||||||
// Needed since some compilers don't like passing just {}
|
// Needed since some compilers don't like passing just {}
|
||||||
|
@ -100,13 +121,6 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
|
||||||
}
|
}
|
||||||
|
|
||||||
visible_options_.push_back({type, cfg["id"]});
|
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")) {
|
for(const auto& options : cfg.child_range("options")) {
|
||||||
std::map<std::string, string_map> data;
|
std::map<std::string, string_map> data;
|
||||||
|
@ -127,18 +141,12 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
|
||||||
item["tooltip"] = checkbox_option["description"];
|
item["tooltip"] = checkbox_option["description"];
|
||||||
data.emplace("option_checkbox", item);
|
data.emplace("option_checkbox", item);
|
||||||
|
|
||||||
ttree_view_node& node = option_node.add_child("option_checkbox_node", data);
|
ttoggle_button* checkbox;
|
||||||
|
config::attribute_value val;
|
||||||
|
|
||||||
ttoggle_button* checkbox = dynamic_cast<ttoggle_button*>(node.find("option_checkbox", true));
|
std::tie(checkbox, val) = add_node_and_get_widget<ttoggle_button>(option_node, "option_checkbox", data, checkbox_option);
|
||||||
|
|
||||||
VALIDATE(checkbox, missing_widget("option_checkbox"));
|
checkbox->set_value(val.to_bool());
|
||||||
|
|
||||||
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_callback_state_change(
|
checkbox->set_callback_state_change(
|
||||||
std::bind(&tmp_options_helper::update_options_data_map<ttoggle_button>, this, checkbox, visible_options_.back()));
|
std::bind(&tmp_options_helper::update_options_data_map<ttoggle_button>, this, checkbox, visible_options_.back()));
|
||||||
} else if(opt.key == "spacer") {
|
} else if(opt.key == "spacer") {
|
||||||
|
@ -175,20 +183,11 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ttree_view_node& node = option_node.add_child("option_menu_button_node", data);
|
tmenu_button* menu_button;
|
||||||
|
config::attribute_value val;
|
||||||
|
|
||||||
tmenu_button* menu_button = dynamic_cast<tmenu_button*>(node.find("option_menu_button", true));
|
std::tie(menu_button, val) = add_node_and_get_widget<tmenu_button>(option_node, "option_menu_button", data, menu_button_option);
|
||||||
|
|
||||||
VALIDATE(menu_button, missing_widget("option_menu_button"));
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
config::attribute_value val = data_map[widget_id];
|
|
||||||
auto iter = std::find_if(items.begin(), items.end(), [&val](const config& cfg) {
|
auto iter = std::find_if(items.begin(), items.end(), [&val](const config& cfg) {
|
||||||
return cfg["value"] == val;
|
return cfg["value"] == val;
|
||||||
});
|
});
|
||||||
|
@ -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_selected(iter - items.begin());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
menu_button->set_values(combo_items);
|
||||||
menu_button->connect_click_handler(
|
menu_button->connect_click_handler(
|
||||||
std::bind(&tmp_options_helper::update_options_data_map<tmenu_button>, this, menu_button, visible_options_.back()));
|
std::bind(&tmp_options_helper::update_options_data_map<tmenu_button>, this, menu_button, visible_options_.back()));
|
||||||
} else if(opt.key == "slider") {
|
} else if(opt.key == "slider") {
|
||||||
|
@ -211,21 +211,15 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
|
||||||
item["tooltip"] = slider_option["description"];
|
item["tooltip"] = slider_option["description"];
|
||||||
data.emplace("option_slider", item);
|
data.emplace("option_slider", item);
|
||||||
|
|
||||||
ttree_view_node& node = option_node.add_child("option_slider_node", data);
|
tslider* slider;
|
||||||
|
config::attribute_value val;
|
||||||
|
|
||||||
tslider* slider = dynamic_cast<tslider*>(node.find("option_slider", true));
|
std::tie(slider, val) = add_node_and_get_widget<tslider>(option_node, "option_slider", data, slider_option);
|
||||||
|
|
||||||
VALIDATE(slider, missing_widget("option_slider"));
|
|
||||||
|
|
||||||
const std::string widget_id = slider_option["id"];
|
|
||||||
|
|
||||||
set_default_data_value(widget_id, slider_option);
|
|
||||||
|
|
||||||
slider->set_id(widget_id);
|
|
||||||
slider->set_maximum_value(slider_option["max"].to_int());
|
slider->set_maximum_value(slider_option["max"].to_int());
|
||||||
slider->set_minimum_value(slider_option["min"].to_int());
|
slider->set_minimum_value(slider_option["min"].to_int());
|
||||||
slider->set_step_size(slider_option["step"].to_int(1));
|
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,
|
connect_signal_notify_modified(*slider,
|
||||||
std::bind(&tmp_options_helper::update_options_data_map<tslider>, this, slider, visible_options_.back()));
|
std::bind(&tmp_options_helper::update_options_data_map<tslider>, this, slider, visible_options_.back()));
|
||||||
|
@ -241,18 +235,12 @@ void tmp_options_helper::display_custom_options(std::string&& type, const config
|
||||||
item["tooltip"] = text_entry_option["description"];
|
item["tooltip"] = text_entry_option["description"];
|
||||||
data.emplace("option_text_entry", item);
|
data.emplace("option_text_entry", item);
|
||||||
|
|
||||||
ttree_view_node& node = option_node.add_child("option_text_entry_node", data);
|
ttext_box* textbox;
|
||||||
|
config::attribute_value val;
|
||||||
|
|
||||||
ttext_box* textbox = dynamic_cast<ttext_box*>(node.find("option_text_entry", true));
|
std::tie(textbox, val) = add_node_and_get_widget<ttext_box>(option_node, "option_text_entry", data, text_entry_option);
|
||||||
|
|
||||||
VALIDATE(textbox, missing_widget("option_text_entry"));
|
textbox->set_value(val.str());
|
||||||
|
|
||||||
const std::string widget_id = text_entry_option["id"];
|
|
||||||
|
|
||||||
set_default_data_value(widget_id, text_entry_option);
|
|
||||||
|
|
||||||
textbox->set_id(widget_id);
|
|
||||||
textbox->set_value(data_map[widget_id].str());
|
|
||||||
textbox->set_text_changed_callback(
|
textbox->set_text_changed_callback(
|
||||||
std::bind(&tmp_options_helper::update_options_data_map<ttext_box>, this, textbox, visible_options_.back()));
|
std::bind(&tmp_options_helper::update_options_data_map<ttext_box>, this, textbox, visible_options_.back()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#define GUI_DIALOGS_MP_OPTIONS_HELPER_HPP_INCLUDED
|
#define GUI_DIALOGS_MP_OPTIONS_HELPER_HPP_INCLUDED
|
||||||
|
|
||||||
#include "game_initialization/create_engine.hpp"
|
#include "game_initialization/create_engine.hpp"
|
||||||
|
#include "gui/widgets/generator.hpp"
|
||||||
|
|
||||||
class config;
|
class config;
|
||||||
|
|
||||||
|
@ -24,6 +25,7 @@ namespace gui2
|
||||||
class tcontrol;
|
class tcontrol;
|
||||||
class ttoggle_button;
|
class ttoggle_button;
|
||||||
class ttree_view;
|
class ttree_view;
|
||||||
|
class ttree_view_node;
|
||||||
class twindow;
|
class twindow;
|
||||||
|
|
||||||
class tmp_options_helper
|
class tmp_options_helper
|
||||||
|
@ -44,6 +46,12 @@ private:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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);
|
void display_custom_options(std::string&& type, const config& data);
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
|
Loading…
Add table
Reference in a new issue