refactor(serialization): stop using pointers for xml nodes, they already contain one internally
This commit is contained in:
parent
595f3ebbe9
commit
22fcd1e55e
15 changed files with 94 additions and 94 deletions
|
@ -6,7 +6,7 @@ Data::CLASS_NAME::~CLASS_NAME() = default; \
|
||||||
Data::CLASS_NAME::operator const WRAPPED_TYPE() const { return value; } \
|
Data::CLASS_NAME::operator const WRAPPED_TYPE() const { return value; } \
|
||||||
const Data::TypeInfo Data::CLASS_NAME::TYPE = { .name = TYPE_NAME, .deserializer = &Data::CLASS_NAME::Deserialize, .fromString = &Data::CLASS_NAME::FromString }; \
|
const Data::TypeInfo Data::CLASS_NAME::TYPE = { .name = TYPE_NAME, .deserializer = &Data::CLASS_NAME::Deserialize, .fromString = &Data::CLASS_NAME::FromString }; \
|
||||||
const Data::TypeInfo& Data::CLASS_NAME::GetType() const { return Data::CLASS_NAME::TYPE; }; \
|
const Data::TypeInfo& Data::CLASS_NAME::GetType() const { return Data::CLASS_NAME::TYPE; }; \
|
||||||
void Data::CLASS_NAME::Serialize(pugi::xml_node* node) const { node->text().set(std::string(this->ToString())); }
|
void Data::CLASS_NAME::Serialize(pugi::xml_node node) const { node.text().set(std::string(this->ToString())); }
|
||||||
|
|
||||||
Data::Base::~Base() {};
|
Data::Base::~Base() {};
|
||||||
|
|
||||||
|
@ -22,11 +22,11 @@ const Data::String Data::Null::ToString() const {
|
||||||
return Data::String("null");
|
return Data::String("null");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Data::Null::Serialize(pugi::xml_node* node) const {
|
void Data::Null::Serialize(pugi::xml_node node) const {
|
||||||
node->text().set("null");
|
node.text().set("null");
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Null::Deserialize(pugi::xml_node* node) {
|
Data::Variant Data::Null::Deserialize(pugi::xml_node node) {
|
||||||
return Data::Null();
|
return Data::Null();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,8 +41,8 @@ const Data::String Data::Bool::ToString() const {
|
||||||
return Data::String(value ? "true" : "false");
|
return Data::String(value ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Bool::Deserialize(pugi::xml_node* node) {
|
Data::Variant Data::Bool::Deserialize(pugi::xml_node node) {
|
||||||
return Data::Bool(node->text().as_bool());
|
return Data::Bool(node.text().as_bool());
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Bool::FromString(std::string string) {
|
Data::Variant Data::Bool::FromString(std::string string) {
|
||||||
|
@ -54,8 +54,8 @@ const Data::String Data::Int::ToString() const {
|
||||||
return Data::String(std::to_string(value));
|
return Data::String(std::to_string(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Int::Deserialize(pugi::xml_node* node) {
|
Data::Variant Data::Int::Deserialize(pugi::xml_node node) {
|
||||||
return Data::Int(node->text().as_int());
|
return Data::Int(node.text().as_int());
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Int::FromString(std::string string) {
|
Data::Variant Data::Int::FromString(std::string string) {
|
||||||
|
@ -67,8 +67,8 @@ const Data::String Data::Float::ToString() const {
|
||||||
return Data::String(std::to_string(value));
|
return Data::String(std::to_string(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Float::Deserialize(pugi::xml_node* node) {
|
Data::Variant Data::Float::Deserialize(pugi::xml_node node) {
|
||||||
return Data::Float(node->text().as_float());
|
return Data::Float(node.text().as_float());
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Float::FromString(std::string string) {
|
Data::Variant Data::Float::FromString(std::string string) {
|
||||||
|
@ -80,8 +80,8 @@ const Data::String Data::String::ToString() const {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::String::Deserialize(pugi::xml_node* node) {
|
Data::Variant Data::String::Deserialize(pugi::xml_node node) {
|
||||||
return Data::String(node->text().as_string());
|
return Data::String(node.text().as_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::String::FromString(std::string string) {
|
Data::Variant Data::String::FromString(std::string string) {
|
||||||
|
|
|
@ -14,14 +14,14 @@ public: \
|
||||||
static const TypeInfo TYPE; \
|
static const TypeInfo TYPE; \
|
||||||
\
|
\
|
||||||
virtual const Data::String ToString() const override; \
|
virtual const Data::String ToString() const override; \
|
||||||
virtual void Serialize(pugi::xml_node* node) const override; \
|
virtual void Serialize(pugi::xml_node node) const override; \
|
||||||
static Data::Variant Deserialize(pugi::xml_node* node); \
|
static Data::Variant Deserialize(pugi::xml_node node); \
|
||||||
static Data::Variant FromString(std::string); \
|
static Data::Variant FromString(std::string); \
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Data {
|
namespace Data {
|
||||||
class Variant;
|
class Variant;
|
||||||
typedef std::function<Data::Variant(pugi::xml_node*)> Deserializer;
|
typedef std::function<Data::Variant(pugi::xml_node)> Deserializer;
|
||||||
typedef std::function<Data::Variant(std::string)> FromString;
|
typedef std::function<Data::Variant(std::string)> FromString;
|
||||||
|
|
||||||
struct TypeInfo {
|
struct TypeInfo {
|
||||||
|
@ -36,7 +36,7 @@ namespace Data {
|
||||||
virtual ~Base();
|
virtual ~Base();
|
||||||
virtual const TypeInfo& GetType() const = 0;
|
virtual const TypeInfo& GetType() const = 0;
|
||||||
virtual const Data::String ToString() const = 0;
|
virtual const Data::String ToString() const = 0;
|
||||||
virtual void Serialize(pugi::xml_node* node) const = 0;
|
virtual void Serialize(pugi::xml_node node) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Null : Base {
|
class Null : Base {
|
||||||
|
@ -47,8 +47,8 @@ namespace Data {
|
||||||
static const TypeInfo TYPE;
|
static const TypeInfo TYPE;
|
||||||
|
|
||||||
virtual const Data::String ToString() const override;
|
virtual const Data::String ToString() const override;
|
||||||
virtual void Serialize(pugi::xml_node* node) const override;
|
virtual void Serialize(pugi::xml_node node) const override;
|
||||||
static Data::Variant Deserialize(pugi::xml_node* node);
|
static Data::Variant Deserialize(pugi::xml_node node);
|
||||||
};
|
};
|
||||||
|
|
||||||
DEF_WRAPPER_CLASS(Bool, bool)
|
DEF_WRAPPER_CLASS(Bool, bool)
|
||||||
|
|
|
@ -112,35 +112,35 @@ Data::CFrame Data::CFrame::operator -(Data::Vector3 vector) const {
|
||||||
|
|
||||||
// Serialization
|
// Serialization
|
||||||
|
|
||||||
void Data::CFrame::Serialize(pugi::xml_node* node) const {
|
void Data::CFrame::Serialize(pugi::xml_node node) const {
|
||||||
node->append_child("X").text().set(std::to_string(this->X()));
|
node.append_child("X").text().set(std::to_string(this->X()));
|
||||||
node->append_child("Y").text().set(std::to_string(this->Y()));
|
node.append_child("Y").text().set(std::to_string(this->Y()));
|
||||||
node->append_child("Z").text().set(std::to_string(this->Z()));
|
node.append_child("Z").text().set(std::to_string(this->Z()));
|
||||||
node->append_child("R00").text().set(std::to_string(this->rotation[0][0]));
|
node.append_child("R00").text().set(std::to_string(this->rotation[0][0]));
|
||||||
node->append_child("R01").text().set(std::to_string(this->rotation[1][0]));
|
node.append_child("R01").text().set(std::to_string(this->rotation[1][0]));
|
||||||
node->append_child("R02").text().set(std::to_string(this->rotation[2][0]));
|
node.append_child("R02").text().set(std::to_string(this->rotation[2][0]));
|
||||||
node->append_child("R10").text().set(std::to_string(this->rotation[0][1]));
|
node.append_child("R10").text().set(std::to_string(this->rotation[0][1]));
|
||||||
node->append_child("R11").text().set(std::to_string(this->rotation[1][1]));
|
node.append_child("R11").text().set(std::to_string(this->rotation[1][1]));
|
||||||
node->append_child("R12").text().set(std::to_string(this->rotation[2][1]));
|
node.append_child("R12").text().set(std::to_string(this->rotation[2][1]));
|
||||||
node->append_child("R20").text().set(std::to_string(this->rotation[0][2]));
|
node.append_child("R20").text().set(std::to_string(this->rotation[0][2]));
|
||||||
node->append_child("R21").text().set(std::to_string(this->rotation[1][2]));
|
node.append_child("R21").text().set(std::to_string(this->rotation[1][2]));
|
||||||
node->append_child("R22").text().set(std::to_string(this->rotation[2][2]));
|
node.append_child("R22").text().set(std::to_string(this->rotation[2][2]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Data::Variant Data::CFrame::Deserialize(pugi::xml_node* node) {
|
Data::Variant Data::CFrame::Deserialize(pugi::xml_node node) {
|
||||||
return Data::CFrame(
|
return Data::CFrame(
|
||||||
node->child("X").text().as_float(),
|
node.child("X").text().as_float(),
|
||||||
node->child("Y").text().as_float(),
|
node.child("Y").text().as_float(),
|
||||||
node->child("Z").text().as_float(),
|
node.child("Z").text().as_float(),
|
||||||
node->child("R00").text().as_float(),
|
node.child("R00").text().as_float(),
|
||||||
node->child("R01").text().as_float(),
|
node.child("R01").text().as_float(),
|
||||||
node->child("R02").text().as_float(),
|
node.child("R02").text().as_float(),
|
||||||
node->child("R10").text().as_float(),
|
node.child("R10").text().as_float(),
|
||||||
node->child("R11").text().as_float(),
|
node.child("R11").text().as_float(),
|
||||||
node->child("R12").text().as_float(),
|
node.child("R12").text().as_float(),
|
||||||
node->child("R20").text().as_float(),
|
node.child("R20").text().as_float(),
|
||||||
node->child("R21").text().as_float(),
|
node.child("R21").text().as_float(),
|
||||||
node->child("R22").text().as_float()
|
node.child("R22").text().as_float()
|
||||||
);
|
);
|
||||||
}
|
}
|
|
@ -37,8 +37,8 @@ namespace Data {
|
||||||
static const TypeInfo TYPE;
|
static const TypeInfo TYPE;
|
||||||
|
|
||||||
virtual const Data::String ToString() const override;
|
virtual const Data::String ToString() const override;
|
||||||
virtual void Serialize(pugi::xml_node* parent) const override;
|
virtual void Serialize(pugi::xml_node parent) const override;
|
||||||
static Data::Variant Deserialize(pugi::xml_node* node);
|
static Data::Variant Deserialize(pugi::xml_node node);
|
||||||
|
|
||||||
operator glm::mat4() const;
|
operator glm::mat4() const;
|
||||||
operator rp::Transform() const;
|
operator rp::Transform() const;
|
||||||
|
|
|
@ -43,10 +43,10 @@ Data::Color3 Data::Color3::FromHex(std::string hex) {
|
||||||
|
|
||||||
// Serialization
|
// Serialization
|
||||||
|
|
||||||
void Data::Color3::Serialize(pugi::xml_node* node) const {
|
void Data::Color3::Serialize(pugi::xml_node node) const {
|
||||||
node->text().set(this->ToHex());
|
node.text().set(this->ToHex());
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Color3::Deserialize(pugi::xml_node* node) {
|
Data::Variant Data::Color3::Deserialize(pugi::xml_node node) {
|
||||||
return Color3::FromHex(node->text().get());
|
return Color3::FromHex(node.text().get());
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,8 +25,8 @@ namespace Data {
|
||||||
|
|
||||||
virtual const Data::String ToString() const override;
|
virtual const Data::String ToString() const override;
|
||||||
std::string ToHex() const;
|
std::string ToHex() const;
|
||||||
virtual void Serialize(pugi::xml_node* node) const override;
|
virtual void Serialize(pugi::xml_node node) const override;
|
||||||
static Data::Variant Deserialize(pugi::xml_node* node);
|
static Data::Variant Deserialize(pugi::xml_node node);
|
||||||
|
|
||||||
operator glm::vec3() const;
|
operator glm::vec3() const;
|
||||||
|
|
||||||
|
|
|
@ -11,19 +11,19 @@ Data::String Data::Variant::ToString() const {
|
||||||
}, this->wrapped);
|
}, this->wrapped);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Data::Variant::Serialize(pugi::xml_node* node) const {
|
void Data::Variant::Serialize(pugi::xml_node node) const {
|
||||||
std::visit([&](auto&& it) {
|
std::visit([&](auto&& it) {
|
||||||
it.Serialize(node);
|
it.Serialize(node);
|
||||||
}, this->wrapped);
|
}, this->wrapped);
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Variant::Deserialize(pugi::xml_node* node) {
|
Data::Variant Data::Variant::Deserialize(pugi::xml_node node) {
|
||||||
if (Data::TYPE_MAP.count(node->name()) == 0) {
|
if (Data::TYPE_MAP.count(node.name()) == 0) {
|
||||||
Logger::fatalErrorf("Unknown type for instance: '%s'", node->name());
|
Logger::fatalErrorf("Unknown type for instance: '%s'", node.name());
|
||||||
panic();
|
panic();
|
||||||
}
|
}
|
||||||
|
|
||||||
const Data::TypeInfo* type = Data::TYPE_MAP[node->name()];
|
const Data::TypeInfo* type = Data::TYPE_MAP[node.name()];
|
||||||
return type->deserializer(node);
|
return type->deserializer(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,8 +34,8 @@ namespace Data {
|
||||||
template <typename T> T get() { return std::get<T>(wrapped); }
|
template <typename T> T get() { return std::get<T>(wrapped); }
|
||||||
Data::String ToString() const;
|
Data::String ToString() const;
|
||||||
|
|
||||||
void Serialize(pugi::xml_node* node) const;
|
void Serialize(pugi::xml_node node) const;
|
||||||
static Data::Variant Deserialize(pugi::xml_node* node);
|
static Data::Variant Deserialize(pugi::xml_node node);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Map of all data types to their type names
|
// Map of all data types to their type names
|
||||||
|
|
|
@ -65,12 +65,12 @@ float Data::Vector3::Dot(Data::Vector3 other) const {
|
||||||
|
|
||||||
// Serialization
|
// Serialization
|
||||||
|
|
||||||
void Data::Vector3::Serialize(pugi::xml_node* node) const {
|
void Data::Vector3::Serialize(pugi::xml_node node) const {
|
||||||
node->append_child("X").text().set(std::to_string(this->X()));
|
node.append_child("X").text().set(std::to_string(this->X()));
|
||||||
node->append_child("Y").text().set(std::to_string(this->Y()));
|
node.append_child("Y").text().set(std::to_string(this->Y()));
|
||||||
node->append_child("Z").text().set(std::to_string(this->Z()));
|
node.append_child("Z").text().set(std::to_string(this->Z()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Data::Variant Data::Vector3::Deserialize(pugi::xml_node* node) {
|
Data::Variant Data::Vector3::Deserialize(pugi::xml_node node) {
|
||||||
return Data::Vector3(node->child("X").text().as_float(), node->child("Y").text().as_float(), node->child("Z").text().as_float());
|
return Data::Vector3(node.child("X").text().as_float(), node.child("Y").text().as_float(), node.child("Z").text().as_float());
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,8 +24,8 @@ namespace Data {
|
||||||
static Data::Vector3 ONE;
|
static Data::Vector3 ONE;
|
||||||
|
|
||||||
virtual const Data::String ToString() const override;
|
virtual const Data::String ToString() const override;
|
||||||
virtual void Serialize(pugi::xml_node* node) const override;
|
virtual void Serialize(pugi::xml_node node) const override;
|
||||||
static Data::Variant Deserialize(pugi::xml_node* node);
|
static Data::Variant Deserialize(pugi::xml_node node);
|
||||||
|
|
||||||
operator glm::vec3() const;
|
operator glm::vec3() const;
|
||||||
operator rp::Vector3() const;
|
operator rp::Vector3() const;
|
||||||
|
|
|
@ -186,8 +186,8 @@ std::vector<std::string> Instance::GetProperties() {
|
||||||
|
|
||||||
// Serialization
|
// Serialization
|
||||||
|
|
||||||
void Instance::Serialize(pugi::xml_node* parent) {
|
void Instance::Serialize(pugi::xml_node parent) {
|
||||||
pugi::xml_node node = parent->append_child("Item");
|
pugi::xml_node node = parent.append_child("Item");
|
||||||
node.append_attribute("class").set_value(this->GetClass()->className);
|
node.append_attribute("class").set_value(this->GetClass()->className);
|
||||||
|
|
||||||
// Add properties
|
// Add properties
|
||||||
|
@ -198,17 +198,17 @@ void Instance::Serialize(pugi::xml_node* parent) {
|
||||||
|
|
||||||
pugi::xml_node propertyNode = propertiesNode.append_child(meta.type->name);
|
pugi::xml_node propertyNode = propertiesNode.append_child(meta.type->name);
|
||||||
propertyNode.append_attribute("name").set_value(name);
|
propertyNode.append_attribute("name").set_value(name);
|
||||||
GetPropertyValue(name)->Serialize(&propertyNode);
|
GetPropertyValue(name)->Serialize(propertyNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add children
|
// Add children
|
||||||
for (InstanceRef child : this->children) {
|
for (InstanceRef child : this->children) {
|
||||||
child->Serialize(&node);
|
child->Serialize(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
InstanceRef Instance::Deserialize(pugi::xml_node* node) {
|
InstanceRef Instance::Deserialize(pugi::xml_node node) {
|
||||||
std::string className = node->attribute("class").value();
|
std::string className = node.attribute("class").value();
|
||||||
if (INSTANCE_MAP.count(className) == 0) {
|
if (INSTANCE_MAP.count(className) == 0) {
|
||||||
Logger::fatalErrorf("Unknown type for instance: '%s'", className.c_str());
|
Logger::fatalErrorf("Unknown type for instance: '%s'", className.c_str());
|
||||||
panic();
|
panic();
|
||||||
|
@ -221,7 +221,7 @@ InstanceRef Instance::Deserialize(pugi::xml_node* node) {
|
||||||
// const InstanceType* type = INSTANCE_MAP.at(className);
|
// const InstanceType* type = INSTANCE_MAP.at(className);
|
||||||
|
|
||||||
// Read properties
|
// Read properties
|
||||||
pugi::xml_node propertiesNode = node->child("Properties");
|
pugi::xml_node propertiesNode = node.child("Properties");
|
||||||
for (pugi::xml_node propertyNode : propertiesNode) {
|
for (pugi::xml_node propertyNode : propertiesNode) {
|
||||||
std::string propertyName = propertyNode.attribute("name").value();
|
std::string propertyName = propertyNode.attribute("name").value();
|
||||||
auto meta_ = object->GetPropertyMeta(propertyName);
|
auto meta_ = object->GetPropertyMeta(propertyName);
|
||||||
|
@ -229,13 +229,13 @@ InstanceRef Instance::Deserialize(pugi::xml_node* node) {
|
||||||
Logger::fatalErrorf("Attempt to set unknown property '%s' of %s", propertyName.c_str(), object->GetClass()->className.c_str());
|
Logger::fatalErrorf("Attempt to set unknown property '%s' of %s", propertyName.c_str(), object->GetClass()->className.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Data::Variant value = Data::Variant::Deserialize(&propertyNode);
|
Data::Variant value = Data::Variant::Deserialize(propertyNode);
|
||||||
object->SetPropertyValue(propertyName, value);
|
object->SetPropertyValue(propertyName, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read children
|
// Read children
|
||||||
for (pugi::xml_node childNode : node->children("Item")) {
|
for (pugi::xml_node childNode : node.children("Item")) {
|
||||||
InstanceRef child = Instance::Deserialize(&childNode);
|
InstanceRef child = Instance::Deserialize(childNode);
|
||||||
object->AddChild(child);
|
object->AddChild(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,8 +94,8 @@ public:
|
||||||
std::vector<std::string> GetProperties();
|
std::vector<std::string> GetProperties();
|
||||||
|
|
||||||
// Serialization
|
// Serialization
|
||||||
void Serialize(pugi::xml_node* parent);
|
void Serialize(pugi::xml_node parent);
|
||||||
static std::shared_ptr<Instance> Deserialize(pugi::xml_node* node);
|
static std::shared_ptr<Instance> Deserialize(pugi::xml_node node);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef std::shared_ptr<Instance> InstanceRef;
|
typedef std::shared_ptr<Instance> InstanceRef;
|
||||||
|
|
|
@ -53,7 +53,7 @@ void DataModel::SaveToFile(std::optional<std::string> path) {
|
||||||
pugi::xml_node root = doc.append_child("openblocks");
|
pugi::xml_node root = doc.append_child("openblocks");
|
||||||
|
|
||||||
for (InstanceRef child : this->GetChildren()) {
|
for (InstanceRef child : this->GetChildren()) {
|
||||||
child->Serialize(&root);
|
child->Serialize(root);
|
||||||
}
|
}
|
||||||
|
|
||||||
doc.save(outStream);
|
doc.save(outStream);
|
||||||
|
@ -62,8 +62,8 @@ void DataModel::SaveToFile(std::optional<std::string> path) {
|
||||||
Logger::info("Place saved successfully");
|
Logger::info("Place saved successfully");
|
||||||
}
|
}
|
||||||
|
|
||||||
void DataModel::DeserializeService(pugi::xml_node* node) {
|
void DataModel::DeserializeService(pugi::xml_node node) {
|
||||||
std::string className = node->attribute("class").value();
|
std::string className = node.attribute("class").value();
|
||||||
if (INSTANCE_MAP.count(className) == 0) {
|
if (INSTANCE_MAP.count(className) == 0) {
|
||||||
Logger::fatalErrorf("Unknown service: '%s'", className.c_str());
|
Logger::fatalErrorf("Unknown service: '%s'", className.c_str());
|
||||||
panic();
|
panic();
|
||||||
|
@ -79,7 +79,7 @@ void DataModel::DeserializeService(pugi::xml_node* node) {
|
||||||
AddChild(object);
|
AddChild(object);
|
||||||
|
|
||||||
// Read properties
|
// Read properties
|
||||||
pugi::xml_node propertiesNode = node->child("Properties");
|
pugi::xml_node propertiesNode = node.child("Properties");
|
||||||
for (pugi::xml_node propertyNode : propertiesNode) {
|
for (pugi::xml_node propertyNode : propertiesNode) {
|
||||||
std::string propertyName = propertyNode.attribute("name").value();
|
std::string propertyName = propertyNode.attribute("name").value();
|
||||||
auto meta_ = object->GetPropertyMeta(propertyName);
|
auto meta_ = object->GetPropertyMeta(propertyName);
|
||||||
|
@ -87,13 +87,13 @@ void DataModel::DeserializeService(pugi::xml_node* node) {
|
||||||
Logger::fatalErrorf("Attempt to set unknown property '%s' of %s", propertyName.c_str(), object->GetClass()->className.c_str());
|
Logger::fatalErrorf("Attempt to set unknown property '%s' of %s", propertyName.c_str(), object->GetClass()->className.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Data::Variant value = Data::Variant::Deserialize(&propertyNode);
|
Data::Variant value = Data::Variant::Deserialize(propertyNode);
|
||||||
object->SetPropertyValue(propertyName, value);
|
object->SetPropertyValue(propertyName, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add children
|
// Add children
|
||||||
for (pugi::xml_node childNode : node->children("Item")) {
|
for (pugi::xml_node childNode : node.children("Item")) {
|
||||||
InstanceRef child = Instance::Deserialize(&childNode);
|
InstanceRef child = Instance::Deserialize(childNode);
|
||||||
object->AddChild(child);
|
object->AddChild(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ std::shared_ptr<DataModel> DataModel::LoadFromFile(std::string path) {
|
||||||
std::shared_ptr<DataModel> newModel = std::make_shared<DataModel>();
|
std::shared_ptr<DataModel> newModel = std::make_shared<DataModel>();
|
||||||
|
|
||||||
for (pugi::xml_node childNode : rootNode.children("Item")) {
|
for (pugi::xml_node childNode : rootNode.children("Item")) {
|
||||||
newModel->DeserializeService(&childNode);
|
newModel->DeserializeService(childNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
newModel->Init();
|
newModel->Init();
|
||||||
|
|
|
@ -15,7 +15,7 @@ class Service;
|
||||||
// The root instance to all objects in the hierarchy
|
// The root instance to all objects in the hierarchy
|
||||||
class DataModel : public Instance {
|
class DataModel : public Instance {
|
||||||
private:
|
private:
|
||||||
void DeserializeService(pugi::xml_node* node);
|
void DeserializeService(pugi::xml_node node);
|
||||||
public:
|
public:
|
||||||
const static InstanceType TYPE;
|
const static InstanceType TYPE;
|
||||||
|
|
||||||
|
|
|
@ -248,7 +248,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
pugi::xml_document rootDoc;
|
pugi::xml_document rootDoc;
|
||||||
for (InstanceRefWeak inst : getSelection()) {
|
for (InstanceRefWeak inst : getSelection()) {
|
||||||
if (inst.expired()) continue;
|
if (inst.expired()) continue;
|
||||||
inst.lock()->Serialize(&rootDoc);
|
inst.lock()->Serialize(rootDoc);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ostringstream encoded;
|
std::ostringstream encoded;
|
||||||
|
@ -262,7 +262,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
pugi::xml_document rootDoc;
|
pugi::xml_document rootDoc;
|
||||||
for (InstanceRefWeak inst : getSelection()) {
|
for (InstanceRefWeak inst : getSelection()) {
|
||||||
if (inst.expired()) continue;
|
if (inst.expired()) continue;
|
||||||
inst.lock()->Serialize(&rootDoc);
|
inst.lock()->Serialize(rootDoc);
|
||||||
inst.lock()->SetParent(std::nullopt);
|
inst.lock()->SetParent(std::nullopt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +284,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
rootDoc.load_string(encoded.c_str());
|
rootDoc.load_string(encoded.c_str());
|
||||||
|
|
||||||
for (pugi::xml_node instNode : rootDoc.children()) {
|
for (pugi::xml_node instNode : rootDoc.children()) {
|
||||||
InstanceRef inst = Instance::Deserialize(&instNode);
|
InstanceRef inst = Instance::Deserialize(instNode);
|
||||||
gWorkspace()->AddChild(inst);
|
gWorkspace()->AddChild(inst);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -303,7 +303,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
rootDoc.load_string(encoded.c_str());
|
rootDoc.load_string(encoded.c_str());
|
||||||
|
|
||||||
for (pugi::xml_node instNode : rootDoc.children()) {
|
for (pugi::xml_node instNode : rootDoc.children()) {
|
||||||
InstanceRef inst = Instance::Deserialize(&instNode);
|
InstanceRef inst = Instance::Deserialize(instNode);
|
||||||
selectedParent->AddChild(inst);
|
selectedParent->AddChild(inst);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -319,7 +319,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
|
|
||||||
for (InstanceRefWeak inst : getSelection()) {
|
for (InstanceRefWeak inst : getSelection()) {
|
||||||
if (inst.expired()) continue;
|
if (inst.expired()) continue;
|
||||||
inst.lock()->Serialize(&modelRoot);
|
inst.lock()->Serialize(modelRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
modelDoc.save(outStream);
|
modelDoc.save(outStream);
|
||||||
|
@ -337,7 +337,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
modelDoc.load(inStream);
|
modelDoc.load(inStream);
|
||||||
|
|
||||||
for (pugi::xml_node instNode : modelDoc.child("openblocks").children("Item")) {
|
for (pugi::xml_node instNode : modelDoc.child("openblocks").children("Item")) {
|
||||||
InstanceRef inst = Instance::Deserialize(&instNode);
|
InstanceRef inst = Instance::Deserialize(instNode);
|
||||||
selectedParent->AddChild(inst);
|
selectedParent->AddChild(inst);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue