1
// Copyright (C) 2007, Ole Laursen
2
// Copyright (C) 2007, 2008 Ben Asselstine
1
// Copyright (C) 2007 Ole Laursen
2
// Copyright (C) 2007, 2008, 2009 Ben Asselstine
4
4
// This program is free software; you can redistribute it and/or modify
5
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation; either version 2 of the License, or
6
// the Free Software Foundation; either version 3 of the License, or
7
7
// (at your option) any later version.
9
9
// This program is distributed in the hope that it will be useful,
41
42
HeroDialog::HeroDialog(Hero *h, Vector<int> p)
43
GraphicsCache *gc = GraphicsCache::getInstance();
44
inhibit_hero_changed = false;
47
Glib::RefPtr<Gnome::Glade::Xml> xml
48
= Gnome::Glade::Xml::create(get_glade_path()
49
+ "/hero-dialog.glade");
52
xml->get_widget("dialog", d);
54
decorate(dialog.get());
55
window_closed.connect(sigc::mem_fun(dialog.get(), &Gtk::Dialog::hide));
56
set_title(hero->getName());
58
Gtk::Label *hero_label;
59
xml->get_widget("hero_label", hero_label);
60
hero_label->set_markup("<b>" + hero->getName() + "</b>");
62
Gtk::Image *hero_image;
63
xml->get_widget("hero_image", hero_image);
64
hero_image->property_pixbuf() = to_pixbuf(gc->getArmyPic(hero));
48
Glib::RefPtr<Gtk::Builder> xml
49
= Gtk::Builder::create_from_file(get_glade_path()
52
xml->get_widget("dialog", dialog);
54
window_closed.connect(sigc::mem_fun(dialog, &Gtk::Dialog::hide));
55
xml->get_widget("map_image", map_image);
57
std::list<Hero*> heroes;
58
heroes = Playerlist::getActiveplayer()->getHeroes();
59
heroesmap = new HeroesMap(heroes);
61
heroesmap->setSelectedHero(hero);
64
Player *p = Playerlist::getActiveplayer();
65
hero = *heroes.begin();
66
pos = p->getPositionOfArmyById(hero->getId());
67
heroesmap->setSelectedHero(hero);
69
heroesmap->map_changed.connect(
70
sigc::mem_fun(this, &HeroDialog::on_map_changed));
71
Gtk::EventBox *map_eventbox;
72
xml->get_widget("map_eventbox", map_eventbox);
73
map_eventbox->add_events(Gdk::BUTTON_PRESS_MASK);
74
map_eventbox->signal_button_press_event().connect(
75
sigc::mem_fun(*this, &HeroDialog::on_map_mouse_button_event));
66
77
xml->get_widget("info_label1", info_label1);
67
78
xml->get_widget("info_label2", info_label2);
68
fill_in_info_labels();
70
80
xml->get_widget("drop_button", drop_button);
71
81
xml->get_widget("pickup_button", pickup_button);
73
82
drop_button->signal_clicked()
74
83
.connect(sigc::mem_fun(this, &HeroDialog::on_drop_clicked));
75
84
pickup_button->signal_clicked()
76
85
.connect(sigc::mem_fun(this, &HeroDialog::on_pickup_clicked));
87
xml->get_widget("next_button", next_button);
88
xml->get_widget("prev_button", prev_button);
89
next_button->signal_clicked()
90
.connect(sigc::mem_fun(this, &HeroDialog::on_next_clicked));
91
prev_button->signal_clicked()
92
.connect(sigc::mem_fun(this, &HeroDialog::on_prev_clicked));
93
if (heroes.size() <= 1)
95
next_button->set_sensitive(false);
96
prev_button->set_sensitive(false);
99
heroes_list = Gtk::ListStore::create(heroes_columns);
100
xml->get_widget("heroes_treeview", heroes_treeview);
101
heroes_treeview->set_model(heroes_list);
102
heroes_treeview->append_column(_("Hero"), heroes_columns.name);
104
heroes_list->clear();
106
for (std::list<Hero*>::iterator it = heroes.begin(); it != heroes.end();
112
Gtk::TreeModel::Row row;
113
row = heroes_treeview->get_model()->children()[count];
114
heroes_treeview->get_selection()->select(row);
118
heroes_treeview->get_selection()->signal_changed()
119
.connect(sigc::mem_fun(this, &HeroDialog::on_hero_changed));
78
121
item_list = Gtk::ListStore::create(item_columns);
79
122
xml->get_widget("treeview", item_treeview);
80
123
item_treeview->set_model(item_list);
84
127
item_treeview->append_column(_("Status"), item_columns.status);
86
129
item_treeview->get_selection()->signal_changed()
87
.connect(sigc::mem_fun(this, &HeroDialog::on_selection_changed));
130
.connect(sigc::mem_fun(this, &HeroDialog::on_item_selection_changed));
89
132
events_list = Gtk::ListStore::create(events_columns);
90
133
xml->get_widget("events_treeview", events_treeview);
91
134
events_treeview->append_column("", events_columns.desc);
92
135
events_treeview->set_model(events_list);
93
136
events_list->clear();
94
std::list<History* > events;
95
events = hero->getOwner()->getHistoryForHeroId(hero->getId());
96
for (std::list<History*>::iterator i = events.begin(); i != events.end();
100
on_selection_changed();
102
// populate the item list
103
Backpack *backpack = hero->getBackpack();
104
for (Backpack::iterator i = backpack->begin(); i != backpack->end(); ++i)
107
MapBackpack *ground = GameMap::getInstance()->getTile(pos)->getBackpack();
108
for (MapBackpack::iterator i = ground->begin(); i != ground->end(); i++)
138
on_item_selection_changed();
141
HeroDialog::~HeroDialog()
112
146
void HeroDialog::addHistoryEvent(History *history)
114
148
Glib::ustring s = "";
206
240
void HeroDialog::run()
208
GameMap *gm = GameMap::getInstance();
211
if (gm->getTile(pos)->getBackpack()->size() > 0 &&
212
gm->getTile(pos)->getMaptileType() == Tile::WATER)
243
heroesmap->draw(Playerlist::getActiveplayer());
244
GameMap *gm = GameMap::getInstance();
248
if (gm->getTile(pos)->getBackpack()->size() > 0 &&
249
gm->getTile(pos)->getMaptileType() == Tile::WATER)
251
// splash, items lost forever
252
while (gm->getTile(pos)->getBackpack()->size())
254
MapBackpack::iterator i = gm->getTile(pos)->getBackpack()->begin();
255
gm->getTile(pos)->getBackpack()->removeFromBackpack(*i);
260
void HeroDialog::update_hero_list()
262
inhibit_hero_changed = true;
263
std::list<Hero*> heroes;
264
heroes = Playerlist::getActiveplayer()->getHeroes();
266
for (std::list<Hero*>::iterator it = heroes.begin(); it != heroes.end();
214
// splash, items lost forever
215
while (gm->getTile(pos)->getBackpack()->size())
217
MapBackpack::iterator i = gm->getTile(pos)->getBackpack()->begin();
218
gm->getTile(pos)->getBackpack()->removeFromBackpack(*i);
271
Gtk::TreeModel::Row row;
272
row = heroes_treeview->get_model()->children()[count];
273
heroes_treeview->get_selection()->select(row);
223
void HeroDialog::on_selection_changed()
277
inhibit_hero_changed = false;
280
void HeroDialog::on_hero_changed()
282
if (inhibit_hero_changed == true)
284
Glib::RefPtr<Gtk::TreeSelection> selection = heroes_treeview->get_selection();
285
Gtk::TreeModel::iterator iterrow = selection->get_selected();
289
Gtk::TreeModel::Row row = *iterrow;
290
hero = row[heroes_columns.hero];
291
pos = Playerlist::getActiveplayer()->getPositionOfArmyById(hero->getId());
292
heroesmap->setSelectedHero(hero);
294
heroesmap->draw(Playerlist::getActiveplayer());
299
void HeroDialog::on_item_selection_changed()
225
301
Gtk::TreeIter i = item_treeview->get_selection()->get_selected();
244
320
Item *item = (*i)[item_columns.item];
245
321
hero->getOwner()->heroDropItem (hero, item, pos);
246
322
(*i)[item_columns.status] = _("On the ground");
247
on_selection_changed();
323
on_item_selection_changed();
248
324
fill_in_info_labels();
328
void HeroDialog::on_next_clicked()
330
std::list<Hero*> heroes;
331
heroes = Playerlist::getActiveplayer()->getHeroes();
332
std::list<Hero*>::iterator next;
333
next = find (heroes.begin(), heroes.end(), hero);
334
if (next != heroes.end())
337
if (next == heroes.end())
338
next = heroes.begin();
340
heroesmap->setSelectedHero(hero);
342
heroesmap->draw(Playerlist::getActiveplayer());
346
void HeroDialog::on_prev_clicked()
348
std::list<Hero*> heroes;
349
heroes = Playerlist::getActiveplayer()->getHeroes();
350
std::list<Hero*>::reverse_iterator prev;
351
prev = find (heroes.rbegin(), heroes.rend(), hero);
352
if (prev != heroes.rend())
355
if (prev == heroes.rend())
356
prev = heroes.rbegin();
358
heroesmap->setSelectedHero(hero);
360
heroesmap->draw(Playerlist::getActiveplayer());
252
364
void HeroDialog::on_pickup_clicked()
254
366
Gtk::TreeIter i = item_treeview->get_selection()->get_selected();
332
451
s += String::ucompose(_("Upkeep: %1"), hero->getUpkeep());
333
452
info_label2->set_text(s);
455
void HeroDialog::on_map_changed(Glib::RefPtr<Gdk::Pixmap> map)
457
map_image->property_pixmap() = map;
460
bool HeroDialog::on_map_mouse_button_event(GdkEventButton *e)
462
if (e->type != GDK_BUTTON_PRESS)
463
return true; // useless event
465
heroesmap->mouse_button_event(to_input_event(e));
467
hero = heroesmap->getSelectedHero();
468
pos = Playerlist::getActiveplayer()->getPositionOfArmyById(hero->getId());
470
heroesmap->draw(Playerlist::getActiveplayer());
475
void HeroDialog::show_hero()
477
set_title(hero->getName());
479
fill_in_info_labels();
480
std::list<History* > events;
481
events = hero->getOwner()->getHistoryForHeroId(hero->getId());
482
events_list->clear();
483
for (std::list<History*>::iterator i = events.begin(); i != events.end();
487
// populate the item list
489
Backpack *backpack = hero->getBackpack();
490
for (Backpack::iterator i = backpack->begin(); i != backpack->end(); ++i)
493
MapBackpack *ground = GameMap::getInstance()->getTile(pos)->getBackpack();
494
for (MapBackpack::iterator i = ground->begin(); i != ground->end(); i++)