1 // Copyright (C) 2009, 2010, 2012, 2014 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 <assert.h>
21 #include <sigc++/functors/mem_fun.h>
22 #include <gtkmm.h>
23
24 #include "switch-sets-dialog.h"
25
26 #include "defs.h"
27 #include "File.h"
28 #include "tileset.h"
29 #include "tilesetlist.h"
30 #include "armysetlist.h"
31 #include "citysetlist.h"
32 #include "shieldsetlist.h"
33 #include "ucompose.hpp"
34 #include "GameMap.h"
35 #include "ruinlist.h"
36 #include "citylist.h"
37 #include "armyset.h"
38 #include "shieldset.h"
39 #include "cityset.h"
40 #include "playerlist.h"
41
SwitchSetsDialog(Gtk::Window & parent)42 SwitchSetsDialog::SwitchSetsDialog(Gtk::Window &parent)
43 :LwEditorDialog(parent, "switch-sets-dialog.ui")
44 {
45 xml->get_widget("accept_button", accept_button);
46
47 // fill in tile themes combobox
48
49 guint32 counter = 0;
50 guint32 default_id = 0;
51 Gtk::Box *box;
52
53 //fill in tile sizes combobox
54 tile_size_combobox = manage(new Gtk::ComboBoxText);
55 std::list<guint32> sizes;
56 Tilesetlist::getInstance()->getSizes(sizes);
57 Citysetlist::getInstance()->getSizes(sizes);
58 Armysetlist::getInstance()->getSizes(sizes);
59 for (std::list<guint32>::iterator it = sizes.begin(); it != sizes.end();
60 it++)
61 {
62 Glib::ustring s = String::ucompose("%1x%1", *it);
63 tile_size_combobox->append(s);
64 if ((*it) == GameMap::getInstance()->getTileSize())
65 default_id = counter;
66 counter++;
67 }
68 tile_size_combobox->set_active(default_id);
69 xml->get_widget("tile_size_box", box);
70 box->pack_start(*tile_size_combobox, Gtk::PACK_SHRINK);
71 tile_size_combobox->signal_changed().connect
72 (sigc::mem_fun(*this, &SwitchSetsDialog::on_tile_size_changed));
73
74 // make new tile themes combobox
75 tile_theme_combobox = manage(new Gtk::ComboBoxText);
76 xml->get_widget("tile_theme_box", box);
77 box->pack_start(*tile_theme_combobox, Gtk::PACK_SHRINK);
78
79 // make new army themes combobox
80 army_theme_combobox = manage(new Gtk::ComboBoxText);
81 xml->get_widget("army_theme_box", box);
82 box->pack_start(*army_theme_combobox, Gtk::PACK_SHRINK);
83
84 // make new city themes combobox
85 city_theme_combobox = manage(new Gtk::ComboBoxText);
86 xml->get_widget("city_theme_box", box);
87 box->pack_start(*city_theme_combobox, Gtk::PACK_SHRINK);
88
89 counter = 0;
90 default_id = 0;
91 shield_theme_combobox = manage(new Gtk::ComboBoxText);
92 Shieldsetlist *sl = Shieldsetlist::getInstance();
93 std::list<Glib::ustring> shield_themes = sl->getValidNames();
94 for (std::list<Glib::ustring>::iterator i = shield_themes.begin(),
95 end = shield_themes.end(); i != end; ++i)
96 {
97 if (*i == GameMap::getInstance()->getShieldset()->getName())
98 default_id = counter;
99 shield_theme_combobox->append(Glib::filename_to_utf8(*i));
100 counter++;
101 }
102
103 shield_theme_combobox->set_active(default_id);
104
105 xml->get_widget("shield_theme_box", box);
106 box->pack_start(*shield_theme_combobox, Gtk::PACK_SHRINK);
107
108 on_tile_size_changed();
109
110 tileset_changed = false;
111 armyset_changed = false;
112 cityset_changed = false;
113 shieldset_changed = false;
114 }
115
get_active_tile_size()116 guint32 SwitchSetsDialog::get_active_tile_size()
117 {
118 return (guint32) atoi(tile_size_combobox->get_active_text().c_str());
119 }
120
on_tile_size_changed()121 void SwitchSetsDialog::on_tile_size_changed()
122 {
123 guint32 default_id = 0;
124 guint32 counter = 0;
125
126 tile_theme_combobox->remove_all();
127 Tilesetlist *tl = Tilesetlist::getInstance();
128 std::list<Glib::ustring> tile_themes = tl->getValidNames(get_active_tile_size());
129 for (std::list<Glib::ustring>::iterator i = tile_themes.begin(),
130 end = tile_themes.end(); i != end; ++i)
131 {
132 if (*i == GameMap::getInstance()->getTileset()->getName())
133 default_id = counter;
134 tile_theme_combobox->append(Glib::filename_to_utf8(*i));
135 counter++;
136 }
137
138 tile_theme_combobox->set_active(default_id);
139 if (tile_theme_combobox->get_model()->children().size() == 0)
140 accept_button->set_sensitive(false);
141
142 army_theme_combobox->remove_all();
143 Armysetlist *al = Armysetlist::getInstance();
144 std::list<Glib::ustring> army_themes = al->getValidNames(get_active_tile_size());
145 counter = 0;
146 default_id = 0;
147 int armyset = Playerlist::getActiveplayer()->getArmyset();
148 for (std::list<Glib::ustring>::iterator i = army_themes.begin(),
149 end = army_themes.end(); i != end; ++i)
150 {
151 if (*i == Armysetlist::getInstance()->get(armyset)->getName())
152 default_id = counter;
153 army_theme_combobox->append(Glib::filename_to_utf8(*i));
154 counter++;
155 }
156
157 army_theme_combobox->set_active(default_id);
158 if (army_theme_combobox->get_model()->children().size() == 0)
159 accept_button->set_sensitive(false);
160
161 city_theme_combobox->remove_all();
162
163 Citysetlist *cl = Citysetlist::getInstance();
164 std::list<Glib::ustring> city_themes = cl->getValidNames(get_active_tile_size());
165 counter = 0;
166 default_id = 0;
167 Cityset *active = GameMap::getCityset();
168 for (std::list<Glib::ustring>::iterator i = city_themes.begin(),
169 end = city_themes.end(); i != end; ++i)
170 {
171 if (*i == active->getName())
172 default_id = counter;
173 //only append it if the tile widths are identical.
174 //Cityset *cityset =
175 //cl->getCityset(cl->getCitysetDir(*i, get_active_tile_size()));
176 //if (active->tileWidthsEqual(cityset) == true)
177 city_theme_combobox->append(Glib::filename_to_utf8(*i));
178 counter++;
179 }
180
181 city_theme_combobox->set_active(default_id);
182 if (city_theme_combobox->get_model()->children().size() == 0)
183 accept_button->set_sensitive(false);
184 }
185
run()186 int SwitchSetsDialog::run()
187 {
188 dialog->show_all();
189 int response = dialog->run();
190 if (response != Gtk::RESPONSE_ACCEPT) // accepted
191 return response;
192 Glib::ustring subdir;
193 subdir = Tilesetlist::getInstance()->getSetDir
194 (Glib::filename_from_utf8(tile_theme_combobox->get_active_text()),
195 get_active_tile_size());
196 selected_tileset = Tilesetlist::getInstance()->get(subdir);
197
198 subdir = Shieldsetlist::getInstance()->getSetDir
199 (Glib::filename_from_utf8(shield_theme_combobox->get_active_text()));
200 selected_shieldset = Shieldsetlist::getInstance()->get(subdir);
201
202 subdir = Citysetlist::getInstance()->getSetDir
203 (Glib::filename_from_utf8(city_theme_combobox->get_active_text()),
204 get_active_tile_size());
205 selected_cityset = Citysetlist::getInstance()->get(subdir);
206
207 subdir = Armysetlist::getInstance()->getSetDir
208 (Glib::filename_from_utf8(army_theme_combobox->get_active_text()),
209 get_active_tile_size());
210 selected_armyset = Armysetlist::getInstance()->get(subdir);
211
212 Armyset *old_armyset = Armysetlist::getInstance()->get(Playerlist::getInstance()->getNeutral()->getArmyset());
213 if (old_armyset->getId() != selected_armyset->getId())
214 armyset_changed = true;
215 GameMap::getInstance()->switchArmysets(selected_armyset);
216 if (selected_cityset->getBaseName() != GameMap::getCityset()->getBaseName())
217 {
218 cityset_changed = true;
219 GameMap::getInstance()->switchCityset(selected_cityset);
220 }
221 if (selected_shieldset->getBaseName() != GameMap::getShieldset()->getBaseName())
222 {
223 shieldset_changed = true;
224 GameMap::getInstance()->switchShieldset(selected_shieldset);
225 }
226 if (selected_tileset->getBaseName() != GameMap::getTileset()->getBaseName())
227 {
228 tileset_changed = true;
229 GameMap::getInstance()->switchTileset(selected_tileset);
230 }
231 return response;
232 }
233