diff --git a/data/gui/window/mp_create_game.cfg b/data/gui/window/mp_create_game.cfg index 60e3b1ccc65..e9495ae9c93 100644 --- a/data/gui/window/mp_create_game.cfg +++ b/data/gui/window/mp_create_game.cfg @@ -100,24 +100,15 @@ border = "all" border_size = 5 - horizontal_alignment = "left" + horizontal_grow = "true" [combobox] - id = "era" + id = "eras" definition = "default" - - # TODO: don't hardcode - [option] - label = "Default" - [/option] - - [option] - label = "Era of Heroes" - [/option] [/combobox] [/column] - + [/row] [row] @@ -144,7 +135,7 @@ border = "all" border_size = 5 - horizontal_alignment = "left" + horizontal_grow = "true" [combobox] id = "era" @@ -164,12 +155,20 @@ [/combobox] [/column] - + [/row] - + [/grid] [/column] + + [column] + grow_factor = 0 + + [spacer] + width = 40 + [/spacer] + [/column] [column] grow_factor = 0 @@ -236,8 +235,8 @@ [column] grow_factor = 1 - horizontal_grow = "true" - border = "all" + horizontal_alignment = "left" + border = "top,bottom,right" border_size = 5 [label] @@ -246,6 +245,14 @@ [/label] [/column] + + [column] + grow_factor = 0 + + [spacer] + width = 10 + [/spacer] + [/column] [/row] @@ -273,6 +280,249 @@ #enddef +#define _GUI_MP_CREATE_OPTIONS_PANEL + [row] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_grow = "true" + vertical_grow = "true" + + [tree_view] + id = "custom_options" + definition = "default" + + horizontal_scrollbar_mode = "never" + #vertical_scrollbar_mode = "auto" + + indention_step_size = 25 + + [node] + id = "option_node" + unfolded = true + + [node_definition] + + [row] + + [column] + + [toggle_button] + id = "tree_view_node_icon" + definition = "tree_view_node" + [/toggle_button] + + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_grow = "true" + + [label] + id = "tree_view_node_label" + [/label] + + [/column] + + [/row] + + [/node_definition] + + [/node] + + [node] + id = "option_checkbox_node" + unfolded = true + + [node_definition] + + [row] + + [column] + border = "all" + border_size = 5 + horizontal_alignment = "left" + + [toggle_button] + id = "option_checkbox" + definition = "default" + [/toggle_button] + + [/column] + + [/row] + + [/node_definition] + + [/node] + + [node] + id = "option_combobox_node" + unfolded = true + + [node_definition] + + [row] + + [column] + border = "all" + border_size = 5 + + [label] + id = "combobox_label" + linked_group = "custom_options_labels" + [/label] + + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_grow = "true" + + [combobox] + id = "option_combobox" + [/combobox] + + [/column] + + [/row] + + [/node_definition] + + [/node] + + [node] + id = "option_slider_node" + unfolded = true + + [node_definition] + + [row] + + [column] + border = "all" + border_size = 5 + + [label] + id = "slider_label" + linked_group = "custom_options_labels" + [/label] + + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_grow = "true" + + [slider] + id = "option_slider" + definition = "default" + [/slider] + + [/column] + + [/row] + + [/node_definition] + + [/node] + + [node] + id = "option_text_entry_node" + unfolded = true + + [node_definition] + + [row] + + [column] + border = "all" + border_size = 5 + + [label] + id = "text_entry_label" + linked_group = "custom_options_labels" + [/label] + + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + + horizontal_grow = "true" + + [text_box] + id = "option_text_entry" + definition = "default" + [/text_box] + + [/column] + + [/row] + + [/node_definition] + + [/node] + + [node] + id = "options_default_button" + unfolded = true + + [node_definition] + [row] + grow_factor = 0 + + [column] + + [spacer] + height = 10 + [/spacer] + + [/column] + + [/row] + + [row] + grow_factor = 1 + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "right" + + [button] + id = "reset_option_values" + definition = "default" + + label = _ "Defaults" + [/button] + + [/column] + + [/row] + + [/node_definition] + + [/node] + + [/tree_view] + + [/column] + + [/row] +#enddef + #define _GUI_MP_CREATE_SETTING_PANEL [row] grow_factor = 0 @@ -513,6 +763,11 @@ fixed_width = "true" [/linked_group] + [linked_group] + id = "custom_options_labels" + fixed_width = "true" + [/linked_group] + [tooltip] id = "tooltip" [/tooltip] @@ -765,27 +1020,6 @@ [row] grow_factor = 1 - [column] - grow_factor = 0 - vertical_alignment = "bottom" - - border = "all" - border_size = 5 - horizontal_alignment = "left" - [button] - id = "password" - definition = "default" - - label = _ "Set Password" - [/button] - - [/column] - - [/row] - - [row] - grow_factor = 0 - [column] grow_factor = 0 @@ -1122,6 +1356,38 @@ [/row] + [row] + grow_factor = 0 + + [column] + grow_factor = 0 + + border = "all" + border_size = 5 + horizontal_alignment = "left" + [label] + definition = "default" + + label = _ "Password:" + [/label] + + [/column] + + [column] + grow_factor = 1 + + border = "all" + border_size = 5 + horizontal_alignment = "left" + [text_box] + id = "game_password" + definition = "default" + [/text_box] + + [/column] + + [/row] + [/grid] [/column] @@ -1230,6 +1496,10 @@ {_GUI_MP_CREATE_GENERAL_PANEL} [/layer] + [layer] + {_GUI_MP_CREATE_OPTIONS_PANEL} + [/layer] + [layer] {_GUI_MP_CREATE_SETTING_PANEL} [/layer] @@ -1276,7 +1546,7 @@ horizontal_alignment = "right" [button] id = "ok" - definition = "default" + definition = "large" label = _ "Create Game" [/button] @@ -1291,7 +1561,7 @@ horizontal_alignment = "left" [button] id = "cancel" - definition = "default" + definition = "large" label = _ "Cancel" [/button] @@ -1313,6 +1583,8 @@ [/window] #undef _GUI_MP_CREATE_OPTION_SLIDER +#undef _GUI_MP_CREATE_GENERAL_PANEL +#undef _GUI_MP_CREATE_OPTIONS_PANEL #undef _GUI_MP_CREATE_SETTING_PANEL #undef _GUI_MP_CREATE_TAB_BAR #undef _GUI_MP_CREATE_TAB_PADDING diff --git a/src/gui/dialogs/multiplayer/mp_create_game.cpp b/src/gui/dialogs/multiplayer/mp_create_game.cpp index dc69ca7f3d0..79225b06aa7 100644 --- a/src/gui/dialogs/multiplayer/mp_create_game.cpp +++ b/src/gui/dialogs/multiplayer/mp_create_game.cpp @@ -16,14 +16,14 @@ #include "gui/dialogs/multiplayer/mp_create_game.hpp" -#include -// ^ This is apparently unnecessary, but if removed it doesn't compile... - #include "game_preferences.hpp" #include "gettext.hpp" #include "gui/auxiliary/field.hpp" #include "gui/dialogs/helper.hpp" +#include "gui/dialogs/transient_message.hpp" #include "gui/widgets/integer_selector.hpp" +#include "gui/widgets/button.hpp" +#include "gui/widgets/combobox.hpp" #ifdef GUI2_EXPERIMENTAL_LISTBOX #include "gui/widgets/list.hpp" #else @@ -31,7 +31,12 @@ #endif #include "gui/widgets/minimap.hpp" #include "gui/widgets/settings.hpp" +#include "gui/widgets/slider.hpp" #include "gui/widgets/stacked_widget.hpp" +#include "gui/widgets/toggle_button.hpp" +#include "gui/widgets/text_box.hpp" +#include "gui/widgets/tree_view.hpp" +#include "gui/widgets/tree_view_node.hpp" #include "settings.hpp" #ifdef GUI2_EXPERIMENTAL_LISTBOX @@ -55,8 +60,7 @@ tmp_create_game::tmp_create_game(const config& cfg, ng::create_engine& eng) dialog_callback)) , fog_(register_bool("fog", true, preferences::fog, preferences::set_fog)) - , shroud_(register_bool( - "shroud", true, preferences::shroud, preferences::set_shroud)) + , shroud_(register_bool("shroud", true, preferences::shroud, preferences::set_shroud)) , start_time_(register_bool("random_start_time", true, preferences::random_start_time, @@ -75,6 +79,7 @@ tmp_create_game::tmp_create_game(const config& cfg, ng::create_engine& eng) true, preferences::xp_modifier, preferences::set_xp_modifier)) + //, options_manager_() { } @@ -85,9 +90,8 @@ void tmp_create_game::pre_show(twindow& window) tlistbox& list = find_widget(&window, "map_list", false); #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified(list, - std::bind(&tmp_create_game::update_map, - *this, - std::ref(window))); + std::bind(&tmp_create_game::update_map, + *this, std::ref(window))); #else list.set_callback_value_change( dialog_callback); @@ -137,10 +141,24 @@ void tmp_create_game::pre_show(twindow& window) update_map_settings(window); + // + // Set up eras combobox + // + + const std::vector& era_names = engine_.extras_menu_item_names(ng::create_engine::ERA, false); + if(era_names.empty()) { + gui2::show_transient_message(window.video(), "", _("No eras found.")); + throw config::error(_("No eras found")); + } + + find_widget(&window, "eras", false).set_values(era_names); + + // + // Set up mods list + // tlistbox& mod_list = find_widget(&window, "mod_list", false); - //std::vector mods = engine_.extras_menu_item_names(ng::create_engine::MOD); - + //std::vector mods = engine_.extras_menu_item_names(ng::create_engine::MOD, false); for(const auto& mod : engine_.get_const_extras_by_type(ng::create_engine::MOD)) { std::map data; string_map item; @@ -170,13 +188,16 @@ void tmp_create_game::pre_show(twindow& window) list_data["tab_label"]["label"] = _("General"); tab_bar.add_row(list_data); + list_data["tab_label"]["label"] = _("Custom Options"); + tab_bar.add_row(list_data); + list_data["tab_label"]["label"] = _("Game Settings"); tab_bar.add_row(list_data); tab_bar.select_row(0); on_tab_select(window); - + update_map(window); } @@ -185,6 +206,11 @@ void tmp_create_game::on_tab_select(twindow& window) const int i = find_widget(&window, "tab_bar", false).get_selected_row(); find_widget(&window, "pager", false).select_layer(i); + + // TODO: don't hardcode + if(i == 1) { + update_options_list(window); + } } void tmp_create_game::post_show(twindow& window) @@ -194,6 +220,97 @@ void tmp_create_game::post_show(twindow& window) } } +void tmp_create_game::update_options_list(twindow& window) +{ + const int index = find_widget(&window, "map_list", false) + .get_selected_row(); + + scenario_ = &cfg_.child("multiplayer", index); + + ttree_view& options_tree = find_widget(&window, "custom_options", false); + + //options_tree.clear(); + + for(const auto& options : scenario_->child_range("options")) { + std::map data; + string_map item; + + item["label"] = (*scenario_)["name"]; + data["tree_view_node_label"] = item; + + ttree_view_node& option_node = options_tree.add_node("option_node", data); + + data.clear(); + + for(const auto& checkbox_option : options.child_range("checkbox")) { + item["label"] = checkbox_option["name"]; + data["option_checkbox"] = item; + + ttree_view_node& node = option_node.add_child("option_checkbox_node", data); + + ttoggle_button* checkbox = dynamic_cast(node.find("option_checkbox", true)); + + VALIDATE(checkbox, missing_widget("option_checkbox")); + + checkbox->set_value(checkbox_option["default"].to_bool()); + //checkbox->set_label(checkbox_option["name"].str()); + } + + for(const auto& combobox_option : options.child_range("combo")) { + item["label"] = combobox_option["name"]; + data["combobox_label"] = item; + + ttree_view_node& node = option_node.add_child("option_combobox_node", data); + + std::vector combo_items; + + for(const auto& item : combobox_option.child_range("item")) { + combo_items.push_back(item["name"]); + } + + if(!combo_items.empty()) { + tcombobox* combobox = dynamic_cast(node.find("option_combobox", true)); + + VALIDATE(combobox, missing_widget("option_combobox")); + + combobox->set_values(combo_items); + } + } + + for(const auto& slider_option : options.child_range("slider")) { + item["label"] = slider_option["name"]; + data["slider_label"] = item; + + ttree_view_node& node = option_node.add_child("option_slider_node", data); + + tslider* slider = dynamic_cast(node.find("option_slider", true)); + + VALIDATE(slider, missing_widget("option_slider")); + + slider->set_step_size(slider_option["step"].to_int()); + slider->set_minimum_value(slider_option["min"].to_int()); + slider->set_maximum_value(slider_option["max"].to_int()); + slider->set_value(slider_option["default"].to_int()); + } + + for(const auto& text_entry_option : options.child_range("entry")) { + item["label"] = text_entry_option["name"]; + data["text_entry_label"] = item; + + ttree_view_node& node = option_node.add_child("option_text_entry_node", data); + + ttext_box* textbox = dynamic_cast(node.find("option_text_entry", true)); + + VALIDATE(textbox, missing_widget("option_text_entry")); + + textbox->set_value(text_entry_option["default"].str()); + } + + // Add the Defaults button at the end + option_node.add_child("options_default_button", {}); + } +} + void tmp_create_game::update_map(twindow& window) { tminimap& minimap = find_widget(&window, "minimap", false); @@ -202,15 +319,15 @@ void tmp_create_game::update_map(twindow& window) tcontrol& map_size = find_widget(&window, "map_size", false); const int index = find_widget(&window, "map_list", false) - .get_selected_row(); + .get_selected_row(); + + engine_.set_current_level(index); - // TODO: fix for different selections ng::scenario* current_scenario = dynamic_cast(&engine_.current_level()); //if(index >= 0) { - config::const_child_itors children = cfg_.child_range("multiplayer"); - std::advance(children.first, index); - scenario_ = &*children.first; + scenario_ = &cfg_.child("multiplayer", index); + minimap.set_map_data((*scenario_)["map_data"]); description.set_label((*scenario_)["description"]); players.set_label(std::to_string(current_scenario->num_players())); @@ -222,6 +339,10 @@ void tmp_create_game::update_map(twindow& window) //} update_map_settings(window); + + if(find_widget(&window, "tab_bar", false).get_selected_row() == 1) { + update_options_list(window); + } } void tmp_create_game::update_map_settings(twindow& window) @@ -243,20 +364,12 @@ void tmp_create_game::update_map_settings(twindow& window) fog_->set_widget_value(window, side["fog"].to_bool(true)); shroud_->set_widget_value(window, side["shroud"].to_bool(false)); - start_time_->set_widget_value( - window, (*scenario_)["random_start_time"].to_bool(true)); + start_time_->set_widget_value(window, (*scenario_)["random_start_time"].to_bool(true)); - turns_->set_widget_value( - window, ::settings::get_turns((*scenario_)["turns"].str())); - gold_->set_widget_value( - window, ::settings::get_village_gold(side["village_gold"].str())); - support_->set_widget_value( - window, - ::settings::get_village_support(side["village_support"].str())); - experience_->set_widget_value( - window, - ::settings::get_xp_modifier( - (*scenario_)["experience_modifier"].str())); + turns_->set_widget_value(window, ::settings::get_turns((*scenario_)["turns"].str())); + gold_->set_widget_value(window, ::settings::get_village_gold(side["village_gold"].str())); + support_->set_widget_value(window,::settings::get_village_support(side["village_support"].str())); + experience_->set_widget_value(window,::settings::get_xp_modifier((*scenario_)["experience_modifier"].str())); } // No scenario selected just leave the state unchanged for now. diff --git a/src/gui/dialogs/multiplayer/mp_create_game.hpp b/src/gui/dialogs/multiplayer/mp_create_game.hpp index 091f65e467b..6e07abf088b 100644 --- a/src/gui/dialogs/multiplayer/mp_create_game.hpp +++ b/src/gui/dialogs/multiplayer/mp_create_game.hpp @@ -18,6 +18,7 @@ #include "gui/dialogs/dialog.hpp" #include "game_initialization/create_engine.hpp" +#include "game_initialization/mp_options.hpp" class config; @@ -45,6 +46,8 @@ private: ng::create_engine& engine_; + //mp::options::manager options_manager_; + /** * All fields are also in the normal field vector, but they need to be * manually controlled as well so add the pointers here as well. @@ -56,6 +59,8 @@ private: void on_tab_select(twindow& window); + void update_options_list(twindow& window); + public: // another map selected void update_map(twindow& window);