1 // Copyright (C) 2007, 2008, 2009, 2011, 2014, 2017 Ben Asselstine
2 //
3 // This program is free software; you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation; either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU Library General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program; if not, write to the Free Software
15 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16 // 02110-1301, USA.
17
18 #include <config.h>
19
20 #include <gtkmm.h>
21 #include <sigc++/functors/mem_fun.h>
22
23 #include "game-options-dialog.h"
24
25 #include "Configuration.h"
26 #include "GameScenarioOptions.h"
27
28 #define method(x) sigc::mem_fun(*this, &GameOptionsDialog::x)
29
GameOptionsDialog(Gtk::Window & parent,bool readonly)30 GameOptionsDialog::GameOptionsDialog(Gtk::Window &parent, bool readonly)
31 : LwDialog(parent, "game-options-dialog.ui")
32 {
33 d_readonly = readonly;
34 xml->get_widget("difficultoptionstable", difficultoptionstable);
35 xml->get_widget("notdifficultoptionstable", notdifficultoptionstable);
36 xml->get_widget("view_enemies_switch", view_enemies_switch);
37 xml->get_widget("view_production_switch", view_production_switch);
38 xml->get_widget("quests_combobox", quests_combobox);
39 xml->get_widget("hidden_map_switch", hidden_map_switch);
40 xml->get_widget("neutral_combobox", neutral_cities_combobox);
41 xml->get_widget("vectoring_combobox", vectoring_combobox);
42 xml->get_widget("build_production_combobox", build_production_combobox);
43 xml->get_widget("sack_combobox", sack_combobox);
44 xml->get_widget("razing_combobox", razing_cities_combobox);
45 xml->get_widget("diplomacy_switch", diplomacy_switch);
46 xml->get_widget("military_advisor_switch",
47 military_advisor_switch);
48 xml->get_widget("quick_start_combobox", quick_start_combobox);
49 xml->get_widget("cusp_of_war_switch", cusp_of_war_switch);
50 xml->get_widget("intense_combat_switch", intense_combat_switch);
51 xml->get_widget("random_turns_switch", random_turns_switch);
52 xml->get_widget("notebook", notebook);
53 }
54
fill_in_options()55 void GameOptionsDialog::fill_in_options()
56 {
57 neutral_cities_combobox->set_active(GameScenarioOptions::s_neutral_cities);
58 vectoring_combobox->set_active(GameScenarioOptions::s_vectoring_mode);
59 build_production_combobox->set_active(GameScenarioOptions::s_build_production_mode);
60 sack_combobox->set_active(GameScenarioOptions::s_sacking_mode);
61 razing_cities_combobox->set_active(GameScenarioOptions::s_razing_cities);
62
63 view_enemies_switch->set_active(GameScenarioOptions::s_see_opponents_stacks);
64 view_production_switch->set_active(GameScenarioOptions::s_see_opponents_production);
65 quests_combobox->set_active(int(GameScenarioOptions::s_play_with_quests));
66 hidden_map_switch->set_active(GameScenarioOptions::s_hidden_map);
67 razing_cities_combobox->set_active(int(GameScenarioOptions::s_razing_cities));
68 diplomacy_switch->set_active(GameScenarioOptions::s_diplomacy);
69 military_advisor_switch->set_active(GameScenarioOptions::s_military_advisor);
70 quick_start_combobox->set_active(Configuration::s_quick_start);
71 cusp_of_war_switch->set_active(GameScenarioOptions::s_cusp_of_war);
72 cusp_of_war_switch->set_sensitive(diplomacy_switch->get_active());
73 intense_combat_switch->set_active(GameScenarioOptions::s_intense_combat);
74 random_turns_switch->set_active(GameScenarioOptions::s_random_turns);
75 if (d_readonly)
76 {
77 difficultoptionstable->set_sensitive(false);
78 notdifficultoptionstable->set_sensitive(false);
79 }
80 }
81
run()82 bool GameOptionsDialog::run()
83 {
84 std::list<sigc::connection> connections;
85 GameParameters g;
86 fill_in_options();
87 connections.push_back (view_enemies_switch->property_active().signal_changed().connect
88 (method (on_view_enemies_switch_clicked)));
89 connections.push_back (view_production_switch->property_active().signal_changed().connect
90 (method(on_view_production_switch_clicked)));
91 connections.push_back (quests_combobox->signal_changed().connect
92 (method(on_quests_combobox_changed)));
93 connections.push_back (hidden_map_switch->property_active().signal_changed().connect
94 (method(on_hidden_map_switch_clicked)));
95 connections.push_back (neutral_cities_combobox->signal_changed().connect
96 (method(on_neutral_cities_combobox_changed)));
97 connections.push_back (vectoring_combobox->signal_changed().connect
98 (method(on_vectoring_combobox_changed)));
99 connections.push_back (build_production_combobox->signal_changed().connect
100 (method(on_build_production_combobox_changed)));
101 connections.push_back (sack_combobox->signal_changed().connect
102 (method(on_sacking_combobox_changed)));
103 connections.push_back (razing_cities_combobox->signal_changed().connect
104 (method (on_razing_cities_combobox_changed)));
105 connections.push_back (diplomacy_switch->property_active().signal_changed().connect
106 (method (on_diplomacy_switch_clicked)));
107 connections.push_back (cusp_of_war_switch->property_active().signal_changed().connect
108 (method(on_cusp_of_war_switch_clicked)));
109 connections.push_back (random_turns_switch->property_active().signal_changed().connect
110 (method (on_random_turns_switch_clicked)));
111 connections.push_back (quick_start_combobox->signal_changed().connect
112 (method (on_quick_start_combobox_changed)));
113 connections.push_back (intense_combat_switch->property_active().signal_changed().connect
114 (method (on_intense_combat_switch_clicked)));
115 connections.push_back (military_advisor_switch->property_active().signal_changed().connect
116 (method (on_military_advisor_switch_clicked)));
117
118 dialog->run();
119
120 std::list<sigc::connection>::iterator it = connections.begin();
121 for (; it != connections.end(); it++)
122 (*it).disconnect();
123 connections.clear();
124
125 g.see_opponents_stacks = view_enemies_switch->get_active();
126 GameScenarioOptions::s_see_opponents_stacks = g.see_opponents_stacks;
127 g.see_opponents_production = view_production_switch->get_active();
128 GameScenarioOptions::s_see_opponents_production = g.see_opponents_production;
129 g.play_with_quests = GameParameters::QuestPolicy (
130 quests_combobox->get_active_row_number());
131 GameScenarioOptions::s_play_with_quests = g.play_with_quests;
132
133 g.hidden_map = hidden_map_switch->get_active();
134 GameScenarioOptions::s_hidden_map = g.hidden_map;
135
136 g.neutral_cities = GameParameters::NeutralCities (
137 neutral_cities_combobox->get_active_row_number());
138 GameScenarioOptions::s_neutral_cities = g.neutral_cities;
139 g.vectoring_mode = GameParameters::VectoringMode(
140 vectoring_combobox->get_active_row_number());
141 GameScenarioOptions::s_vectoring_mode = g.vectoring_mode;
142 g.build_production_mode = GameParameters::BuildProductionMode(
143 build_production_combobox->get_active_row_number());
144 GameScenarioOptions::s_build_production_mode = g.build_production_mode;
145 g.sacking_mode = GameParameters::SackingMode(
146 sack_combobox->get_active_row_number());
147 GameScenarioOptions::s_sacking_mode = g.sacking_mode;
148 g.razing_cities = GameParameters::RazingCities (
149 razing_cities_combobox->get_active_row_number());
150 GameScenarioOptions::s_razing_cities = g.razing_cities;
151
152 g.diplomacy = diplomacy_switch->get_active();
153 GameScenarioOptions::s_diplomacy = g.diplomacy;
154 g.random_turns = random_turns_switch->get_active();
155 GameScenarioOptions::s_random_turns = g.random_turns;
156 g.quick_start = GameParameters::QuickStartPolicy(
157 quick_start_combobox->get_active_row_number());
158 Configuration::s_quick_start = g.quick_start;
159 g.cusp_of_war = cusp_of_war_switch->get_active();
160 GameScenarioOptions::s_cusp_of_war = g.cusp_of_war;
161 g.intense_combat = intense_combat_switch->get_active();
162 GameScenarioOptions::s_intense_combat = g.intense_combat;
163 g.military_advisor = military_advisor_switch->get_active();
164 GameScenarioOptions::s_military_advisor = g.military_advisor;
165 //save it all to Configuration too
166 Configuration::s_see_opponents_stacks =
167 GameScenarioOptions::s_see_opponents_stacks;
168 Configuration::s_see_opponents_production =
169 GameScenarioOptions::s_see_opponents_production;
170 Configuration::s_play_with_quests = GameScenarioOptions::s_play_with_quests;
171 Configuration::s_hidden_map = GameScenarioOptions::s_hidden_map;
172 Configuration::s_neutral_cities = GameScenarioOptions::s_neutral_cities;
173 Configuration::s_vectoring_mode = GameScenarioOptions::s_vectoring_mode;
174 Configuration::s_build_production_mode = GameScenarioOptions::s_build_production_mode;
175 Configuration::s_sacking_mode = GameScenarioOptions::s_sacking_mode;
176 Configuration::s_razing_cities = GameScenarioOptions::s_razing_cities;
177 Configuration::s_diplomacy = GameScenarioOptions::s_diplomacy;
178 Configuration::s_random_turns = GameScenarioOptions::s_random_turns;
179 Configuration::s_cusp_of_war = GameScenarioOptions::s_cusp_of_war;
180 Configuration::s_intense_combat = GameScenarioOptions::s_intense_combat;
181 Configuration::s_military_advisor = GameScenarioOptions::s_military_advisor;
182 Configuration::saveConfigurationFile();
183 dialog->hide();
184 return true;
185 }
186
on_view_enemies_switch_clicked()187 void GameOptionsDialog::on_view_enemies_switch_clicked()
188 {
189 GameScenarioOptions::s_see_opponents_stacks =
190 view_enemies_switch->get_active();
191 difficulty_option_changed.emit();
192 }
193
on_view_production_switch_clicked()194 void GameOptionsDialog::on_view_production_switch_clicked()
195 {
196 GameScenarioOptions::s_see_opponents_production =
197 view_production_switch->get_active();
198 difficulty_option_changed.emit();
199 }
200
on_quests_combobox_changed()201 void GameOptionsDialog::on_quests_combobox_changed()
202 {
203 GameScenarioOptions::s_play_with_quests = GameParameters::QuestPolicy
204 (quests_combobox->get_active_row_number());
205 difficulty_option_changed.emit();
206 }
207
on_hidden_map_switch_clicked()208 void GameOptionsDialog::on_hidden_map_switch_clicked()
209 {
210 GameScenarioOptions::s_hidden_map = hidden_map_switch->get_active();
211 difficulty_option_changed.emit();
212 }
213
on_neutral_cities_combobox_changed()214 void GameOptionsDialog::on_neutral_cities_combobox_changed()
215 {
216 GameScenarioOptions::s_neutral_cities = GameParameters::NeutralCities
217 (neutral_cities_combobox->get_active_row_number());
218 difficulty_option_changed.emit();
219 }
220
on_vectoring_combobox_changed()221 void GameOptionsDialog::on_vectoring_combobox_changed()
222 {
223 GameScenarioOptions::s_vectoring_mode = GameParameters::VectoringMode
224 (vectoring_combobox->get_active_row_number());
225 }
226
on_build_production_combobox_changed()227 void GameOptionsDialog::on_build_production_combobox_changed()
228 {
229 GameScenarioOptions::s_build_production_mode =
230 GameParameters::BuildProductionMode
231 (build_production_combobox->get_active_row_number());
232 }
233
on_sacking_combobox_changed()234 void GameOptionsDialog::on_sacking_combobox_changed()
235 {
236 GameScenarioOptions::s_sacking_mode =
237 GameParameters::SackingMode (sack_combobox->get_active_row_number());
238 }
239
on_razing_cities_combobox_changed()240 void GameOptionsDialog::on_razing_cities_combobox_changed()
241 {
242 GameScenarioOptions::s_razing_cities = GameParameters::RazingCities
243 (razing_cities_combobox->get_active_row_number());
244 difficulty_option_changed.emit();
245 }
246
on_diplomacy_switch_clicked()247 void GameOptionsDialog::on_diplomacy_switch_clicked()
248 {
249 if (diplomacy_switch->get_active() == true)
250 cusp_of_war_switch->set_sensitive(true);
251 else
252 cusp_of_war_switch->set_sensitive(false);
253 GameScenarioOptions::s_diplomacy = diplomacy_switch->get_active();
254 difficulty_option_changed.emit();
255 }
256
on_cusp_of_war_switch_clicked()257 void GameOptionsDialog::on_cusp_of_war_switch_clicked()
258 {
259 GameScenarioOptions::s_cusp_of_war = cusp_of_war_switch->get_active();
260 }
261
on_random_turns_switch_clicked()262 void GameOptionsDialog::on_random_turns_switch_clicked()
263 {
264 GameScenarioOptions::s_random_turns = random_turns_switch->get_active();
265 }
266
on_quick_start_combobox_changed()267 void GameOptionsDialog::on_quick_start_combobox_changed()
268 {
269 Configuration::s_quick_start = GameParameters::QuickStartPolicy
270 (quick_start_combobox->get_active_row_number());
271 difficulty_option_changed.emit();
272 }
273
on_intense_combat_switch_clicked()274 void GameOptionsDialog::on_intense_combat_switch_clicked()
275 {
276 GameScenarioOptions::s_intense_combat = intense_combat_switch->get_active();
277 }
278
on_military_advisor_switch_clicked()279 void GameOptionsDialog::on_military_advisor_switch_clicked()
280 {
281 GameScenarioOptions::s_military_advisor = military_advisor_switch->get_active();
282 }
283
~GameOptionsDialog()284 GameOptionsDialog::~GameOptionsDialog()
285 {
286 notebook->property_show_tabs () = false;
287 }
288