summaryrefslogtreecommitdiffstats
path: root/src/Instance.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Instance.cpp')
-rw-r--r--src/Instance.cpp77
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;
}