Select Orb Colors: cleaned up dialog implementation

Also fixes #2958 in the process since the entire setup process isn't repeated
when resetting selections.
This commit is contained in:
Charles Dang 2018-06-16 19:57:18 +11:00
parent 73627767db
commit 2beab91bd2
2 changed files with 83 additions and 53 deletions

View file

@ -24,15 +24,23 @@
#include "gui/widgets/toggle_button.hpp"
#include "gui/widgets/window.hpp"
#include "preferences/general.hpp"
#include "game_config.hpp"
#include "preferences/general.hpp"
#include "utils/functional.hpp"
namespace gui2
{
namespace dialogs
{
namespace
{
std::string get_orb_widget_prefix(const std::string& base_id)
{
return "orb_" + base_id + "_";
}
} // end anon namespace
REGISTER_DIALOG(select_orb_colors)
select_orb_colors::select_orb_colors()
@ -46,83 +54,100 @@ select_orb_colors::select_orb_colors()
void select_orb_colors::pre_show(window& window)
{
setup_orb_group("unmoved", show_unmoved_, preferences::unmoved_color(), window);
setup_orb_group("partial", show_partial_, preferences::partial_color(), window);
setup_orb_group("moved", show_moved_, preferences::moved_color(), window);
setup_orb_group("ally", show_ally_, preferences::allied_color(), window);
setup_orb_group("enemy", show_enemy_, preferences::enemy_color(), window);
setup_orb_group("unmoved", show_unmoved_, preferences::unmoved_color());
setup_orb_group("partial", show_partial_, preferences::partial_color());
setup_orb_group("moved", show_moved_, preferences::moved_color());
setup_orb_group("ally", show_ally_, preferences::allied_color());
setup_orb_group("enemy", show_enemy_, preferences::enemy_color());
button& reset = find_widget<button>(&window, "orb_defaults", false);
connect_signal_mouse_left_click(reset, std::bind(
&select_orb_colors::handle_reset_click,
this, std::ref(window)
));
connect_signal_mouse_left_click(find_widget<button>(&window, "orb_defaults", false),
std::bind(&select_orb_colors::reset_orb_callback, this));
}
void select_orb_colors::post_show(window&)
{
if(get_retval() == retval::OK) {
preferences::set_show_unmoved_orb(show_unmoved_);
preferences::set_show_partial_orb(show_partial_);
preferences::set_show_moved_orb(show_moved_);
preferences::set_show_allied_orb(show_ally_);
preferences::set_show_enemy_orb(show_enemy_);
preferences::set_unmoved_color(groups_["unmoved"].get_active_member_value());
preferences::set_partial_color(groups_["partial"].get_active_member_value());
preferences::set_moved_color(groups_["moved"].get_active_member_value());
preferences::set_allied_color(groups_["ally"].get_active_member_value());
preferences::set_enemy_color(groups_["enemy"].get_active_member_value());
if(get_retval() != retval::OK) {
return;
}
preferences::set_show_unmoved_orb(show_unmoved_);
preferences::set_show_partial_orb(show_partial_);
preferences::set_show_moved_orb(show_moved_);
preferences::set_show_allied_orb(show_ally_);
preferences::set_show_enemy_orb(show_enemy_);
preferences::set_unmoved_color(groups_["unmoved"].get_active_member_value());
preferences::set_partial_color(groups_["partial"].get_active_member_value());
preferences::set_moved_color(groups_["moved"].get_active_member_value());
preferences::set_allied_color(groups_["ally"].get_active_member_value());
preferences::set_enemy_color(groups_["enemy"].get_active_member_value());
}
void select_orb_colors::setup_orb_group(const std::string& base_id, bool& shown, const std::string& initial, window& window, bool connect)
void select_orb_colors::setup_orb_group(const std::string& base_id, bool& shown, const std::string& initial)
{
std::string prefix = "orb_" + base_id + "_";
toggle_button& toggle = find_widget<toggle_button>(&window, prefix + "show", false);
toggle.set_value_bool(shown);
if(connect) {
connect_signal_mouse_left_click(toggle, std::bind(
&select_orb_colors::handle_toggle_click,
this,
std::ref(shown)
));
}
const std::string prefix = get_orb_widget_prefix(base_id);
grid& selection = find_widget<grid>(&window, prefix + "selection", false);
//
// Set up the "show this group of orbs" toggle.
//
toggle_button& toggle = find_widget<toggle_button>(get_window(), prefix + "show", false);
toggle.set_value_bool(shown);
connect_signal_mouse_left_click(toggle,
std::bind(&select_orb_colors::toggle_orb_callback, this, std::ref(shown)));
//
// Set up the toggle group.
//
group<std::string>& group = groups_[base_id];
using iteration::walker_base;
std::unique_ptr<walker_base> iter(selection.create_walker());
grid& selection = find_widget<grid>(get_window(), prefix + "selection", false);
std::unique_ptr<iteration::walker_base> iter(selection.create_walker());
while(!iter->at_end(walker_base::child)) {
widget* next = iter->get(walker_base::child);
if(toggle_button* button = dynamic_cast<toggle_button*>(next)) {
const std::string& id = button->id();
group.add_member(button, id.substr(prefix.size()));
}
iter->next(walker_base::child);
}
group.set_member_states(initial);
}
void select_orb_colors::handle_toggle_click(bool& storage)
void select_orb_colors::reset_orb_group(const std::string& base_id, bool& shown, const std::string& initial)
{
const std::string prefix = get_orb_widget_prefix(base_id);
toggle_button& toggle = find_widget<toggle_button>(get_window(), prefix + "show", false);
toggle.set_value_bool(shown);
groups_[base_id].set_member_states(initial);
}
void select_orb_colors::toggle_orb_callback(bool& storage)
{
storage = !storage;
}
void select_orb_colors::handle_reset_click(window& window)
void select_orb_colors::reset_orb_callback()
{
show_unmoved_ = game_config::show_unmoved_orb;
show_partial_ = game_config::show_partial_orb;
show_moved_ = game_config::show_moved_orb;
show_ally_ = game_config::show_ally_orb;
show_enemy_ = game_config::show_enemy_orb;
show_moved_ = game_config::show_moved_orb;
show_ally_ = game_config::show_ally_orb;
show_enemy_ = game_config::show_enemy_orb;
setup_orb_group("unmoved", show_unmoved_, game_config::colors::unmoved_orb_color, window, false);
setup_orb_group("partial", show_partial_, game_config::colors::partial_orb_color, window, false);
setup_orb_group("moved", show_moved_, game_config::colors::moved_orb_color, window, false);
setup_orb_group("ally", show_ally_, game_config::colors::ally_orb_color, window, false);
setup_orb_group("enemy", show_enemy_, game_config::colors::enemy_orb_color, window, false);
reset_orb_group("unmoved", show_unmoved_, game_config::colors::unmoved_orb_color);
reset_orb_group("partial", show_partial_, game_config::colors::partial_orb_color);
reset_orb_group("moved", show_moved_, game_config::colors::moved_orb_color);
reset_orb_group("ally", show_ally_, game_config::colors::ally_orb_color);
reset_orb_group("enemy", show_enemy_, game_config::colors::enemy_orb_color);
}
} // namespace dialogs

View file

@ -15,15 +15,15 @@
#include "gui/dialogs/modal_dialog.hpp"
#include "gui/widgets/group.hpp"
#include <map>
namespace gui2
{
namespace dialogs
{
class select_orb_colors : public modal_dialog {
class select_orb_colors : public modal_dialog
{
public:
select_orb_colors();
@ -35,11 +35,15 @@ public:
DEFINE_SIMPLE_DISPLAY_WRAPPER(select_orb_colors)
private:
void setup_orb_group(const std::string& base_id, bool& shown, const std::string& initial, window& window, bool connect = true);
void handle_toggle_click(bool& storage);
void handle_reset_click(window& window);
void setup_orb_group(const std::string& base_id, bool& shown, const std::string& initial);
void reset_orb_group(const std::string& base_id, bool& shown, const std::string& initial);
void toggle_orb_callback(bool& storage);
void reset_orb_callback();
bool show_unmoved_, show_partial_, show_moved_, show_ally_, show_enemy_;
std::map<std::string, group<std::string>> groups_;
/** Inherited from modal_dialog, implemented by REGISTER_DIALOG. */
@ -47,6 +51,7 @@ private:
/** Inherited from modal_dialog. */
virtual void pre_show(window& window) override;
/** Inherited from modal_dialog. */
virtual void post_show(window& window) override;
};