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:
parent
73627767db
commit
2beab91bd2
2 changed files with 83 additions and 53 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue