summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorneoraider <devnull@localhost>2008-04-12 21:06:05 +0200
committerneoraider <devnull@localhost>2008-04-12 21:06:05 +0200
commit7fa8e4b4faf6dca308607977d2c2aaa5428ca60d (patch)
tree8cbe7a0068ab0f73a7c6f3640d34c3cc11601edb /src
parent0c6471da931839b4e934d87df27ef208c74355c3 (diff)
downloadzoomedit-7fa8e4b4faf6dca308607977d2c2aaa5428ca60d.tar
zoomedit-7fa8e4b4faf6dca308607977d2c2aaa5428ca60d.zip
zoomedit:
* Made Rooms, Gates and Textures in Levels changable
Diffstat (limited to 'src')
-rw-r--r--src/Data/Gate.cpp3
-rw-r--r--src/Data/Gate.h14
-rw-r--r--src/Data/Level.cpp105
-rw-r--r--src/Data/Level.h31
-rw-r--r--src/Data/Room.cpp2
-rw-r--r--src/Data/Room.h12
-rw-r--r--src/Data/Texture.h4
-rw-r--r--src/Instance.cpp11
-rw-r--r--src/Instance.h1
9 files changed, 168 insertions, 15 deletions
diff --git a/src/Data/Gate.cpp b/src/Data/Gate.cpp
index 5a6c63e..2aa89ee 100644
--- a/src/Data/Gate.cpp
+++ b/src/Data/Gate.cpp
@@ -29,9 +29,10 @@ Gate::Gate(xmlpp::Element *node) : gateNode(node) {
xmlpp::Element *tNode = dynamic_cast<xmlpp::Element*>(*t);
if(tNode)
- triangles.push_front(Triangle(tNode));
+ triangles.push_back(Triangle(tNode));
}
+ id = node->get_attribute_value("id");
room1 = node->get_attribute_value("room1");
room2 = node->get_attribute_value("room2");
}
diff --git a/src/Data/Gate.h b/src/Data/Gate.h
index 91acbce..b1cde71 100644
--- a/src/Data/Gate.h
+++ b/src/Data/Gate.h
@@ -31,6 +31,7 @@ class Gate {
std::list<Triangle> triangles;
xmlpp::Element *gateNode;
+ Glib::ustring id;
Glib::ustring room1, room2;
public:
@@ -40,6 +41,15 @@ class Gate {
return triangles;
}
+ const Glib::ustring& getId() const {
+ return id;
+ }
+
+ void setId(const Glib::ustring &id0) {
+ id = id0;
+ gateNode->set_attribute("id", id0);
+ }
+
const Glib::ustring& getRoom1() const {
return room1;
}
@@ -57,6 +67,10 @@ class Gate {
room2 = room;
gateNode->set_attribute("room2", room);
}
+
+ xmlpp::Element* getNode() const {
+ return gateNode;
+ }
};
}
diff --git a/src/Data/Level.cpp b/src/Data/Level.cpp
index ff6f8fb..6689107 100644
--- a/src/Data/Level.cpp
+++ b/src/Data/Level.cpp
@@ -32,8 +32,11 @@ Level::Level(xmlpp::Element *levelNode) : info(dynamic_cast<xmlpp::Element*>(lev
for(xmlpp::Node::NodeList::iterator room = nodeList.begin(); room != nodeList.end(); ++room) {
xmlpp::Element *roomNode = dynamic_cast<xmlpp::Element*>(*room);
- if(roomNode)
- rooms.push_front(Room(roomNode));
+ if(roomNode) {
+ Room room(roomNode);
+
+ rooms.insert(std::make_pair(room.getId(), room));
+ }
}
nodeList = gatesNode->get_children("gate");
@@ -41,8 +44,11 @@ Level::Level(xmlpp::Element *levelNode) : info(dynamic_cast<xmlpp::Element*>(lev
for(xmlpp::Node::NodeList::iterator gate = nodeList.begin(); gate != nodeList.end(); ++gate) {
xmlpp::Element *gateNode = dynamic_cast<xmlpp::Element*>(*gate);
- if(gateNode)
- gates.push_front(Gate(gateNode));
+ if(gateNode) {
+ Gate gate(gateNode);
+
+ gates.insert(std::make_pair(gate.getId(), gate));
+ }
}
nodeList = texturesNode->get_children("texture");
@@ -50,10 +56,97 @@ Level::Level(xmlpp::Element *levelNode) : info(dynamic_cast<xmlpp::Element*>(lev
for(xmlpp::Node::NodeList::iterator tex = nodeList.begin(); tex != nodeList.end(); ++tex) {
xmlpp::Element *texNode = dynamic_cast<xmlpp::Element*>(*tex);
- if(texNode)
- textures.push_front(Texture(texNode));
+ if(texNode) {
+ Texture tex(texNode);
+
+ textures.insert(std::make_pair(tex.getId(), tex));
+ }
}
}
+Room* Level::getRoom(const Glib::ustring &id) {
+ std::map<Glib::ustring,Room>::iterator room = rooms.find(id);
+ return (room != rooms.end()) ? &room->second : NULL;
+}
+
+const Room* Level::getRoom(const Glib::ustring &id) const {
+ std::map<Glib::ustring,Room>::const_iterator room = rooms.find(id);
+ return (room != rooms.end()) ? &room->second : NULL;
+}
+
+Room* Level::addRoom(const Glib::ustring &id) {
+ xmlpp::Element *node = roomsNode->add_child("room");
+
+ node->set_attribute("id", id);
+
+ return &rooms.insert(std::make_pair(id, Room(node))).first->second;
+}
+
+void Level::removeRoom(const Glib::ustring &id) {
+ Room *room = getRoom(id);
+ if(!room)
+ return;
+
+ roomsNode->remove_child(room->getNode());
+ rooms.erase(id);
+}
+
+Gate* Level::getGate(const Glib::ustring &id) {
+ std::map<Glib::ustring,Gate>::iterator gate = gates.find(id);
+ return (gate != gates.end()) ? &gate->second : NULL;
+}
+
+const Gate* Level::getGate(const Glib::ustring &id) const {
+ std::map<Glib::ustring,Gate>::const_iterator gate = gates.find(id);
+ return (gate != gates.end()) ? &gate->second : NULL;
+}
+
+Gate* Level::addGate(const Glib::ustring &id) {
+ xmlpp::Element *node = gatesNode->add_child("gate");
+
+ node->set_attribute("id", id);
+ node->set_attribute("room1", "");
+ node->set_attribute("room2", "");
+
+ return &gates.insert(std::make_pair(id, Gate(node))).first->second;
+}
+
+void Level::removeGate(const Glib::ustring &id) {
+ Gate *gate = getGate(id);
+ if(!gate)
+ return;
+
+ gatesNode->remove_child(gate->getNode());
+ gates.erase(id);
+}
+
+Texture* Level::getTexture(const Glib::ustring &id) {
+ std::map<Glib::ustring,Texture>::iterator tex = textures.find(id);
+ return (tex != textures.end()) ? &tex->second : NULL;
+}
+
+const Texture* Level::getTexture(const Glib::ustring &id) const {
+ std::map<Glib::ustring,Texture>::const_iterator tex = textures.find(id);
+ return (tex != textures.end()) ? &tex->second : NULL;
+}
+
+Texture* Level::addTexture(const Glib::ustring &id) {
+ xmlpp::Element *node = texturesNode->add_child("texture");
+
+ node->set_attribute("id", id);
+ node->set_attribute("name", "");
+
+ return &textures.insert(std::make_pair(id, Texture(node))).first->second;
+}
+
+void Level::removeTexture(const Glib::ustring &id) {
+ Texture *tex = getTexture(id);
+ if(!tex)
+ return;
+
+ texturesNode->remove_child(tex->getNode());
+ textures.erase(id);
+}
+
}
}
diff --git a/src/Data/Level.h b/src/Data/Level.h
index ab660a2..c72b503 100644
--- a/src/Data/Level.h
+++ b/src/Data/Level.h
@@ -25,6 +25,7 @@
#include "Gate.h"
#include "Texture.h"
#include <list>
+#include <map>
namespace ZoomEdit {
namespace Data {
@@ -33,17 +34,41 @@ class Level {
private:
Info info;
- std::list<Room> rooms;
+ std::map<Glib::ustring,Room> rooms;
xmlpp::Element *roomsNode;
- std::list<Gate> gates;
+ std::map<Glib::ustring,Gate> gates;
xmlpp::Element *gatesNode;
- std::list<Texture> textures;
+ std::map<Glib::ustring,Texture> textures;
xmlpp::Element *texturesNode;
public:
Level(xmlpp::Element *levelNode);
+
+ const std::map<Glib::ustring,Room>& getRooms() const {return rooms;}
+
+ Room* getRoom(const Glib::ustring &id);
+ const Room* getRoom(const Glib::ustring &id) const;
+
+ Room* addRoom(const Glib::ustring &id);
+ void removeRoom(const Glib::ustring &id);
+
+ const std::map<Glib::ustring,Gate>& getGates() const {return gates;}
+
+ Gate* getGate(const Glib::ustring &id);
+ const Gate* getGate(const Glib::ustring &id) const;
+
+ Gate* addGate(const Glib::ustring &id);
+ void removeGate(const Glib::ustring &id);
+
+ const std::map<Glib::ustring,Texture>& getTextures() const {return textures;}
+
+ Texture* getTexture(const Glib::ustring &id);
+ const Texture* getTexture(const Glib::ustring &id) const;
+
+ Texture* addTexture(const Glib::ustring &id);
+ void removeTexture(const Glib::ustring &id);
};
}
diff --git a/src/Data/Room.cpp b/src/Data/Room.cpp
index 08f02f9..9749b22 100644
--- a/src/Data/Room.cpp
+++ b/src/Data/Room.cpp
@@ -29,7 +29,7 @@ Room::Room(xmlpp::Element *node) : roomNode(node) {
xmlpp::Element *tNode = dynamic_cast<xmlpp::Element*>(*t);
if(tNode)
- triangles.push_front(Triangle(tNode));
+ triangles.push_back(Triangle(tNode));
}
id = node->get_attribute_value("id");
diff --git a/src/Data/Room.h b/src/Data/Room.h
index efd67cb..1c1f9e8 100644
--- a/src/Data/Room.h
+++ b/src/Data/Room.h
@@ -36,7 +36,7 @@ class Room {
public:
Room(xmlpp::Element *node);
- const std::list<Triangle>& getTriangles() {
+ const std::list<Triangle>& getTriangles() const {
return triangles;
}
@@ -44,9 +44,13 @@ class Room {
return id;
}
- void setId(const Glib::ustring &nid) {
- id = nid;
- roomNode->set_attribute("id", nid);
+ void setId(const Glib::ustring &id0) {
+ id = id0;
+ roomNode->set_attribute("id", id0);
+ }
+
+ xmlpp::Element* getNode() const {
+ return roomNode;
}
};
diff --git a/src/Data/Texture.h b/src/Data/Texture.h
index e0cea59..b301bbf 100644
--- a/src/Data/Texture.h
+++ b/src/Data/Texture.h
@@ -51,6 +51,10 @@ class Texture {
name = nname;
texNode->set_attribute("name", nname);
}
+
+ xmlpp::Element* getNode() const {
+ return texNode;
+ }
};
}
diff --git a/src/Instance.cpp b/src/Instance.cpp
index fe4b761..f602bbf 100644
--- a/src/Instance.cpp
+++ b/src/Instance.cpp
@@ -19,6 +19,7 @@
#include <iostream>
#include <libxml++/validators/dtdvalidator.h>
+#include <libxml/tree.h>
#include "Instance.h"
#include "Gui/Window.h"
#include "Data/Level.h"
@@ -91,6 +92,8 @@ void Instance::createLevel() {
levelXml = new xmlpp::DomParser;
xmlpp::Document *doc = levelXml->get_document();
+ xmlSetDocCompressMode(doc->cobj(), 9);
+
xmlpp::Element *root = doc->create_root_node("level");
xmlpp::Element *info = root->add_child("info");
@@ -131,6 +134,14 @@ bool Instance::loadLevel(const Glib::ustring &file) {
return (level != NULL);
}
+bool Instance::saveLevel(const Glib::ustring &file) {
+ if(!level | !levelXml->get_document())
+ return false;
+
+ levelXml->get_document()->write_to_file(file);
+ return true;
+}
+
bool Instance::create(const Glib::ustring &file) {
Instance *instance = new Instance(file);
diff --git a/src/Instance.h b/src/Instance.h
index d9c0509..8c22eb4 100644
--- a/src/Instance.h
+++ b/src/Instance.h
@@ -40,6 +40,7 @@ class Instance {
void createLevel();
bool loadLevel(const Glib::ustring &file);
+ bool saveLevel(const Glib::ustring &file);
static bool create(const Glib::ustring &file = Glib::ustring());