1 // Copyright (C) 2008, 2009 Ben Asselstine
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.
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.
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
21 #include <sigc++/functors/mem_fun.h>
23 #include "tile-preview-dialog.h"
25 #include "glade-helpers.h"
26 #include "gui/image-helpers.h"
27 #include "ucompose.hpp"
32 TilePreviewDialog::TilePreviewDialog(Tile *tile, guint32 tileSize)
34 Glib::RefPtr<Gtk::Builder> xml
35 = Gtk::Builder::create_from_file(get_glade_path()
36 + "/tile-preview-dialog.ui");
38 xml->get_widget("dialog", dialog);
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);
51 std::vector<PixMask* > base_tilestyles;
53 disassemble_row(File::getMiscFile("various/editor/tilestyles.png"), 17);
55 d_tileSize = tileSize;
56 std::vector<PixMask* >::iterator it;
57 for (it = base_tilestyles.begin(); it != base_tilestyles.end(); it++)
59 PixMask *pix = (*it)->copy();
60 PixMask::scale(pix, d_tileSize, d_tileSize);
61 tilestyle_images.push_back(pix);
69 switch (tile->getType())
78 s = new TilePreviewScene(tile, tilestyle_images, 5, 5, scene);
86 s = new TilePreviewScene(tile, tilestyle_images, 3, 3, scene);
94 s = new TilePreviewScene(tile, tilestyle_images, 5, 5, scene);
102 s = new TilePreviewScene(tile, tilestyle_images, 5, 4, scene);
110 s = new TilePreviewScene(tile, tilestyle_images, 3, 3, scene);
118 s = new TilePreviewScene(tile, tilestyle_images, 3, 3, scene);
126 s = new TilePreviewScene(tile, tilestyle_images, 3, 3, scene);
135 s = new TilePreviewScene(tile, tilestyle_images, 5, 5, scene);
143 s = new TilePreviewScene(tile, tilestyle_images, 3, 3, scene);
148 current_scene = scenes.begin();
150 update_scene(*current_scene);
155 TilePreviewDialog::~TilePreviewDialog()
159 void TilePreviewDialog::set_parent_window(Gtk::Window &parent)
161 dialog->set_transient_for(parent);
162 //dialog->set_position(Gtk::WIN_POS_CENTER_ON_PARENT);
165 void TilePreviewDialog::run()
174 void TilePreviewDialog::on_next_clicked()
176 if (scenes.end() != current_scene)
179 TilePreviewScene *scene = *current_scene;
188 void TilePreviewDialog::on_previous_clicked()
190 if (scenes.begin() != current_scene)
193 TilePreviewScene *scene = *current_scene;
202 void TilePreviewDialog::on_refresh_clicked()
204 TilePreviewScene *scene = *current_scene;
212 void TilePreviewDialog::update_scene(TilePreviewScene *scene)
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++)
221 for (int j = 0; j < scene->getWidth(); j++)
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);
229 snprintf (buf, sizeof (buf), "0x%02x", style->getId());
230 image->set_tooltip_text(buf);
232 scene_table->attach(*image, j, j + 1, i, i + 1,
233 Gtk::SHRINK, Gtk::SHRINK);
238 preview_image->property_pixbuf() = scene->renderScene(d_tileSize);
239 preview_image->show_all();
242 void TilePreviewDialog::update_buttons()
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());