Campaign Dialog: reimplement Mods section as an always-visible dropdown w/ checkboxes

This commit is contained in:
Charles Dang 2017-02-14 01:08:00 +11:00
parent d3c53e4f0d
commit 66b590b732
3 changed files with 199 additions and 199 deletions

View file

@ -3,6 +3,129 @@
### Definition of the window select the campaign to play
###
#define _GUI_CAMPAIGN_TREE
[tree_view]
id = "campaign_tree"
definition = "default"
horizontal_scrollbar_mode = "never"
vertical_scrollbar_mode = "always"
indentation_step_size = 20
[node]
id = "campaign"
[node_definition]
[row]
[column]
horizontal_grow = "true"
[toggle_panel]
id = "tree_view_node_label"
definition = "default"
#horizontal_grow = "true"
return_value_id = "ok"
[grid]
[row]
[column]
border = "all"
border_size = 5
vertical_alignment = "top"
[stacked_widget]
definition = "default"
linked_group = "icon_area"
[layer]
[row]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "left"
border_size = 3
[image]
id = "victory"
definition = "default"
label = "misc/blank-hex.png"
[/image]
[/column]
[/row]
[/layer]
[layer]
[row]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "left"
border_size = 3
[image]
id = "icon"
definition = "default"
label = "misc/laurel.png"
[/image]
[/column]
[/row]
[/layer]
[/stacked_widget]
[/column]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "right"
border_size = 8
[label]
id = "name"
definition = "default"
linked_group = "name"
[/label]
[/column]
[/row]
[/grid]
[/toggle_panel]
[/column]
[/row]
[/node_definition]
[/node]
[/tree_view]
#enddef
[window]
id = "campaign_selection"
description = "Campaign selection dialog."
@ -66,193 +189,63 @@
[grid]
[row]
grow_factor = 1
[column]
grow_factor = 0
border = "all"
border_size = 5
horizontal_alignment = "left"
[grid]
[tree_view]
id = "campaign_tree"
definition = "default"
[row]
grow_factor = 1
horizontal_scrollbar_mode = "never"
vertical_scrollbar_mode = "always"
[column]
grow_factor = 0
indentation_step_size = 20
border = "all"
border_size = 5
horizontal_grow = true
[node]
id = "campaign_group"
unfolded = true
[node_definition]
{_GUI_CAMPAIGN_TREE}
[row]
[/column]
[column]
[/row]
[toggle_button]
id = "tree_view_node_icon"
definition = "tree_view_node"
[/toggle_button]
[row]
[/column]
[column]
grow_factor = 1
horizontal_grow = true
border = "all"
border_size = 5
[column]
grow_factor = 1
horizontal_grow = "true"
[label]
definition = "default"
label = _ "Modifications"
[/label]
[label]
id = "tree_view_node_label"
label = "group"
[/label]
[/column]
[/column]
[/row]
[/row]
[row]
[/node_definition]
[column]
grow_factor = 1
horizontal_grow = true
border = "all"
border_size = 5
[/node]
[menu_button]
id = "mods_menu"
definition = "default"
[/menu_button]
[node]
id = "modification"
[/column]
[node_definition]
[/row]
[row]
[column]
border = "all"
border_size = 5
horizontal_grow = "true"
[toggle_button]
id = "checkb"
definition = "default"
[/toggle_button]
[/column]
[/row]
[/node_definition]
[/node]
[node]
id = "campaign"
[node_definition]
[row]
[column]
horizontal_grow = "true"
[toggle_panel]
id = "tree_view_node_label"
definition = "default"
# horizontal_grow = "true"
return_value_id = "ok"
[grid]
[row]
[column]
border = "all"
border_size = 5
vertical_alignment = "top"
[stacked_widget]
definition = "default"
linked_group = "icon_area"
[layer]
[row]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "left"
border_size = 3
[image]
id = "victory"
definition = "default"
label = "misc/blank-hex.png"
[/image]
[/column]
[/row]
[/layer]
[layer]
[row]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "left"
border_size = 3
[image]
id = "icon"
definition = "default"
label = "misc/laurel.png"
[/image]
[/column]
[/row]
[/layer]
[/stacked_widget]
[/column]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "right"
border_size = 8
[label]
id = "name"
definition = "default"
linked_group = "name"
[/label]
[/column]
[/row]
[/grid]
[/toggle_panel]
[/column]
[/row]
[/node_definition]
[/node]
[/tree_view]
[/grid]
[/column]
@ -410,3 +403,5 @@
[/resolution]
[/window]
#undef _GUI_CAMPAIGN_TREE

View file

@ -16,6 +16,7 @@
#include "gui/dialogs/campaign_selection.hpp"
#include "config_assign.hpp"
#include "game_preferences.hpp"
#include "gui/auxiliary/find_widget.hpp"
#include "gui/dialogs/helper.hpp"
@ -27,6 +28,7 @@
#else
#include "gui/widgets/listbox.hpp"
#endif
#include "gui/widgets/menu_button.hpp"
#include "gui/widgets/multi_page.hpp"
#include "gui/widgets/scroll_label.hpp"
#include "gui/widgets/settings.hpp"
@ -40,6 +42,8 @@
#include "utils/functional.hpp"
#include "video.hpp"
#include <boost/dynamic_bitset.hpp>
namespace gui2
{
namespace dialogs
@ -160,38 +164,26 @@ void campaign_selection::pre_show(window& window)
pages.add_page(data);
}
//
// Set up Mods selection dropdown
//
menu_button& mods_menu = find_widget<menu_button>(&window, "mods_menu", false);
if(!engine_.get_const_extras_by_type(ng::create_engine::MOD).empty()) {
std::map<std::string, string_map> data;
string_map item;
item["label"] = "Modifications";
data.emplace("tree_view_node_label", item);
tree_view_node& mods_node = tree.add_node("campaign_group", data);
std::vector<config> mod_menu_values;
std::vector<std::string> enabled = engine_.active_mods();
id = 0;
for(const auto& mod : engine_.get_const_extras_by_type(ng::create_engine::MOD)) {
data.clear();
item.clear();
const bool active = std::find(enabled.begin(), enabled.end(), mod->id) != enabled.end();
bool active = std::find(enabled.begin(), enabled.end(), mod->id) != enabled.end();
/*** Add tree item ***/
item["label"] = mod->name;
data.emplace("checkb", item);
tree_view_node& node = mods_node.add_child("modification", data);
toggle_button* checkbox = dynamic_cast<toggle_button*>(node.find("checkb", true));
VALIDATE(checkbox, missing_widget("checkb"));
checkbox->set_value(active);
checkbox->set_label(mod->name);
checkbox->set_callback_state_change(std::bind(&campaign_selection::mod_toggled, this, id, _1));
++id;
mod_menu_values.push_back(config_of("label", mod->name)("checkbox", active));
}
mods_menu.set_values(mod_menu_values);
} else {
mods_menu.set_active(false);
mods_menu.set_label(_("None"));
}
campaign_selected(window);
@ -220,10 +212,24 @@ void campaign_selection::post_show(window& window)
deterministic_ = find_widget<toggle_button>(&window, "checkbox_deterministic", false).get_value_bool();
/* NOTE: it might be worth adding an ability to specify callback functions for drop down menu
* checkboxes but for now this works. I'm leaving mod_toggled() as its own function for now in
* case I want to implement such a thing later.
*
* Also, this needs to be done before calling preferences::set_modifications.
* - vultraz 2/14/2017
*/
boost::dynamic_bitset<> toggled_mods = find_widget<menu_button>(&window, "mods_menu", false).get_toggle_states();
for(unsigned i = 0; i < toggled_mods.size(); i++) {
if(toggled_mods[i]) {
mod_toggled(i);
}
}
preferences::set_modifications(engine_.active_mods(), false);
}
void campaign_selection::mod_toggled(int id, widget &)
void campaign_selection::mod_toggled(int id /*, widget &*/)
{
engine_.set_current_mod_index(id);
engine_.toggle_current_mod();

View file

@ -27,10 +27,10 @@ namespace dialogs
class campaign_selection : public modal_dialog
{
public:
explicit campaign_selection(ng::create_engine& eng) :
engine_(eng),
choice_(-1),
deterministic_(false)
explicit campaign_selection(ng::create_engine& eng)
: engine_(eng)
, choice_(-1)
, deterministic_(false)
{
set_restore(true);
}
@ -62,8 +62,7 @@ private:
/** Inherited from modal_dialog. */
void post_show(window& window);
void mod_toggled(int id, widget &);
void mod_toggled(int id /*, widget&*/);
ng::create_engine& engine_;