1 // Copyright (C) 2008, 2009 Ben Asselstine
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.
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.
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
21 #include <sigc++/functors/mem_fun.h>
23 #include "reward-editor-dialog.h"
25 #include "glade-helpers.h"
26 #include "ucompose.hpp"
33 #include "select-item-dialog.h"
34 #include "select-army-dialog.h"
35 #include "select-hidden-ruin-dialog.h"
36 #include "armyproto.h"
38 RewardEditorDialog::RewardEditorDialog(Player *player, bool hidden_ruins, Reward *r)
41 d_hidden_ruins = hidden_ruins;
47 Glib::RefPtr<Gtk::Builder> xml
48 = Gtk::Builder::create_from_file(get_glade_path()
49 + "/reward-editor-dialog.ui");
51 xml->get_widget("dialog", dialog);
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));
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));
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));
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());
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);
127 if (r->getType() == Reward::ITEM)
129 reward = new Reward_Item(*static_cast<Reward_Item*>(r));
130 item = static_cast<Reward_Item*>(reward)->getItem();
132 else if (r->getType() == Reward::ALLIES)
134 reward = new Reward_Allies(*static_cast<Reward_Allies*>(r));
135 ally = new ArmyProto(*static_cast<Reward_Allies*>(reward)->getArmy());
137 else if (r->getType() == Reward::RUIN)
139 reward = new Reward_Ruin(*static_cast<Reward_Ruin*>(r));
140 hidden_ruin = new Ruin(*static_cast<Reward_Ruin*>(reward)->getRuin());
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));
149 fill_in_reward_info();
152 RewardEditorDialog::~RewardEditorDialog()
156 void RewardEditorDialog::fill_in_reward_info()
158 if (reward->getType() == Reward::GOLD)
160 Reward_Gold *r = static_cast<Reward_Gold*>(reward);
161 gold_spinbutton->set_value(r->getGold());
162 gold_radiobutton->set_active(true);
164 else if (reward->getType() == Reward::ITEM)
167 item_radiobutton->set_active(true);
169 else if (reward->getType() == Reward::ALLIES)
171 Reward_Allies *r = static_cast<Reward_Allies*>(reward);
172 num_allies_spinbutton->set_value(r->getNoOfAllies());
174 allies_radiobutton->set_active(true);
176 else if (reward->getType() == Reward::MAP)
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);
185 else if (reward->getType() == Reward::RUIN)
187 set_hidden_ruin_name();
188 hidden_ruin_radiobutton->set_active(true);
191 //reward holds a reward
194 void RewardEditorDialog::set_parent_window(Gtk::Window &parent)
196 dialog->set_transient_for(parent);
197 //dialog->set_position(Gtk::WIN_POS_CENTER_ON_PARENT);
200 int RewardEditorDialog::run()
203 int response = dialog->run();
205 if (response == Gtk::RESPONSE_ACCEPT) // accepted
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);
234 reward->setName(reward->getDescription());
248 void RewardEditorDialog::on_gold_toggled()
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);
257 void RewardEditorDialog::on_item_toggled()
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);
266 void RewardEditorDialog::on_allies_toggled()
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);
275 void RewardEditorDialog::on_map_toggled()
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);
284 void RewardEditorDialog::on_hidden_ruin_toggled()
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);
293 void RewardEditorDialog::on_randomize_gold_clicked()
295 gold_spinbutton->set_value(Reward_Gold::getRandomGoldPieces());
298 void RewardEditorDialog::on_item_clicked()
302 if (d.get_selected_item())
304 on_clear_item_clicked();
305 item = new Item(*(d.get_selected_item()));
310 void RewardEditorDialog::on_clear_item_clicked()
320 void RewardEditorDialog::on_randomize_item_clicked()
322 on_clear_item_clicked();
323 item = Reward_Item::getRandomItem();
327 void RewardEditorDialog::set_item_name()
331 name = item->getName();
335 item_button->set_label(name);
338 void RewardEditorDialog::on_ally_clicked()
340 SelectArmyDialog d(d_player, false, false, true);
342 if (d.get_selected_army())
344 on_clear_ally_clicked();
345 ally = new ArmyProto(*(d.get_selected_army()));
350 void RewardEditorDialog::on_clear_ally_clicked()
360 void RewardEditorDialog::on_randomize_allies_clicked()
362 const ArmyProto *a = Reward_Allies::randomArmyAlly();
366 on_clear_ally_clicked();
367 ally = new ArmyProto(*a);
368 num_allies_spinbutton->set_value(Reward_Allies::getRandomAmountOfAllies());
373 void RewardEditorDialog::set_ally_name()
377 name = ally->getName();
381 ally_button->set_label(name);
384 void RewardEditorDialog::on_randomize_map_clicked()
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);
394 void RewardEditorDialog::on_hidden_ruin_clicked()
396 SelectHiddenRuinDialog d;
398 if (d.get_selected_hidden_ruin())
400 on_clear_hidden_ruin_clicked();
401 hidden_ruin = new Ruin(*(d.get_selected_hidden_ruin()));
402 set_hidden_ruin_name();
406 void RewardEditorDialog::on_clear_hidden_ruin_clicked()
413 set_hidden_ruin_name();
416 void RewardEditorDialog::on_randomize_hidden_ruin_clicked()
418 Ruin *ruin = Reward_Ruin::getRandomHiddenRuin();
421 on_clear_hidden_ruin_clicked();
422 hidden_ruin = new Ruin(*ruin);
423 set_hidden_ruin_name();
427 void RewardEditorDialog::set_hidden_ruin_name()
431 name = hidden_ruin->getName();
435 hidden_ruin_button->set_label(name);