1 // Copyright (C) 2008, 2009, 2011, 2014, 2015, 2020 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 <iostream>
21 #include <iomanip>
22 #include <assert.h>
23
24 #include <sigc++/functors/mem_fun.h>
25 #include <gtkmm.h>
26
27 #include "itemlist-dialog.h"
28 #include "defs.h"
29 #include "Configuration.h"
30 #include "Itemlist.h"
31 #include "Tile.h"
32 #include "playerlist.h"
33 #include "armysetlist.h"
34 #include "ucompose.hpp"
35 #include "army-chooser-button.h"
36 #define method(x) sigc::mem_fun(*this, &ItemlistDialog::x)
37
ItemlistDialog(Gtk::Window & parent)38 ItemlistDialog::ItemlistDialog(Gtk::Window &parent)
39 : LwEditorDialog(parent, "itemlist-dialog.ui")
40 {
41 d_changed = false;
42 d_itemlist = Itemlist::getInstance();
43
44 kill_army_type_button =
45 new ArmyChooserButton (parent, xml, "kill_army_type_button",
46 Playerlist::getInstance()->getNeutral (),
47 SelectArmyDialog::SELECT_RUIN_DEFENDER);
48
49 summon_army_type_button =
50 new ArmyChooserButton (parent, xml, "summon_army_type_button",
51 Playerlist::getInstance()->getNeutral (),
52 SelectArmyDialog::SELECT_NORMAL);
53
54 defender_army_type_button =
55 new ArmyChooserButton (parent, xml, "defender_army_type_button",
56 Playerlist::getInstance()->getNeutral (),
57 SelectArmyDialog::SELECT_NORMAL);
58 load_widgets ();
59
60 items_list = Gtk::ListStore::create(items_columns);
61 items_treeview->set_model(items_list);
62 items_treeview->append_column("", items_columns.name);
63 items_treeview->set_headers_visible(false);
64
65 Itemlist::iterator iter = d_itemlist->begin();
66 for (;iter != d_itemlist->end(); iter++)
67 addItemProto((*iter).second);
68
69
70 d_item = NULL;
71 guint32 max = d_itemlist->size();
72 if (max)
73 {
74 Gtk::TreeModel::Row row;
75 row = items_treeview->get_model()->children()[0];
76 if(row)
77 items_treeview->get_selection()->select(row);
78 }
79 update_item_panel();
80 update_itemlist_buttons();
81 }
82
~ItemlistDialog()83 ItemlistDialog::~ItemlistDialog()
84 {
85 delete kill_army_type_button;
86 delete summon_army_type_button;
87 delete defender_army_type_button;
88 }
89
load_widgets()90 void ItemlistDialog::load_widgets ()
91 {
92 xml->get_widget("name_entry", name_entry);
93 xml->get_widget("items_treeview", items_treeview);
94 xml->get_widget("add_item_button", add_item_button);
95 xml->get_widget("remove_item_button", remove_item_button);
96 xml->get_widget("item_vbox", item_vbox);
97 xml->get_widget("building_type_to_summon_on_combobox",
98 building_type_to_summon_on_combobox);
99 xml->get_widget("disease_city_switch", disease_city_switch);
100 xml->get_widget("disease_armies_percent_spinbutton",
101 disease_armies_percent_spinbutton);
102
103 xml->get_widget("raise_defenders_switch", raise_defenders_switch);
104 xml->get_widget("num_defenders_spinbutton", num_defenders_spinbutton);
105 xml->get_widget("persuade_neutral_city_switch",
106 persuade_neutral_city_switch);
107 xml->get_widget("teleport_to_city_switch",
108 teleport_to_city_switch);
109 xml->get_widget("add1str_switch", add1str_switch);
110 xml->get_widget("add2str_switch", add2str_switch);
111 xml->get_widget("add3str_switch", add3str_switch);
112 xml->get_widget("add1stack_switch", add1stack_switch);
113 xml->get_widget("add2stack_switch", add2stack_switch);
114 xml->get_widget("add3stack_switch", add3stack_switch);
115 xml->get_widget("flystack_switch", flystack_switch);
116 xml->get_widget("doublemovestack_switch", doublemovestack_switch);
117 xml->get_widget("add2goldpercity_switch", add2goldpercity_switch);
118 xml->get_widget("add3goldpercity_switch", add3goldpercity_switch);
119 xml->get_widget("add4goldpercity_switch", add4goldpercity_switch);
120 xml->get_widget("add5goldpercity_switch", add5goldpercity_switch);
121 xml->get_widget("steals_gold_switch", steals_gold_switch);
122 xml->get_widget("pickup_bags_switch", pickup_bags_switch);
123 xml->get_widget("add_mp_switch", add_mp_switch);
124 xml->get_widget("sinks_ships_switch", sinks_ships_switch);
125 xml->get_widget("banish_worms_switch", banish_worms_switch);
126 xml->get_widget("burn_bridge_switch", burn_bridge_switch);
127 xml->get_widget("capture_keeper_switch", capture_keeper_switch);
128 xml->get_widget("summon_monster_switch", summon_monster_switch);
129 xml->get_widget("uses_spinbutton", uses_spinbutton);
130 xml->get_widget("steal_percent_spinbutton", steal_percent_spinbutton);
131 xml->get_widget("add_mp_spinbutton", add_mp_spinbutton);
132 }
133
connect_signals()134 void ItemlistDialog::connect_signals ()
135 {
136 connections.push_back(items_treeview->get_selection()->signal_changed().connect (method(on_item_selected)));
137 connections.push_back (name_entry->signal_changed().connect (method(on_name_changed)));
138 connections.push_back (add_item_button->signal_clicked().connect (method(on_add_item_clicked)));
139 connections.push_back (remove_item_button->signal_clicked().connect (method(on_remove_item_clicked)));
140 connections.push_back (kill_army_type_button->army_selected.connect(method(on_kill_army_type_selected)));
141 connections.push_back (summon_army_type_button->army_selected.connect(method(on_summon_army_type_selected)));
142 connections.push_back (disease_city_switch->property_active().signal_changed().connect(method(on_disease_city_toggled)));
143 connections.push_back (disease_armies_percent_spinbutton->signal_changed().connect(method(on_disease_armies_percent_changed)));
144 connections.push_back (disease_armies_percent_spinbutton->signal_insert_text().connect (sigc::hide(sigc::hide(method(on_disease_armies_percent_text_changed)))));
145 connections.push_back (raise_defenders_switch->property_active().signal_changed().connect (method(on_raise_defenders_toggled)));
146 connections.push_back (defender_army_type_button->army_selected.connect (method(on_defender_type_selected)));
147 connections.push_back (num_defenders_spinbutton->signal_changed().connect (method(on_num_defenders_changed)));
148 connections.push_back (num_defenders_spinbutton->signal_insert_text().connect
149 (sigc::hide(sigc::hide(method(on_num_defenders_text_changed)))));
150 connections.push_back (persuade_neutral_city_switch->property_active().signal_changed().connect (method(on_persuade_neutral_city_toggled)));
151 connections.push_back (teleport_to_city_switch->property_active().signal_changed().connect (method(on_teleport_to_city_toggled)));
152 connections.push_back (add1str_switch->property_active().signal_changed().connect(method(on_add1str_toggled)));
153 connections.push_back (add2str_switch->property_active().signal_changed().connect(method(on_add2str_toggled)));
154 connections.push_back (add3str_switch->property_active().signal_changed().connect(method(on_add3str_toggled)));
155 connections.push_back (add1stack_switch->property_active().signal_changed().connect(method(on_add1stack_toggled)));
156 connections.push_back (add2stack_switch->property_active().signal_changed().connect(method(on_add2stack_toggled)));
157 connections.push_back (add3stack_switch->property_active().signal_changed().connect(method(on_add3stack_toggled)));
158 connections.push_back (flystack_switch->property_active().signal_changed().connect(method(on_flystack_toggled)));
159 connections.push_back (doublemovestack_switch->property_active().signal_changed().connect(method(on_doublemovestack_toggled)));
160 connections.push_back (add2goldpercity_switch->property_active().signal_changed().connect (method(on_add2goldpercity_toggled)));
161 connections.push_back (add3goldpercity_switch->property_active().signal_changed().connect (method(on_add3goldpercity_toggled)));
162 connections.push_back (add4goldpercity_switch->property_active().signal_changed().connect (method(on_add4goldpercity_toggled)));
163 connections.push_back (add5goldpercity_switch->property_active().signal_changed().connect (method(on_add5goldpercity_toggled)));
164 connections.push_back (steals_gold_switch->property_active().signal_changed().connect (method(on_steals_gold_toggled)));
165 connections.push_back (pickup_bags_switch->property_active().signal_changed().connect(method(on_pickup_bags_toggled)));
166 connections.push_back (add_mp_switch->property_active().signal_changed().connect(method(on_add_mp_toggled)));
167 connections.push_back (sinks_ships_switch->property_active().signal_changed().connect(method(on_sinks_ships_toggled)));
168 connections.push_back (banish_worms_switch->property_active().signal_changed().connect(method(on_banish_worms_toggled)));
169 connections.push_back (burn_bridge_switch->property_active().signal_changed().connect(method(on_burn_bridge_toggled)));
170 connections.push_back (capture_keeper_switch->property_active().signal_changed().connect(method(on_capture_keeper_toggled)));
171 connections.push_back (summon_monster_switch->property_active().signal_changed().connect (method(on_summon_monster_toggled)));
172 connections.push_back (uses_spinbutton->signal_changed().connect(method(on_uses_changed)));
173 connections.push_back (steal_percent_spinbutton->signal_changed().connect
174 (method(on_steal_percent_changed)));
175 connections.push_back (steal_percent_spinbutton->signal_insert_text().connect
176 (sigc::hide(sigc::hide(method(on_steal_percent_text_changed)))));
177 connections.push_back (add_mp_spinbutton->signal_changed().connect (method(on_add_mp_changed)));
178 connections.push_back (add_mp_spinbutton->signal_insert_text().connect
179 (sigc::hide(sigc::hide(method(on_add_mp_text_changed)))));
180 connections.push_back (building_type_to_summon_on_combobox->signal_changed ().connect (method (on_building_type_to_summon_on_changed)));
181 }
182
disconnect_signals()183 void ItemlistDialog::disconnect_signals ()
184 {
185 for (auto c : connections)
186 c.disconnect ();
187 }
188
189 void
update_itemlist_buttons()190 ItemlistDialog::update_itemlist_buttons()
191 {
192 if (!items_treeview->get_selection()->get_selected())
193 remove_item_button->set_sensitive(false);
194 else
195 remove_item_button->set_sensitive(true);
196 if (d_itemlist == NULL)
197 add_item_button->set_sensitive(false);
198 else
199 add_item_button->set_sensitive(true);
200 }
201
202 void
update_item_panel()203 ItemlistDialog::update_item_panel()
204 {
205 //if nothing selected in the treeview, then we don't show anything in
206 //the item panel
207 if (items_treeview->get_selection()->get_selected() == 0)
208 {
209 //clear all values
210 name_entry->set_text("");
211 item_vbox->set_sensitive(false);
212 return;
213 }
214 item_vbox->set_sensitive(true);
215 Glib::RefPtr<Gtk::TreeSelection> selection = items_treeview->get_selection();
216 Gtk::TreeModel::iterator iterrow = selection->get_selected();
217
218 if (iterrow)
219 {
220 // Row selected
221 Gtk::TreeModel::Row row = *iterrow;
222
223 ItemProto *a = row[items_columns.item];
224 d_item = a;
225 fill_item_info(a);
226 }
227 }
228
addItemProto(ItemProto * itemproto)229 void ItemlistDialog::addItemProto(ItemProto *itemproto)
230 {
231 Gtk::TreeIter i = items_list->append();
232 (*i)[items_columns.name] = itemproto->getName();
233 (*i)[items_columns.item] = itemproto;
234 }
235
on_item_selected()236 void ItemlistDialog::on_item_selected()
237 {
238 update_item_panel();
239 update_itemlist_buttons();
240 }
241
fill_item_info(ItemProto * item)242 void ItemlistDialog::fill_item_info(ItemProto *item)
243 {
244 disconnect_signals ();
245 name_entry->set_text(item->getName());
246 add1str_switch->set_active(item->getBonus(ItemProto::ADD1STR));
247 add2str_switch->set_active(item->getBonus(ItemProto::ADD2STR));
248 add3str_switch->set_active(item->getBonus(ItemProto::ADD3STR));
249 add1stack_switch->set_active(item->getBonus(ItemProto::ADD1STACK));
250 add2stack_switch->set_active(item->getBonus(ItemProto::ADD2STACK));
251 add3stack_switch->set_active(item->getBonus(ItemProto::ADD3STACK));
252 flystack_switch->set_active(item->getBonus(ItemProto::FLYSTACK));
253 doublemovestack_switch->set_active
254 (item->getBonus(ItemProto::DOUBLEMOVESTACK));
255 add2goldpercity_switch->set_active
256 (item->getBonus(ItemProto::ADD2GOLDPERCITY));
257 add3goldpercity_switch->set_active
258 (item->getBonus(ItemProto::ADD3GOLDPERCITY));
259 add4goldpercity_switch->set_active
260 (item->getBonus(ItemProto::ADD4GOLDPERCITY));
261 add5goldpercity_switch->set_active
262 (item->getBonus(ItemProto::ADD5GOLDPERCITY));
263 steals_gold_switch->set_active (item->getBonus(ItemProto::STEAL_GOLD));
264 pickup_bags_switch->set_active (item->getBonus(ItemProto::PICK_UP_BAGS));
265 add_mp_switch->set_active (item->getBonus(ItemProto::ADD_2MP_STACK));
266 sinks_ships_switch->set_active (item->getBonus(ItemProto::SINK_SHIPS));
267 banish_worms_switch->set_active (item->getBonus(ItemProto::BANISH_WORMS));
268 burn_bridge_switch->set_active (item->getBonus(ItemProto::BURN_BRIDGE));
269 capture_keeper_switch->set_active
270 (item->getBonus(ItemProto::CAPTURE_KEEPER));
271 uses_spinbutton->set_value(double(item->getNumberOfUsesLeft()));
272 steal_percent_spinbutton->set_value(item->getPercentGoldToSteal());
273 steal_percent_spinbutton->set_sensitive
274 (steals_gold_switch->get_active());
275 add_mp_spinbutton->set_value(item->getMovementPointsToAdd());
276 add_mp_spinbutton->set_sensitive (add_mp_switch->get_active());
277 summon_monster_switch->set_active
278 (item->getBonus(ItemProto::SUMMON_MONSTER));
279 building_type_to_summon_on_combobox->set_active(item->getBuildingTypeToSummonOn());
280 building_type_to_summon_on_combobox->set_sensitive(summon_monster_switch->get_active());
281 disease_city_switch->set_active(item->getBonus(ItemProto::DISEASE_CITY));
282 disease_armies_percent_spinbutton->set_sensitive(disease_city_switch->get_active());
283 disease_armies_percent_spinbutton->set_value(item->getPercentArmiesToKill());
284
285 if (item->hasArmyTypeToKill ())
286 kill_army_type_button->select (item->getArmyTypeToKill ());
287 else
288 kill_army_type_button->clear_selected_army ();
289 kill_army_type_button->set_sensitive(banish_worms_switch->get_active());
290
291 if (item->hasArmyTypeToSummon ())
292 summon_army_type_button->select (item->getArmyTypeToSummon ());
293 else
294 summon_army_type_button->clear_selected_army ();
295
296 summon_army_type_button->set_sensitive(summon_monster_switch->get_active());
297
298 raise_defenders_switch->set_active
299 (item->getBonus(ItemProto::RAISE_DEFENDERS));
300 num_defenders_spinbutton->set_sensitive
301 (raise_defenders_switch->get_active());
302 num_defenders_spinbutton->set_value(item->getNumberOfArmiesToRaise());
303
304 if (item->hasArmyTypeToRaise ())
305 defender_army_type_button->select (item->getArmyTypeToRaise());
306 else
307 defender_army_type_button->clear_selected_army ();
308 defender_army_type_button->set_sensitive(raise_defenders_switch->get_active());
309
310 persuade_neutral_city_switch->set_active
311 (item->getBonus(ItemProto::PERSUADE_NEUTRALS));
312 teleport_to_city_switch->set_active
313 (item->getBonus(ItemProto::TELEPORT_TO_CITY));
314
315 connect_signals ();
316 }
317
on_name_changed()318 void ItemlistDialog::on_name_changed()
319 {
320 Glib::RefPtr<Gtk::TreeSelection> selection = items_treeview->get_selection();
321 Gtk::TreeModel::iterator iterrow = selection->get_selected();
322
323 if (iterrow)
324 {
325 Gtk::TreeModel::Row row = *iterrow;
326 ItemProto *a = row[items_columns.item];
327 a->setName(name_entry->get_text());
328 row[items_columns.name] = name_entry->get_text();
329 d_changed = true;
330 }
331 }
332
on_add_item_clicked()333 void ItemlistDialog::on_add_item_clicked()
334 {
335 //add a new empty item to the itemlist
336 ItemProto *a = new ItemProto(_("Untitled"));
337 d_itemlist->add(a);
338 //add it to the treeview
339 Gtk::TreeIter i = items_list->append();
340 a->setName(_("Untitled"));
341 (*i)[items_columns.name] = a->getName();
342 (*i)[items_columns.item] = a;
343 d_changed = true;
344 }
345
on_remove_item_clicked()346 void ItemlistDialog::on_remove_item_clicked()
347 {
348 //erase the selected row from the treeview
349 //remove the item from the itemlist
350 Glib::RefPtr<Gtk::TreeSelection> selection = items_treeview->get_selection();
351 Gtk::TreeModel::iterator iterrow = selection->get_selected();
352
353 if (iterrow)
354 {
355 Gtk::TreeModel::Row row = *iterrow;
356 ItemProto *a = row[items_columns.item];
357 items_list->erase(iterrow);
358 d_itemlist->remove(a);
359 d_changed = true;
360 }
361 }
362
on_switch_toggled(Gtk::Switch * sw,ItemProto::Bonus bonus)363 void ItemlistDialog::on_switch_toggled(Gtk::Switch *sw, ItemProto::Bonus bonus)
364 {
365 Glib::RefPtr<Gtk::TreeSelection> selection = items_treeview->get_selection();
366 Gtk::TreeModel::iterator iterrow = selection->get_selected();
367
368 if (iterrow)
369 {
370 // Row selected
371 Gtk::TreeModel::Row row = *iterrow;
372
373 d_item = row[items_columns.item];
374 }
375 else
376 return;
377 if (sw->get_active())
378 d_item->addBonus(bonus);
379 else
380 d_item->removeBonus(bonus);
381 d_changed = true;
382 }
383
on_add1str_toggled()384 void ItemlistDialog::on_add1str_toggled()
385 {
386 on_switch_toggled(add1str_switch, ItemProto::ADD1STR);
387 }
388
on_add2str_toggled()389 void ItemlistDialog::on_add2str_toggled()
390 {
391 on_switch_toggled(add2str_switch, ItemProto::ADD2STR);
392 }
393
on_add3str_toggled()394 void ItemlistDialog::on_add3str_toggled()
395 {
396 on_switch_toggled(add3str_switch, ItemProto::ADD3STR);
397 }
398
on_add1stack_toggled()399 void ItemlistDialog::on_add1stack_toggled()
400 {
401 on_switch_toggled(add1stack_switch, ItemProto::ADD1STACK);
402 }
403
on_add2stack_toggled()404 void ItemlistDialog::on_add2stack_toggled()
405 {
406 on_switch_toggled(add2stack_switch, ItemProto::ADD2STACK);
407 }
408
on_add3stack_toggled()409 void ItemlistDialog::on_add3stack_toggled()
410 {
411 on_switch_toggled(add3stack_switch, ItemProto::ADD3STACK);
412 }
413
on_flystack_toggled()414 void ItemlistDialog::on_flystack_toggled()
415 {
416 on_switch_toggled(flystack_switch, ItemProto::FLYSTACK);
417 }
418
on_doublemovestack_toggled()419 void ItemlistDialog::on_doublemovestack_toggled()
420 {
421 on_switch_toggled(doublemovestack_switch, ItemProto::DOUBLEMOVESTACK);
422 }
423
on_add2goldpercity_toggled()424 void ItemlistDialog::on_add2goldpercity_toggled()
425 {
426 on_switch_toggled(add2goldpercity_switch, ItemProto::ADD2GOLDPERCITY);
427 }
428
on_add3goldpercity_toggled()429 void ItemlistDialog::on_add3goldpercity_toggled()
430 {
431 on_switch_toggled(add2goldpercity_switch, ItemProto::ADD3GOLDPERCITY);
432 }
433
on_add4goldpercity_toggled()434 void ItemlistDialog::on_add4goldpercity_toggled()
435 {
436 on_switch_toggled(add4goldpercity_switch, ItemProto::ADD4GOLDPERCITY);
437 }
438
on_add5goldpercity_toggled()439 void ItemlistDialog::on_add5goldpercity_toggled()
440 {
441 on_switch_toggled(add5goldpercity_switch, ItemProto::ADD5GOLDPERCITY);
442 }
443
on_steals_gold_toggled()444 void ItemlistDialog::on_steals_gold_toggled()
445 {
446 on_switch_toggled(steals_gold_switch, ItemProto::STEAL_GOLD);
447 steal_percent_spinbutton->set_sensitive
448 (steals_gold_switch->get_active());
449 if (steals_gold_switch->get_active () == false)
450 steal_percent_spinbutton->set_value (1);
451 }
452
on_pickup_bags_toggled()453 void ItemlistDialog::on_pickup_bags_toggled()
454 {
455 on_switch_toggled(pickup_bags_switch, ItemProto::PICK_UP_BAGS);
456 }
457
on_add_mp_toggled()458 void ItemlistDialog::on_add_mp_toggled()
459 {
460 on_switch_toggled(add_mp_switch, ItemProto::ADD_2MP_STACK);
461 add_mp_spinbutton->set_sensitive (add_mp_switch->get_active());
462 if (add_mp_switch->get_active () == false)
463 add_mp_spinbutton->set_value (1);
464 }
465
on_sinks_ships_toggled()466 void ItemlistDialog::on_sinks_ships_toggled()
467 {
468 on_switch_toggled(sinks_ships_switch, ItemProto::SINK_SHIPS);
469 }
470
on_banish_worms_toggled()471 void ItemlistDialog::on_banish_worms_toggled()
472 {
473 on_switch_toggled(banish_worms_switch, ItemProto::BANISH_WORMS);
474 kill_army_type_button->set_sensitive(banish_worms_switch->get_active());
475 if (banish_worms_switch->get_active() == false)
476 {
477 d_item->clearArmyTypeToKill ();
478 kill_army_type_button->clear_selected_army ();
479 }
480 }
481
on_burn_bridge_toggled()482 void ItemlistDialog::on_burn_bridge_toggled()
483 {
484 on_switch_toggled(burn_bridge_switch, ItemProto::BURN_BRIDGE);
485 }
486
on_uses_changed()487 void ItemlistDialog::on_uses_changed()
488 {
489 Glib::RefPtr<Gtk::TreeSelection> selection = items_treeview->get_selection();
490 Gtk::TreeModel::iterator iterrow = selection->get_selected();
491
492 if (iterrow)
493 {
494 // Row selected
495 Gtk::TreeModel::Row row = *iterrow;
496 d_item = row[items_columns.item];
497
498 d_item->setNumberOfUsesLeft(int(uses_spinbutton->get_value()));
499 d_changed = true;
500 }
501 else
502 return;
503 }
504
on_kill_army_type_selected(const ArmyProto * a)505 void ItemlistDialog::on_kill_army_type_selected (const ArmyProto *a)
506 {
507 if (a)
508 d_item->setArmyTypeToKill(a->getId());
509 else
510 {
511 d_item->clearArmyTypeToKill ();
512 banish_worms_switch->property_active () = false;
513 }
514 d_changed = true;
515 }
516
on_capture_keeper_toggled()517 void ItemlistDialog::on_capture_keeper_toggled()
518 {
519 on_switch_toggled(capture_keeper_switch, ItemProto::CAPTURE_KEEPER);
520 }
521
on_summon_monster_toggled()522 void ItemlistDialog::on_summon_monster_toggled()
523 {
524 on_switch_toggled(summon_monster_switch, ItemProto::SUMMON_MONSTER);
525 summon_army_type_button->set_sensitive
526 (summon_monster_switch->get_active());
527 building_type_to_summon_on_combobox->set_sensitive
528 (summon_monster_switch->get_active());
529 if (summon_monster_switch->get_active() == false)
530 {
531 d_item->clearArmyTypeToSummon();
532 building_type_to_summon_on_combobox->set_active (0);
533 summon_army_type_button->clear_selected_army ();
534 }
535 }
536
on_summon_army_type_selected(const ArmyProto * a)537 void ItemlistDialog::on_summon_army_type_selected(const ArmyProto *a)
538 {
539 if (a)
540 d_item->setArmyTypeToSummon(a->getId());
541 else
542 {
543 d_item->clearArmyTypeToSummon ();
544 building_type_to_summon_on_combobox->set_active (0);
545 summon_monster_switch->property_active () = false;
546 }
547
548 d_changed = true;
549 }
550
on_disease_city_toggled()551 void ItemlistDialog::on_disease_city_toggled()
552 {
553 on_switch_toggled(disease_city_switch, ItemProto::DISEASE_CITY);
554 disease_armies_percent_spinbutton->set_sensitive
555 (disease_city_switch->get_active());
556 if (disease_city_switch->get_active () == false)
557 disease_armies_percent_spinbutton->set_value (1);
558 }
559
on_persuade_neutral_city_toggled()560 void ItemlistDialog::on_persuade_neutral_city_toggled()
561 {
562 on_switch_toggled(persuade_neutral_city_switch,
563 ItemProto::PERSUADE_NEUTRALS);
564 }
565
on_teleport_to_city_toggled()566 void ItemlistDialog::on_teleport_to_city_toggled()
567 {
568 on_switch_toggled(teleport_to_city_switch,
569 ItemProto::TELEPORT_TO_CITY);
570 }
571
on_raise_defenders_toggled()572 void ItemlistDialog::on_raise_defenders_toggled()
573 {
574 on_switch_toggled(raise_defenders_switch, ItemProto::RAISE_DEFENDERS);
575 num_defenders_spinbutton->set_sensitive
576 (raise_defenders_switch->get_active());
577 defender_army_type_button->set_sensitive
578 (raise_defenders_switch->get_active());
579 if (raise_defenders_switch->get_active() == false)
580 {
581 d_item->clearArmyTypeToRaise();
582 defender_army_type_button->clear_selected_army ();
583 num_defenders_spinbutton->set_value (1);
584 }
585 }
586
on_steal_percent_changed()587 void ItemlistDialog::on_steal_percent_changed()
588 {
589 if (d_item)
590 {
591 d_item->setPercentGoldToSteal(steal_percent_spinbutton->get_value());
592 d_changed = true;
593 }
594 }
595
on_steal_percent_text_changed()596 void ItemlistDialog::on_steal_percent_text_changed()
597 {
598 steal_percent_spinbutton->set_value(atoi(steal_percent_spinbutton->get_text().c_str()));
599 on_steal_percent_changed();
600 }
601
on_disease_armies_percent_changed()602 void ItemlistDialog::on_disease_armies_percent_changed()
603 {
604 if (d_item)
605 {
606 d_item->setPercentArmiesToKill
607 (disease_armies_percent_spinbutton->get_value());
608 d_changed = true;
609 }
610 }
611
on_disease_armies_percent_text_changed()612 void ItemlistDialog::on_disease_armies_percent_text_changed()
613 {
614 disease_armies_percent_spinbutton->set_value(atoi(disease_armies_percent_spinbutton->get_text().c_str()));
615 on_disease_armies_percent_changed();
616 }
617
on_add_mp_changed()618 void ItemlistDialog::on_add_mp_changed()
619 {
620 if (d_item)
621 {
622 d_item->setMovementPointsToAdd (add_mp_spinbutton->get_value());
623 d_changed = true;
624 }
625 }
626
on_add_mp_text_changed()627 void ItemlistDialog::on_add_mp_text_changed()
628 {
629 add_mp_spinbutton->set_value(atoi(add_mp_spinbutton->get_text().c_str()));
630 on_add_mp_changed();
631 }
632
on_num_defenders_changed()633 void ItemlistDialog::on_num_defenders_changed()
634 {
635 if (d_item)
636 {
637 d_item->setNumberOfArmiesToRaise(num_defenders_spinbutton->get_value());
638 d_changed = true;
639 }
640 }
641
on_num_defenders_text_changed()642 void ItemlistDialog::on_num_defenders_text_changed()
643 {
644 num_defenders_spinbutton->set_value(atoi(num_defenders_spinbutton->get_text().c_str()));
645 on_num_defenders_changed();
646 }
647
on_defender_type_selected(const ArmyProto * a)648 void ItemlistDialog::on_defender_type_selected(const ArmyProto *a)
649 {
650 if (a)
651 d_item->setArmyTypeToRaise(a->getId());
652 else
653 {
654 d_item->clearArmyTypeToRaise ();
655 raise_defenders_switch->property_active () = false;
656 num_defenders_spinbutton->set_value(1);
657 }
658
659 d_changed = true;
660 }
661
on_building_type_to_summon_on_changed()662 void ItemlistDialog::on_building_type_to_summon_on_changed ()
663 {
664 guint32 row = building_type_to_summon_on_combobox->get_active_row_number ();
665 d_item->setBuildingTypeToSummonOn(row);
666 }
667