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