The Battle for Wesnoth 1.21.0-dev
 
Loading...
Searching...
No Matches
select_orb_colors.cpp
Go to the documentation of this file.
1/*
2 Copyright (C) 2017 - 2025
3 Part of the Battle for Wesnoth Project https://www.wesnoth.org/
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY.
11
12 See the COPYING file for more details.
13*/
14
15#define GETTEXT_DOMAIN "wesnoth-lib"
16
18
22#include "gui/widgets/grid.hpp"
25
26#include "game_config.hpp"
28#include <functional>
29
30namespace gui2::dialogs
31{
32namespace
33{
34std::string get_orb_widget_prefix(const std::string& base_id)
35{
36 return "orb_" + base_id + "_";
37}
38
39} // namespace
40
41REGISTER_DIALOG(select_orb_colors)
42
44 : modal_dialog(window_id())
45 , show_unmoved_(prefs::get().show_unmoved_orb())
46 , show_partial_(prefs::get().show_partial_orb())
47 , show_disengaged_(prefs::get().show_disengaged_orb())
48 , show_moved_(prefs::get().show_moved_orb())
49 , show_ally_(prefs::get().show_ally_orb())
50 , two_color_ally_(prefs::get().show_status_on_ally_orb())
51 , show_enemy_(prefs::get().show_enemy_orb())
52{
53}
54
56{
57 setup_orb_group("unmoved", show_unmoved_, prefs::get().unmoved_color());
59 setup_orb_group("moved", show_moved_, prefs::get().moved_color());
61 setup_orb_group("enemy", show_enemy_, prefs::get().enemy_color());
62
63 connect_signal_mouse_left_click(
64 find_widget<button>("orb_defaults"), std::bind(&select_orb_colors::reset_orb_callback, this));
65}
66
68{
69 if(get_retval() != retval::OK) {
70 return;
71 }
72
73 prefs::get().set_show_unmoved_orb(show_unmoved_);
74 prefs::get().set_show_partial_orb(show_partial_);
75 prefs::get().set_show_disengaged_orb(show_disengaged_);
76 prefs::get().set_show_moved_orb(show_moved_);
77 prefs::get().set_show_ally_orb(show_ally_);
78 prefs::get().set_show_status_on_ally_orb(two_color_ally_);
79 prefs::get().set_show_enemy_orb(show_enemy_);
80
81 prefs::get().set_unmoved_color(groups_["unmoved"].get_active_member_value());
82 prefs::get().set_partial_color(groups_["partial"].get_active_member_value());
83 prefs::get().set_moved_color(groups_["moved"].get_active_member_value());
84 prefs::get().set_allied_color(groups_["ally"].get_active_member_value());
85 prefs::get().set_enemy_color(groups_["enemy"].get_active_member_value());
86}
87
88void select_orb_colors::setup_orb_toggle(const std::string& base_id, bool& shown)
89{
90 const std::string prefix = get_orb_widget_prefix(base_id);
91 toggle_button& toggle = find_widget<toggle_button>(prefix + "show");
92 toggle.set_value_bool(shown);
93
94 connect_signal_mouse_left_click(toggle, std::bind(&select_orb_colors::toggle_orb_callback, this, std::ref(shown)));
95}
96
97void select_orb_colors::setup_orb_group(const std::string& base_id, bool& shown, const std::string& initial)
98{
99 setup_orb_toggle(base_id, shown);
100
101 //
102 // Set up the toggle group.
103 //
104 group<std::string>& group = groups_[base_id];
105
106 // Grid containing each color option toggle.
107 const std::string prefix = get_orb_widget_prefix(base_id);
108 grid& selection = find_widget<grid>(prefix + "selection");
109
110 for(iteration::bottom_up_iterator<true, false, true> iter(selection); !iter.at_end(); ++iter) {
111 if(toggle_button* button = dynamic_cast<toggle_button*>(iter.get())) {
112 const std::string& id = button->id();
113 group.add_member(button, id.substr(prefix.size()));
114 }
115 }
116
117 group.set_member_states(initial);
118}
119
120void select_orb_colors::setup_orb_group_two_color(const std::string& base_id, bool& shown, bool& two_color, const std::string& initial)
121{
122 setup_orb_group(base_id, shown, initial);
123
124 const std::string prefix = get_orb_widget_prefix(base_id);
125 toggle_button& toggle = find_widget<toggle_button>(prefix + "two_color");
126 toggle.set_value_bool(two_color);
127
128 connect_signal_mouse_left_click(toggle, std::bind(&select_orb_colors::toggle_orb_callback, this, std::ref(two_color)));
129}
130
131void select_orb_colors::reset_orb_toggle(const std::string& base_id, bool shown)
132{
133 const std::string prefix = get_orb_widget_prefix(base_id);
134
135 toggle_button& toggle = find_widget<toggle_button>(prefix + "show");
136 toggle.set_value_bool(shown);
137}
138
139void select_orb_colors::reset_orb_group(const std::string& base_id, bool shown, const std::string& initial)
140{
141 reset_orb_toggle(base_id, shown);
142 groups_[base_id].set_member_states(initial);
143}
144
145void select_orb_colors::reset_orb_group_two_color(const std::string& base_id, bool shown, bool two_color, const std::string& initial)
146{
147 reset_orb_group(base_id, shown, initial);
148
149 const std::string prefix = get_orb_widget_prefix(base_id);
150
151 toggle_button& toggle = find_widget<toggle_button>(prefix + "two_color");
152 toggle.set_value_bool(two_color);
153}
154
156{
157 // The code for the two-color groups uses this for both the main setting and the two_color setting - if
158 // you add any extra logic here, check that it's still also applicable to the two_color setting.
159 storage = !storage;
160}
161
178
179} // namespace dialogs
Simple push button.
Definition button.hpp:36
Abstract base class for all modal dialogs.
void setup_orb_toggle(const std::string &base_id, bool &shown)
The display function.
void reset_orb_group(const std::string &base_id, bool shown, const std::string &initial)
virtual void post_show() override
Actions to be taken after the window has been shown.
virtual void pre_show() override
Actions to be taken before showing the window.
void setup_orb_group(const std::string &base_id, bool &shown, const std::string &initial)
Sets up the checkbox and row of color buttons for the one-color options, including connecting the cal...
void setup_orb_group_two_color(const std::string &base_id, bool &shown, bool &two_color, const std::string &initial)
Sets up two checkboxes and a row of color buttons.
void reset_orb_group_two_color(const std::string &base_id, bool shown, bool two_color, const std::string &initial)
std::map< std::string, group< std::string > > groups_
void reset_orb_toggle(const std::string &base_id, bool shown)
Change the UI's ticked/unticked state.
Base container class.
Definition grid.hpp:32
void add_member(selectable_item *w, const T &value)
Adds a widget/value pair to the group map.
Definition group.hpp:41
void set_member_states(const T &value)
Sets the toggle values for all widgets besides the one associated with the specified value to false.
Definition group.hpp:110
The iterator class.
Definition iterator.hpp:37
bool at_end() const
Has the iterator reached the end?
Definition iterator.hpp:58
void set_value_bool(bool value, bool fire_event=false)
const std::string & id() const
Definition widget.cpp:110
int get_retval()
Definition window.hpp:394
static prefs & get()
void set_allied_color(const std::string &color_id)
void set_enemy_color(const std::string &color_id)
void set_unmoved_color(const std::string &color_id)
void set_partial_color(const std::string &color_id)
void set_moved_color(const std::string &color_id)
This file contains the window object, this object is a top level container which has the event manage...
Contains the base iterator class for the gui2 widgets.
#define REGISTER_DIALOG(window_id)
Wrapper for REGISTER_DIALOG2.
std::string partial_orb_color
std::string moved_orb_color
std::string unmoved_orb_color
std::string ally_orb_color
std::string enemy_orb_color
bool show_status_on_ally_orb
bool show_disengaged_orb
bool show_partial_orb
bool show_unmoved_orb
@ OK
Dialog was closed with the OK button.
Definition retval.hpp:35