initial commit, lordsawar source, slightly modified
[lordsawar] / src / editor / tile-preview-dialog.cpp
1 //  Copyright (C) 2008, 2009 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 <gtkmm.h>
21 #include <sigc++/functors/mem_fun.h>
22
23 #include "tile-preview-dialog.h"
24
25 #include "glade-helpers.h"
26 #include "gui/image-helpers.h"
27 #include "ucompose.hpp"
28 #include "defs.h"
29 #include "File.h"
30
31
32 TilePreviewDialog::TilePreviewDialog(Tile *tile, guint32 tileSize)
33 {
34     Glib::RefPtr<Gtk::Builder> xml
35         = Gtk::Builder::create_from_file(get_glade_path()
36                                     + "/tile-preview-dialog.ui");
37
38     xml->get_widget("dialog", dialog);
39
40     xml->get_widget("next_button", next_button);
41     next_button->signal_clicked().connect
42       (sigc::mem_fun(this, &TilePreviewDialog::on_next_clicked));
43     xml->get_widget("previous_button", previous_button);
44     previous_button->signal_clicked().connect
45       (sigc::mem_fun(this, &TilePreviewDialog::on_previous_clicked));
46     xml->get_widget("refresh_button", refresh_button);
47     refresh_button->signal_clicked().connect
48       (sigc::mem_fun(this, &TilePreviewDialog::on_refresh_clicked));
49     xml->get_widget("preview_image", preview_image);
50
51     std::vector<PixMask* > base_tilestyles;
52     base_tilestyles = 
53       disassemble_row(File::getMiscFile("various/editor/tilestyles.png"), 17);
54
55     d_tileSize = tileSize;
56     std::vector<PixMask* >::iterator it;
57     for (it = base_tilestyles.begin(); it != base_tilestyles.end(); it++)
58       {
59         PixMask *pix = (*it)->copy();
60         PixMask::scale(pix, d_tileSize, d_tileSize);
61         tilestyle_images.push_back(pix);
62       }
63
64     std::string scene;
65     TilePreviewScene *s;
66
67     scenes.clear();
68
69     switch (tile->getType())
70       {
71       case Tile::GRASS:
72         scene.clear();
73         scene += "aaaaa";
74         scene += "aaaaa";
75         scene += "aaaaa";
76         scene += "aaaaa";
77         scene += "aaaaa";
78         s = new TilePreviewScene(tile, tilestyle_images, 5, 5, scene);
79         scenes.push_back(s);
80         break;
81       case Tile::WATER:
82         scene.clear();
83         scene += "bcd";
84         scene += "hij";
85         scene += "efg";
86         s = new TilePreviewScene(tile, tilestyle_images, 3, 3, scene);
87         scenes.push_back(s);
88         scene.clear();
89         scene += "iiiii";
90         scene += "iiiii";
91         scene += "iiiii";
92         scene += "iiiii";
93         scene += "iiiii";
94         s = new TilePreviewScene(tile, tilestyle_images, 5, 5, scene);
95         scenes.push_back(s);
96         scene.clear();
97         scene += "iiii";
98         scene += "ikli";
99         scene += "ijhi";
100         scene += "imni";
101         scene += "iiii";
102         s = new TilePreviewScene(tile, tilestyle_images, 5, 4, scene);
103         scenes.push_back(s);
104         break;
105       case Tile::FOREST:
106         scene.clear();
107         scene += "bcd";
108         scene += "hij";
109         scene += "efg";
110         s = new TilePreviewScene(tile, tilestyle_images, 3, 3, scene);
111         scenes.push_back(s);
112         break;
113       case Tile::HILLS:
114         scene.clear();
115         scene += "bcd";
116         scene += "hij";
117         scene += "efg";
118         s = new TilePreviewScene(tile, tilestyle_images, 3, 3, scene);
119         scenes.push_back(s);
120         break;
121       case Tile::MOUNTAIN:
122         scene.clear();
123         scene += "bcd";
124         scene += "hij";
125         scene += "efg";
126         s = new TilePreviewScene(tile, tilestyle_images, 3, 3, scene);
127         scenes.push_back(s);
128         break;
129       case Tile::SWAMP:
130         scene = "aaaaa";
131         scene += "aaaaa";
132         scene += "aaaaa";
133         scene += "aaaaa";
134         scene += "aaaaa";
135         s = new TilePreviewScene(tile, tilestyle_images, 5, 5, scene);
136         scenes.push_back(s);
137         break;
138       case Tile::VOID:
139         scene.clear();
140         scene += "bcd";
141         scene += "hij";
142         scene += "efg";
143         s = new TilePreviewScene(tile, tilestyle_images, 3, 3, scene);
144         scenes.push_back(s);
145         break;
146       }
147     d_tile = tile;
148     current_scene = scenes.begin();
149     if (*current_scene)
150       update_scene(*current_scene);
151
152     update_buttons();
153 }
154
155 TilePreviewDialog::~TilePreviewDialog()
156 {
157   delete dialog;
158 }
159 void TilePreviewDialog::set_parent_window(Gtk::Window &parent)
160 {
161     dialog->set_transient_for(parent);
162     //dialog->set_position(Gtk::WIN_POS_CENTER_ON_PARENT);
163 }
164
165 void TilePreviewDialog::run()
166 {
167     dialog->show_all();
168     dialog->run();
169
170     return;
171 }
172
173
174 void TilePreviewDialog::on_next_clicked()
175 {
176   if (scenes.end() != current_scene)
177     {
178       current_scene++;
179       TilePreviewScene *scene = *current_scene;
180       if (scene)
181         {
182           update_scene(scene);
183           update_buttons();
184         }
185     }
186 }
187
188 void TilePreviewDialog::on_previous_clicked()
189 {
190   if (scenes.begin() != current_scene)
191     {
192       current_scene--;
193       TilePreviewScene *scene = *current_scene;
194       if (scene)
195         {
196           update_scene(scene);
197           update_buttons();
198         }
199     }
200 }
201
202 void TilePreviewDialog::on_refresh_clicked()
203 {
204   TilePreviewScene *scene = *current_scene;
205   if (scene)
206     {
207       scene->regenerate();
208       update_scene(scene);
209     }
210 }
211
212 void TilePreviewDialog::update_scene(TilePreviewScene *scene)
213 {
214   if (!scene)
215     return;
216   /*
217   scene_table = new Gtk::Table(scene->getHeight(), scene->getWidth());
218   scene_box->add(*manage(scene_table));
219   for (int i = 0; i < scene->getHeight(); i++)
220     {
221       for (int j = 0; j < scene->getWidth(); j++)
222         {
223           Glib::RefPtr<Gdk::Pixbuf> pixbuf = scene->getTileStylePixbuf(i, j);
224           Gtk::Image *image = new Gtk::Image(pixbuf);
225           TileStyle *style = scene->getTileStyle(i, j);
226           if (style)
227             {
228               char buf[20];
229               snprintf (buf, sizeof (buf), "0x%02x", style->getId());
230               image->set_tooltip_text(buf);
231             }
232           scene_table->attach(*image, j, j + 1, i, i + 1, 
233                               Gtk::SHRINK, Gtk::SHRINK);
234           image->show();
235         }
236     }
237     */
238   preview_image->property_pixbuf() = scene->renderScene(d_tileSize);
239   preview_image->show_all();
240 }
241
242 void TilePreviewDialog::update_buttons()
243 {
244   std::list<TilePreviewScene*>::iterator it = current_scene;
245   next_button->set_sensitive(++it != scenes.end());
246   previous_button->set_sensitive(current_scene != scenes.begin());
247 }