From b4adc20ef08257124a01499436f2b8b447adcb33 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Sat, 9 Jan 2010 03:18:25 +0100 Subject: Use room list --- src/Instance.cpp | 77 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 19 deletions(-) (limited to 'src/Instance.cpp') 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 -#include -#include -#include + #include #include #include +#include #include #include +#include +#include +#include +#include + 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 rooms = level->getRooms(); + + for(std::list::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(*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(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; } -- cgit v1.2.3