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