paysages3d/src/definition/DefinitionNode.cpp

128 lines
2.5 KiB
C++
Raw Normal View History

#include "DefinitionNode.h"
2013-11-03 12:00:31 +00:00
#include "PackStream.h"
DefinitionNode::DefinitionNode(DefinitionNode* parent, const std::string &name):
parent(parent), name(name)
{
2013-10-30 14:39:56 +00:00
if (parent)
{
root = parent->root;
parent->addChild(this);
2013-10-30 14:39:56 +00:00
}
else
{
root = this;
}
}
DefinitionNode::~DefinitionNode()
2013-10-30 14:39:56 +00:00
{
if (parent)
{
parent->removeChild(this);
parent = NULL;
}
2015-08-12 17:29:28 +00:00
// Work on a copy, because the child destructor will modify the array by removing itself using removeChild
std::vector<DefinitionNode*> children_copy = children;
2015-08-12 17:29:28 +00:00
for (auto child:children_copy)
2013-10-30 14:39:56 +00:00
{
if (child->getParent() == this)
{
delete child;
}
2013-10-30 14:39:56 +00:00
}
}
void DefinitionNode::setName(const std::string &name)
2013-10-30 14:39:56 +00:00
{
2013-10-31 16:59:18 +00:00
this->name = name;
2013-10-30 14:39:56 +00:00
}
Scenery* DefinitionNode::getScenery()
{
if (parent)
{
return parent->getScenery();
}
else
{
return NULL;
}
}
std::string DefinitionNode::toString(int indent) const
{
std::string result;
for (int i = 0; i < indent; i++)
{
result += " ";
}
result += name;
if (not children.empty())
{
for (auto &child: children)
{
result += "\n" + child->toString(indent + 1);
}
}
return result;
}
void DefinitionNode::save(PackStream* stream) const
2013-10-30 14:39:56 +00:00
{
2013-11-15 23:27:40 +00:00
stream->write(name);
for (auto child: children)
2013-10-30 14:39:56 +00:00
{
child->save(stream);
2013-10-30 14:39:56 +00:00
}
}
void DefinitionNode::load(PackStream* stream)
2013-10-30 14:39:56 +00:00
{
2013-11-15 23:27:40 +00:00
name = stream->readString();
for (auto child: children)
2013-10-30 14:39:56 +00:00
{
child->load(stream);
2013-10-30 14:39:56 +00:00
}
}
2013-10-31 16:59:18 +00:00
void DefinitionNode::copy(DefinitionNode* destination) const
2013-10-31 16:59:18 +00:00
{
2013-10-31 23:09:51 +00:00
destination->setName(name);
// can't copy children as we don't know their types...
2013-10-31 16:59:18 +00:00
}
void DefinitionNode::validate()
2013-10-31 16:59:18 +00:00
{
for (auto child: children)
2013-10-31 16:59:18 +00:00
{
child->validate();
2013-10-31 16:59:18 +00:00
}
}
void DefinitionNode::addChild(DefinitionNode* child)
2013-10-31 16:59:18 +00:00
{
if (std::find(children.begin(), children.end(), child) == children.end())
2013-10-31 16:59:18 +00:00
{
children.push_back(child);
2013-10-31 16:59:18 +00:00
child->parent = this;
child->root = this->root;
}
}
void DefinitionNode::removeChild(DefinitionNode* child)
2013-10-31 16:59:18 +00:00
{
std::vector<DefinitionNode*>::iterator it = std::find(children.begin(), children.end(), child);
if (it != children.end())
{
child->parent = NULL;
children.erase(it);
}
else
{
qWarning("Trying to remove not found child '%s' from '%s'", child->name.c_str(), name.c_str());
}
2013-10-31 16:59:18 +00:00
}