diff options
Diffstat (limited to 'src/Instance.cpp')
-rw-r--r-- | src/Instance.cpp | 77 |
1 files changed, 58 insertions, 19 deletions
diff --git a/src/Instance.cpp b/src/Instance.cpp index ce0d239..3eee22f 100644 --- a/src/Instance.cpp +++ b/src/Instance.cpp @@ -18,21 +18,24 @@ */ #include "Instance.h" -#include <iostream> -#include <libxml++/validators/dtdvalidator.h> -#include <libxml/tree.h> -#include <gtkmm/toolbutton.h> + #include <Gui/Window.h> #include <Gui/RenderArea.h> #include <Data/Level.h> +#include <Data/Room.h> #include <View/TopView.h> #include <View/MapView.h> +#include <iostream> +#include <libxml++/validators/dtdvalidator.h> +#include <libxml/tree.h> +#include <gtkmm/toolbutton.h> + namespace ZoomEdit { guint Instance::instances = 0; -Instance::Instance(const Glib::ustring &file) : window(0), levelXml(0), level(0), view(0) { +Instance::Instance(const Glib::ustring &file) : window(0), view(0), levelXml(0), level(0), selectedRoom(0) { instances++; try { @@ -50,13 +53,16 @@ Instance::Instance(const Glib::ustring &file) : window(0), levelXml(0), level(0) } window->signal_hide().connect(sigc::mem_fun(this, &Instance::destroy)); + window->getRoomList()->get_selection()->signal_changed().connect(sigc::mem_fun(this, &Instance::onRoomListSelect)); - view = new View::TopView(); + view = new View::TopView(this); window->getRenderArea()->setView(view); mapView = new View::MapView(view); window->getMapArea()->setView(mapView); + view->signalUpdate().connect(sigc::mem_fun(this, &Instance::onUpdate)); + Gtk::ToolButton *button; builder->get_widget("ToolButtonZoomIn", button); button->signal_clicked().connect(sigc::bind(sigc::mem_fun(view, &View::TopView::zoom), 2, 0, 0)); @@ -93,14 +99,54 @@ Instance::~Instance() { Gtk::Main::quit(); } -void Instance::createLevel() { +void Instance::setSelectedRoom(Data::Room *newSelectedRoom) { + if(selectedRoom == newSelectedRoom) + return; + + selectedRoom = newSelectedRoom; + view->signalUpdate().emit(); +} + +void Instance::onUpdate() { + window->getRoomListStore()->clear(); + + const std::list<Data::Room*> rooms = level->getRooms(); + + for(std::list<Data::Room*>::const_iterator room = rooms.begin(); room != rooms.end(); ++room) { + Gtk::ListStore::iterator row = window->getRoomListStore()->append(); + row->set_value(Gui::Window::ROOM_LIST_COLUMN_RECORD.room, static_cast<void*>(*room)); + + if(*room == selectedRoom) { + window->getRoomList()->get_selection()->select(row); + } + } +} + +void Instance::onRoomListSelect() { + Gtk::ListStore::iterator row = window->getRoomList()->get_selection()->get_selected(); + if(!window->getRoomListStore()->iter_is_valid(row)) + return; + + setSelectedRoom(static_cast<Data::Room*>(row->get_value(Gui::Window::ROOM_LIST_COLUMN_RECORD.room))); +} + +void Instance::deleteLevel() { if(level) { - view->setLevel(0); delete level; + level = 0; + view->signalUpdate().emit(); } - + if(levelXml) delete levelXml; +} + +void Instance::setLevel() { + view->signalUpdate().emit(); +} + +void Instance::createLevel() { + deleteLevel(); levelXml = new xmlpp::DomParser; xmlpp::Document *doc = levelXml->get_document(); @@ -125,18 +171,11 @@ void Instance::createLevel() { level = new Data::Level(root); - view->setLevel(level); + setLevel(); } bool Instance::loadLevel(const Glib::ustring &file) { - if(level) { - view->setLevel(0); - delete level; - level = 0; - } - - if(levelXml) - delete levelXml; + deleteLevel(); levelXml = new xmlpp::DomParser(file); xmlpp::Document *doc = levelXml->get_document(); @@ -149,7 +188,7 @@ bool Instance::loadLevel(const Glib::ustring &file) { level = new Data::Level(doc->get_root_node()); - view->setLevel(level); + setLevel(); return true; } |