initial commit, lordsawar source, slightly modified
[lordsawar] / src / editor / reward-editor-dialog.cpp
1 //  Copyright (C) 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 "reward-editor-dialog.h"
24
25 #include "glade-helpers.h"
26 #include "ucompose.hpp"
27 #include "defs.h"
28 #include "reward.h"
29 #include "ruin.h"
30 #include "Item.h"
31 #include "army.h"
32 #include "GameMap.h"
33 #include "select-item-dialog.h"
34 #include "select-army-dialog.h"
35 #include "select-hidden-ruin-dialog.h"
36 #include "armyproto.h"
37
38 RewardEditorDialog::RewardEditorDialog(Player *player, bool hidden_ruins, Reward *r)
39 {
40   d_player = player;
41   d_hidden_ruins = hidden_ruins;
42   hidden_ruin = NULL;
43   reward = NULL;
44   item = NULL;
45   ally = NULL;
46
47   Glib::RefPtr<Gtk::Builder> xml
48     = Gtk::Builder::create_from_file(get_glade_path()
49                                 + "/reward-editor-dialog.ui");
50
51   xml->get_widget("dialog", dialog);
52
53   xml->get_widget("gold_hbox", gold_hbox);
54   xml->get_widget("gold_radiobutton", gold_radiobutton);
55   gold_radiobutton->signal_toggled().connect
56     (sigc::mem_fun(*this, &RewardEditorDialog::on_gold_toggled));
57   xml->get_widget("item_hbox", item_hbox);
58   xml->get_widget("item_radiobutton", item_radiobutton);
59   item_radiobutton->signal_toggled().connect
60     (sigc::mem_fun(*this, &RewardEditorDialog::on_item_toggled));
61   xml->get_widget("allies_hbox", allies_hbox);
62   xml->get_widget("allies_radiobutton", allies_radiobutton);
63   allies_radiobutton->signal_toggled().connect
64     (sigc::mem_fun(*this, &RewardEditorDialog::on_allies_toggled));
65   xml->get_widget("map_hbox", map_hbox);
66   xml->get_widget("map_radiobutton", map_radiobutton);
67   map_radiobutton->signal_toggled().connect
68     (sigc::mem_fun(*this, &RewardEditorDialog::on_map_toggled));
69   xml->get_widget("hidden_ruin_hbox", hidden_ruin_hbox);
70   xml->get_widget("hidden_ruin_radiobutton", hidden_ruin_radiobutton);
71   hidden_ruin_radiobutton->signal_toggled().connect
72     (sigc::mem_fun(*this, &RewardEditorDialog::on_hidden_ruin_toggled));
73   xml->get_widget("gold_spinbutton", gold_spinbutton);
74   xml->get_widget("randomize_gold_button", randomize_gold_button);
75   randomize_gold_button->signal_clicked().connect
76     (sigc::mem_fun(*this, &RewardEditorDialog::on_randomize_gold_clicked));
77   on_gold_toggled();
78   xml->get_widget("item_button", item_button);
79   item_button->signal_clicked().connect
80     (sigc::mem_fun(*this, &RewardEditorDialog::on_item_clicked));
81   xml->get_widget("clear_item_button", clear_item_button);
82   clear_item_button->signal_clicked().connect
83     (sigc::mem_fun(*this, &RewardEditorDialog::on_clear_item_clicked));
84   xml->get_widget("randomize_item_button", randomize_item_button);
85   randomize_item_button->signal_clicked().connect
86     (sigc::mem_fun(*this, &RewardEditorDialog::on_randomize_item_clicked));
87   set_item_name();
88
89   xml->get_widget("num_allies_spinbutton", num_allies_spinbutton);
90   xml->get_widget("ally_button", ally_button);
91   ally_button->signal_clicked().connect
92     (sigc::mem_fun(*this, &RewardEditorDialog::on_ally_clicked));
93   xml->get_widget("clear_ally_button", clear_ally_button);
94   clear_ally_button->signal_clicked().connect
95     (sigc::mem_fun(*this, &RewardEditorDialog::on_clear_ally_clicked));
96   xml->get_widget("randomize_allies_button", randomize_allies_button);
97   randomize_allies_button->signal_clicked().connect
98     (sigc::mem_fun(*this, &RewardEditorDialog::on_randomize_allies_clicked));
99   set_ally_name();
100
101   xml->get_widget("map_x_spinbutton", map_x_spinbutton);
102   xml->get_widget("map_y_spinbutton", map_y_spinbutton);
103   xml->get_widget("map_width_spinbutton", map_width_spinbutton);
104   xml->get_widget("map_height_spinbutton", map_height_spinbutton);
105   xml->get_widget("randomize_map_button", randomize_map_button);
106   randomize_map_button->signal_clicked().connect
107     (sigc::mem_fun(*this, &RewardEditorDialog::on_randomize_map_clicked));
108   map_x_spinbutton->set_range (0, GameMap::getInstance()->getWidth() - 1);
109   map_y_spinbutton->set_range (0, GameMap::getInstance()->getHeight() - 1);
110   map_width_spinbutton->set_range (1, GameMap::getInstance()->getWidth());
111   map_height_spinbutton->set_range (1, GameMap::getInstance()->getHeight());
112
113   xml->get_widget("hidden_ruin_button", hidden_ruin_button);
114   hidden_ruin_button->signal_clicked().connect
115     (sigc::mem_fun(*this, &RewardEditorDialog::on_hidden_ruin_clicked));
116   xml->get_widget("clear_hidden_ruin_button", clear_hidden_ruin_button);
117   clear_hidden_ruin_button->signal_clicked().connect
118     (sigc::mem_fun(*this, &RewardEditorDialog::on_clear_hidden_ruin_clicked));
119   xml->get_widget("randomize_hidden_ruin_button", randomize_hidden_ruin_button);
120   randomize_hidden_ruin_button->signal_clicked().connect
121     (sigc::mem_fun(*this, &RewardEditorDialog::on_randomize_hidden_ruin_clicked));
122   set_hidden_ruin_name();
123   hidden_ruin_radiobutton->set_sensitive(hidden_ruins);
124
125   if (r)
126     {
127       if (r->getType() == Reward::ITEM)
128         {
129           reward = new Reward_Item(*static_cast<Reward_Item*>(r));
130           item = static_cast<Reward_Item*>(reward)->getItem();
131         }
132       else if (r->getType() == Reward::ALLIES)
133         {
134           reward = new Reward_Allies(*static_cast<Reward_Allies*>(r));
135           ally = new ArmyProto(*static_cast<Reward_Allies*>(reward)->getArmy());
136         }
137       else if (r->getType() == Reward::RUIN)
138         {
139           reward = new Reward_Ruin(*static_cast<Reward_Ruin*>(r));
140           hidden_ruin = new Ruin(*static_cast<Reward_Ruin*>(reward)->getRuin());
141         }
142       else if (r->getType() == Reward::MAP)
143         reward = new Reward_Map(*static_cast<Reward_Map*>(r));
144       else if (r->getType() == Reward::GOLD)
145         reward = new Reward_Gold(*static_cast<Reward_Gold*>(r));
146     }
147     
148   if (reward)
149     fill_in_reward_info();
150 }
151
152 RewardEditorDialog::~RewardEditorDialog()
153 {
154   delete dialog;
155 }
156 void RewardEditorDialog::fill_in_reward_info()
157 {
158   if (reward->getType() == Reward::GOLD)
159     {
160       Reward_Gold *r = static_cast<Reward_Gold*>(reward);
161       gold_spinbutton->set_value(r->getGold());
162       gold_radiobutton->set_active(true);
163     }
164   else if (reward->getType() == Reward::ITEM)
165     {
166       set_item_name();
167       item_radiobutton->set_active(true);
168     }
169   else if (reward->getType() == Reward::ALLIES)
170     {
171       Reward_Allies *r = static_cast<Reward_Allies*>(reward);
172       num_allies_spinbutton->set_value(r->getNoOfAllies());
173       set_ally_name();
174       allies_radiobutton->set_active(true);
175     }
176   else if (reward->getType() == Reward::MAP)
177     {
178       Reward_Map *r = static_cast<Reward_Map*>(reward);
179       map_x_spinbutton->set_value(r->getLocation().x);
180       map_y_spinbutton->set_value(r->getLocation().y);
181       map_width_spinbutton->set_value(r->getWidth());
182       map_height_spinbutton->set_value(r->getHeight());
183           map_radiobutton->set_active(true);
184     }
185   else if (reward->getType() == Reward::RUIN)
186     {
187       set_hidden_ruin_name();
188       hidden_ruin_radiobutton->set_active(true);
189     }
190
191   //reward holds a reward
192 }
193
194 void RewardEditorDialog::set_parent_window(Gtk::Window &parent)
195 {
196   dialog->set_transient_for(parent);
197   //dialog->set_position(Gtk::WIN_POS_CENTER_ON_PARENT);
198 }
199
200 int RewardEditorDialog::run()
201 {
202   dialog->show_all();
203   int response = dialog->run();
204
205   if (response == Gtk::RESPONSE_ACCEPT) // accepted
206     {
207       if (gold_radiobutton->get_active() == true)
208         reward = new Reward_Gold(gold_spinbutton->get_value_as_int());
209       else if (item_radiobutton->get_active() == true && item)
210         reward = new Reward_Item(item);
211       else if (allies_radiobutton->get_active() == true && ally)
212         reward = new Reward_Allies(ally, 
213                                    num_allies_spinbutton->get_value_as_int());
214       else if (map_radiobutton->get_active() == true)
215         reward = new Reward_Map 
216           (Vector<int>(map_x_spinbutton->get_value_as_int(), 
217                        map_y_spinbutton->get_value_as_int()), "",
218            map_height_spinbutton->get_value_as_int(),
219            map_width_spinbutton->get_value_as_int());
220       else if (hidden_ruin_radiobutton->get_active() == true && hidden_ruin)
221         reward = new Reward_Ruin(hidden_ruin);
222       else
223         {
224           if (reward)
225             {
226               delete reward;
227               reward = NULL;
228             }
229         }
230
231           
232       if (reward)
233         {
234         reward->setName(reward->getDescription());
235         }
236     }
237   else
238     {
239       if (ally)
240         delete ally;
241       if (item)
242         delete item;
243     }
244   return response;
245 }
246
247
248 void RewardEditorDialog::on_gold_toggled()
249 {
250   gold_hbox->set_sensitive(true);
251   item_hbox->set_sensitive(false);
252   allies_hbox->set_sensitive(false);
253   map_hbox->set_sensitive(false);
254   hidden_ruin_hbox->set_sensitive(false);
255 }
256
257 void RewardEditorDialog::on_item_toggled()
258 {
259   gold_hbox->set_sensitive(false);
260   item_hbox->set_sensitive(true);
261   allies_hbox->set_sensitive(false);
262   map_hbox->set_sensitive(false);
263   hidden_ruin_hbox->set_sensitive(false);
264 }
265
266 void RewardEditorDialog::on_allies_toggled()
267 {
268   gold_hbox->set_sensitive(false);
269   item_hbox->set_sensitive(false);
270   allies_hbox->set_sensitive(true);
271   map_hbox->set_sensitive(false);
272   hidden_ruin_hbox->set_sensitive(false);
273 }
274
275 void RewardEditorDialog::on_map_toggled()
276 {
277   gold_hbox->set_sensitive(false);
278   item_hbox->set_sensitive(false);
279   allies_hbox->set_sensitive(false);
280   map_hbox->set_sensitive(true);
281   hidden_ruin_hbox->set_sensitive(false);
282 }
283
284 void RewardEditorDialog::on_hidden_ruin_toggled()
285 {
286   gold_hbox->set_sensitive(false);
287   item_hbox->set_sensitive(false);
288   allies_hbox->set_sensitive(false);
289   map_hbox->set_sensitive(false);
290   hidden_ruin_hbox->set_sensitive(true);
291 }
292
293 void RewardEditorDialog::on_randomize_gold_clicked()
294 {
295   gold_spinbutton->set_value(Reward_Gold::getRandomGoldPieces());
296 }
297
298 void RewardEditorDialog::on_item_clicked()
299 {
300   SelectItemDialog d;
301   d.run();
302   if (d.get_selected_item())
303     {
304       on_clear_item_clicked();
305       item = new Item(*(d.get_selected_item()));
306       set_item_name();
307     }
308 }
309
310 void RewardEditorDialog::on_clear_item_clicked()
311 {
312   if (item)
313     {
314       delete item;
315       item = NULL;
316     }
317   set_item_name();
318 }
319
320 void RewardEditorDialog::on_randomize_item_clicked()
321 {
322   on_clear_item_clicked();
323   item = Reward_Item::getRandomItem();
324   set_item_name();
325 }
326
327 void RewardEditorDialog::set_item_name()
328 {
329   Glib::ustring name;
330   if (item)
331     name = item->getName();
332   else
333     name = _("No item");
334
335   item_button->set_label(name);
336 }
337     
338 void RewardEditorDialog::on_ally_clicked()
339 {
340   SelectArmyDialog d(d_player, false, false, true);
341   d.run();
342   if (d.get_selected_army())
343     {
344       on_clear_ally_clicked();
345       ally = new ArmyProto(*(d.get_selected_army()));
346       set_ally_name();
347     }
348 }
349
350 void RewardEditorDialog::on_clear_ally_clicked()
351 {
352   if (ally)
353     {
354       delete ally;
355       ally = NULL;
356     }
357   set_ally_name();
358 }
359
360 void RewardEditorDialog::on_randomize_allies_clicked()
361 {
362   const ArmyProto *a = Reward_Allies::randomArmyAlly();
363   if (!a)
364     return;
365     
366   on_clear_ally_clicked();
367   ally = new ArmyProto(*a);
368   num_allies_spinbutton->set_value(Reward_Allies::getRandomAmountOfAllies());
369
370   set_ally_name();
371 }
372
373 void RewardEditorDialog::set_ally_name()
374 {
375   Glib::ustring name;
376   if (ally)
377     name = ally->getName();
378   else
379     name = _("No ally");
380
381   ally_button->set_label(name);
382 }
383
384 void RewardEditorDialog::on_randomize_map_clicked()
385 {
386   int x, y, width, height;
387   Reward_Map::getRandomMap(&x, &y, &width, &height);
388   map_x_spinbutton->set_value(x);
389   map_y_spinbutton->set_value(y);
390   map_width_spinbutton->set_value(width);
391   map_height_spinbutton->set_value(height);
392 }
393
394 void RewardEditorDialog::on_hidden_ruin_clicked()
395 {
396   SelectHiddenRuinDialog d;
397   d.run();
398   if (d.get_selected_hidden_ruin())
399     {
400       on_clear_hidden_ruin_clicked();
401       hidden_ruin = new Ruin(*(d.get_selected_hidden_ruin()));
402       set_hidden_ruin_name();
403     }
404 }
405
406 void RewardEditorDialog::on_clear_hidden_ruin_clicked()
407 {
408   if (hidden_ruin)
409     {
410       delete hidden_ruin;
411       hidden_ruin = NULL;
412     }
413   set_hidden_ruin_name();
414 }
415
416 void RewardEditorDialog::on_randomize_hidden_ruin_clicked()
417 {
418   Ruin *ruin = Reward_Ruin::getRandomHiddenRuin();
419   if (ruin)
420     {
421       on_clear_hidden_ruin_clicked();
422       hidden_ruin = new Ruin(*ruin);
423       set_hidden_ruin_name();
424     }
425 }
426
427 void RewardEditorDialog::set_hidden_ruin_name()
428 {
429   Glib::ustring name;
430   if (hidden_ruin)
431     name = hidden_ruin->getName();
432   else
433     name = _("No Ruin");
434
435   hidden_ruin_button->set_label(name);
436 }