Mp Create: further progress, including adding a page for custom Options

This commit is contained in:
Charles Dang 2016-08-12 12:22:24 +11:00
parent d83acc004a
commit 62a299d1eb
3 changed files with 459 additions and 69 deletions

View file

@ -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

View file

@ -16,14 +16,14 @@
#include "gui/dialogs/multiplayer/mp_create_game.hpp"
#include <boost/multi_index_container.hpp>
// ^ 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<tmp_create_game,
&tmp_create_game::update_map_settings>))
, 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<tlistbox>(&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<tmp_create_game, &tmp_create_game::update_map>);
@ -137,10 +141,24 @@ void tmp_create_game::pre_show(twindow& window)
update_map_settings(window);
//
// Set up eras combobox
//
const std::vector<std::string>& 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<tcombobox>(&window, "eras", false).set_values(era_names);
//
// Set up mods list
//
tlistbox& mod_list = find_widget<tlistbox>(&window, "mod_list", false);
//std::vector<std::string> mods = engine_.extras_menu_item_names(ng::create_engine::MOD);
//std::vector<std::string> 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<std::string, string_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<tlistbox>(&window, "tab_bar", false).get_selected_row();
find_widget<tstacked_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<tlistbox>(&window, "map_list", false)
.get_selected_row();
scenario_ = &cfg_.child("multiplayer", index);
ttree_view& options_tree = find_widget<ttree_view>(&window, "custom_options", false);
//options_tree.clear();
for(const auto& options : scenario_->child_range("options")) {
std::map<std::string, string_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<ttoggle_button*>(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<std::string> 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<tcombobox*>(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<tslider*>(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<ttext_box*>(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<tminimap>(&window, "minimap", false);
@ -202,15 +319,15 @@ void tmp_create_game::update_map(twindow& window)
tcontrol& map_size = find_widget<tcontrol>(&window, "map_size", false);
const int index = find_widget<tlistbox>(&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<ng::scenario*>(&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<tlistbox>(&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.

View file

@ -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);