initial commit, lordsawar source, slightly modified
[lordsawar] / src / gui / game-options-dialog.cpp
1 //  Copyright (C) 2007, 2008, 2009 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 "glade-helpers.h"
26 #include "input-helpers.h"
27 #include "ucompose.hpp"
28 #include "defs.h"
29 #include "File.h"
30 #include "Configuration.h"
31 #include "GameScenarioOptions.h"
32
33 GameOptionsDialog::GameOptionsDialog(bool readonly)
34 {
35     Glib::RefPtr<Gtk::Builder> xml
36         = Gtk::Builder::create_from_file(get_glade_path()
37                                     + "/game-options-dialog.ui");
38
39     xml->get_widget("dialog", dialog);
40     decorate(dialog);
41     window_closed.connect(sigc::mem_fun(dialog, &Gtk::Dialog::hide));
42     dialog->set_icon_from_file(File::getMiscFile("various/castle_icon.png"));
43
44     d_readonly = readonly;
45     xml->get_widget("difficultoptionstable", difficultoptionstable);
46     xml->get_widget("notdifficultoptionstable", notdifficultoptionstable);
47     xml->get_widget("view_enemies_checkbutton", view_enemies_checkbutton);
48     xml->get_widget("view_production_checkbutton", view_production_checkbutton);
49     xml->get_widget("quests_combobox", quests_combobox);
50     xml->get_widget("hidden_map_checkbutton", hidden_map_checkbutton);
51     xml->get_widget("neutral_combobox", neutral_cities_combobox);
52     xml->get_widget("razing_combobox", razing_cities_combobox);
53     xml->get_widget("diplomacy_checkbutton", diplomacy_checkbutton);
54     xml->get_widget("military_advisor_checkbutton", 
55                     military_advisor_checkbutton);
56     xml->get_widget("quick_start_combobox", quick_start_combobox);
57     xml->get_widget("cusp_of_war_checkbutton", cusp_of_war_checkbutton);
58     xml->get_widget("intense_combat_checkbutton", intense_combat_checkbutton);
59     xml->get_widget("random_turns_checkbutton", random_turns_checkbutton);
60         
61 }
62
63 GameOptionsDialog::~GameOptionsDialog()
64 {
65   delete dialog;
66 }
67
68 void GameOptionsDialog::fill_in_options()
69 {
70     neutral_cities_combobox->set_active(GameParameters::AVERAGE);
71     razing_cities_combobox->set_active(GameParameters::ALWAYS);
72
73     view_enemies_checkbutton->set_active(GameScenarioOptions::s_see_opponents_stacks);
74     view_production_checkbutton->set_active(GameScenarioOptions::s_see_opponents_production);
75     quests_combobox->set_active(int(GameScenarioOptions::s_play_with_quests));
76     hidden_map_checkbutton->set_active(GameScenarioOptions::s_hidden_map);
77     neutral_cities_combobox->set_active(int(GameScenarioOptions::s_neutral_cities));
78     razing_cities_combobox->set_active(int(GameScenarioOptions::s_razing_cities));
79     diplomacy_checkbutton->set_active(GameScenarioOptions::s_diplomacy);
80     military_advisor_checkbutton->set_active(GameScenarioOptions::s_military_advisor);
81     quick_start_combobox->set_active(Configuration::s_quick_start);
82     cusp_of_war_checkbutton->set_active(GameScenarioOptions::s_cusp_of_war);
83     cusp_of_war_checkbutton->set_sensitive(diplomacy_checkbutton->get_active());
84     intense_combat_checkbutton->set_active(GameScenarioOptions::s_intense_combat);
85     random_turns_checkbutton->set_active(GameScenarioOptions::s_random_turns);
86     if (d_readonly)
87       {
88         difficultoptionstable->set_sensitive(false);
89         notdifficultoptionstable->set_sensitive(false);
90       }
91 }
92 void GameOptionsDialog::set_parent_window(Gtk::Window &parent)
93 {
94     dialog->set_transient_for(parent);
95     //dialog->set_position(Gtk::WIN_POS_CENTER_ON_PARENT);
96 }
97
98 void GameOptionsDialog::hide()
99 {
100   dialog->hide();
101 }
102
103 bool GameOptionsDialog::run()
104 {
105   std::list<sigc::connection> connections;
106     GameParameters g;
107     fill_in_options();
108     connections.push_back
109       (view_enemies_checkbutton->signal_clicked().connect
110        (sigc::mem_fun
111         (this, &GameOptionsDialog::on_view_enemies_checkbutton_clicked)));
112     connections.push_back
113       (view_production_checkbutton->signal_clicked().connect
114        (sigc::mem_fun
115         (this, &GameOptionsDialog::on_view_production_checkbutton_clicked)));
116     connections.push_back
117       (quests_combobox->signal_changed().connect
118        (sigc::mem_fun
119         (this, &GameOptionsDialog::on_quests_combobox_changed)));
120     connections.push_back
121       (hidden_map_checkbutton->signal_clicked().connect
122        (sigc::mem_fun
123         (this, &GameOptionsDialog::on_hidden_map_checkbutton_clicked)));
124     connections.push_back
125       (neutral_cities_combobox->signal_changed().connect
126        (sigc::mem_fun
127         (this, &GameOptionsDialog::on_neutral_cities_combobox_changed)));
128     connections.push_back
129       (razing_cities_combobox->signal_changed().connect
130        (sigc::mem_fun
131         (this, &GameOptionsDialog::on_razing_cities_combobox_changed)));
132     connections.push_back
133       (diplomacy_checkbutton->signal_clicked().connect
134        (sigc::mem_fun
135         (this, &GameOptionsDialog::on_diplomacy_checkbutton_clicked)));
136     connections.push_back
137       (cusp_of_war_checkbutton->signal_clicked().connect
138        (sigc::mem_fun
139         (this, &GameOptionsDialog::on_cusp_of_war_checkbutton_clicked)));
140     connections.push_back
141       (random_turns_checkbutton->signal_clicked().connect
142        (sigc::mem_fun
143         (this, &GameOptionsDialog::on_random_turns_checkbutton_clicked)));
144     connections.push_back
145       (quick_start_combobox->signal_changed().connect
146        (sigc::mem_fun
147         (this, &GameOptionsDialog::on_quick_start_combobox_changed)));
148     connections.push_back
149       (intense_combat_checkbutton->signal_clicked().connect
150        (sigc::mem_fun
151         (this, &GameOptionsDialog::on_intense_combat_checkbutton_clicked)));
152     connections.push_back
153       (military_advisor_checkbutton->signal_clicked().connect
154        (sigc::mem_fun
155         (this, &GameOptionsDialog::on_military_advisor_checkbutton_clicked)));
156
157     dialog->run();
158   
159     std::list<sigc::connection>::iterator it = connections.begin();
160     for (; it != connections.end(); it++) 
161       (*it).disconnect();
162     connections.clear();
163     
164     g.see_opponents_stacks = view_enemies_checkbutton->get_active();
165     GameScenarioOptions::s_see_opponents_stacks = g.see_opponents_stacks;
166     g.see_opponents_production = view_production_checkbutton->get_active();
167     GameScenarioOptions::s_see_opponents_production = g.see_opponents_production;
168     g.play_with_quests = GameParameters::QuestPolicy (
169         quests_combobox->get_active_row_number());
170     GameScenarioOptions::s_play_with_quests = g.play_with_quests;
171
172     g.hidden_map = hidden_map_checkbutton->get_active();
173     GameScenarioOptions::s_hidden_map = g.hidden_map;
174
175     g.neutral_cities = GameParameters::NeutralCities (
176         neutral_cities_combobox->get_active_row_number());
177     GameScenarioOptions::s_neutral_cities = g.neutral_cities;
178     g.razing_cities = GameParameters::RazingCities (
179         razing_cities_combobox->get_active_row_number());
180     GameScenarioOptions::s_razing_cities = g.razing_cities;
181
182     g.diplomacy = diplomacy_checkbutton->get_active();
183     GameScenarioOptions::s_diplomacy = g.diplomacy;
184     g.random_turns = random_turns_checkbutton->get_active();
185     GameScenarioOptions::s_random_turns = g.random_turns;
186     g.quick_start = GameParameters::QuickStartPolicy(
187         quick_start_combobox->get_active_row_number());
188     Configuration::s_quick_start = g.quick_start;
189     g.cusp_of_war = cusp_of_war_checkbutton->get_active();
190     GameScenarioOptions::s_cusp_of_war = g.cusp_of_war;
191     g.intense_combat = intense_combat_checkbutton->get_active();
192     GameScenarioOptions::s_intense_combat = g.intense_combat;
193     g.military_advisor = military_advisor_checkbutton->get_active();
194     GameScenarioOptions::s_military_advisor = g.military_advisor;
195     //save it all to Configuration too
196     Configuration::s_see_opponents_stacks = 
197       GameScenarioOptions::s_see_opponents_stacks;
198     Configuration::s_see_opponents_production = 
199       GameScenarioOptions::s_see_opponents_production;
200     Configuration::s_play_with_quests = GameScenarioOptions::s_play_with_quests;
201     Configuration::s_hidden_map = GameScenarioOptions::s_hidden_map;
202     Configuration::s_neutral_cities = GameScenarioOptions::s_neutral_cities;
203     Configuration::s_razing_cities = GameScenarioOptions::s_razing_cities;
204     Configuration::s_diplomacy = GameScenarioOptions::s_diplomacy;
205     Configuration::s_random_turns = GameScenarioOptions::s_random_turns;
206     Configuration::s_cusp_of_war = GameScenarioOptions::s_cusp_of_war;
207     Configuration::s_intense_combat = GameScenarioOptions::s_intense_combat;
208     Configuration::s_military_advisor = GameScenarioOptions::s_military_advisor;
209     Configuration::saveConfigurationFile(Configuration::configuration_file_path);
210     dialog->hide();
211     return true;
212 }
213
214 void GameOptionsDialog::on_view_enemies_checkbutton_clicked()
215 {
216   GameScenarioOptions::s_see_opponents_stacks = 
217     view_enemies_checkbutton->get_active();
218   difficulty_option_changed.emit();
219 }
220 void GameOptionsDialog::on_view_production_checkbutton_clicked()
221 {
222   GameScenarioOptions::s_see_opponents_production = 
223     view_production_checkbutton->get_active();
224   difficulty_option_changed.emit();
225 }
226 void GameOptionsDialog::on_quests_combobox_changed()
227 {
228   GameScenarioOptions::s_play_with_quests = GameParameters::QuestPolicy
229     (quests_combobox->get_active_row_number());
230   difficulty_option_changed.emit();
231 }
232 void GameOptionsDialog::on_hidden_map_checkbutton_clicked()
233 {
234   GameScenarioOptions::s_hidden_map = hidden_map_checkbutton->get_active();
235   difficulty_option_changed.emit();
236 }
237 void GameOptionsDialog::on_neutral_cities_combobox_changed()
238 {
239   GameScenarioOptions::s_neutral_cities = GameParameters::NeutralCities 
240     (neutral_cities_combobox->get_active_row_number());
241   difficulty_option_changed.emit();
242 }
243 void GameOptionsDialog::on_razing_cities_combobox_changed()
244 {
245   GameScenarioOptions::s_razing_cities = GameParameters::RazingCities 
246     (razing_cities_combobox->get_active_row_number());
247   difficulty_option_changed.emit();
248 }
249 void GameOptionsDialog::on_diplomacy_checkbutton_clicked()
250 {
251   if (diplomacy_checkbutton->get_active() == true)
252     cusp_of_war_checkbutton->set_sensitive(true);
253   else
254     cusp_of_war_checkbutton->set_sensitive(false);
255   GameScenarioOptions::s_diplomacy = diplomacy_checkbutton->get_active();
256   difficulty_option_changed.emit();
257 }
258 void GameOptionsDialog::on_cusp_of_war_checkbutton_clicked()
259 {
260   GameScenarioOptions::s_cusp_of_war = cusp_of_war_checkbutton->get_active();
261   difficulty_option_changed.emit();
262 }
263 void GameOptionsDialog::on_random_turns_checkbutton_clicked()
264 {
265   GameScenarioOptions::s_random_turns = random_turns_checkbutton->get_active();
266 }
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 void GameOptionsDialog::on_intense_combat_checkbutton_clicked()
274 {
275   GameScenarioOptions::s_intense_combat = intense_combat_checkbutton->get_active();
276 }
277 void GameOptionsDialog::on_military_advisor_checkbutton_clicked()
278 {
279   GameScenarioOptions::s_military_advisor = 
280     military_advisor_checkbutton->get_active();
281 }