From 28ed11fb531d0993acbf57b2a05367ac2ae688c9 Mon Sep 17 00:00:00 2001 From: maelstrom Date: Wed, 5 Mar 2025 23:31:16 +0100 Subject: [PATCH] feat(datatype): float parser --- core/src/datatypes/base.cpp | 21 ++++++++++++++++++++- core/src/datatypes/base.h | 3 +++ core/src/objects/part.cpp | 16 ++++++++++------ core/src/objects/part.h | 1 + editor/panes/propertiesmodel.cpp | 4 ++-- 5 files changed, 36 insertions(+), 9 deletions(-) diff --git a/core/src/datatypes/base.cpp b/core/src/datatypes/base.cpp index 97c036a..c7d0b93 100644 --- a/core/src/datatypes/base.cpp +++ b/core/src/datatypes/base.cpp @@ -4,7 +4,7 @@ #define IMPL_WRAPPER_CLASS(CLASS_NAME, WRAPPED_TYPE, TYPE_NAME) Data::CLASS_NAME::CLASS_NAME(WRAPPED_TYPE in) : value(in) {} \ Data::CLASS_NAME::~CLASS_NAME() = default; \ 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 }; \ +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; }; \ void Data::CLASS_NAME::Serialize(pugi::xml_node* node) const { node->text().set(std::string(this->ToString())); } @@ -45,6 +45,11 @@ Data::Variant Data::Bool::Deserialize(pugi::xml_node* node) { return Data::Bool(node->text().as_bool()); } +Data::Variant Data::Bool::FromString(std::string string) { + return Data::Bool(string[0] == 't' || string[0] == 'T' || string[0] == '1' || string[0] == 'y' || string[0] == 'Y'); +} + + const Data::String Data::Int::ToString() const { return Data::String(std::to_string(value)); } @@ -53,6 +58,11 @@ Data::Variant Data::Int::Deserialize(pugi::xml_node* node) { return Data::Int(node->text().as_int()); } +Data::Variant Data::Int::FromString(std::string string) { + return Data::Int(std::stoi(string)); +} + + const Data::String Data::Float::ToString() const { return Data::String(std::to_string(value)); } @@ -61,10 +71,19 @@ Data::Variant Data::Float::Deserialize(pugi::xml_node* node) { return Data::Float(node->text().as_float()); } +Data::Variant Data::Float::FromString(std::string string) { + return Data::Float(std::stof(string)); +} + + const Data::String Data::String::ToString() const { return *this; } Data::Variant Data::String::Deserialize(pugi::xml_node* node) { return Data::String(node->text().as_string()); +} + +Data::Variant Data::String::FromString(std::string string) { + return Data::String(string); } \ No newline at end of file diff --git a/core/src/datatypes/base.h b/core/src/datatypes/base.h index 1d44657..e7f9658 100644 --- a/core/src/datatypes/base.h +++ b/core/src/datatypes/base.h @@ -16,15 +16,18 @@ public: \ virtual const Data::String ToString() const override; \ virtual void Serialize(pugi::xml_node* node) const override; \ static Data::Variant Deserialize(pugi::xml_node* node); \ + static Data::Variant FromString(std::string); \ }; namespace Data { class Variant; typedef std::function Deserializer; + typedef std::function FromString; struct TypeInfo { std::string name; Deserializer deserializer; + FromString fromString; TypeInfo(const TypeInfo&) = delete; }; diff --git a/core/src/objects/part.cpp b/core/src/objects/part.cpp index 30b13a5..043f86a 100644 --- a/core/src/objects/part.cpp +++ b/core/src/objects/part.cpp @@ -69,33 +69,37 @@ Part::Part(PartConstructParams params): Instance(&TYPE), cframe(Data::CFrame(par .type = &Data::Bool::TYPE, .codec = fieldCodecOf(), .updateCallback = memberFunctionOf(&Part::onUpdated, this) - } }, { "Position", { + }}, { "Position", { .backingField = &cframe, .type = &Data::Vector3::TYPE, .codec = cframePositionCodec(), .updateCallback = memberFunctionOf(&Part::onUpdated, this), .flags = PropertyFlags::PROP_NOSAVE - } }, { "Rotation", { + }}, { "Rotation", { .backingField = &cframe, .type = &Data::Vector3::TYPE, .codec = cframeRotationCodec(), .updateCallback = memberFunctionOf(&Part::onUpdated, this), .flags = PropertyFlags::PROP_NOSAVE - } }, { "CFrame", { + }}, { "CFrame", { .backingField = &cframe, .type = &Data::CFrame::TYPE, .codec = fieldCodecOf(), .updateCallback = memberFunctionOf(&Part::onUpdated, this), - } }, { "Size", { + }}, { "Size", { .backingField = &size, .type = &Data::Vector3::TYPE, .codec = fieldCodecOf(), .updateCallback = memberFunctionOf(&Part::onUpdated, this) - } }, { "Color", { + }}, { "Color", { .backingField = &color, .type = &Data::Color3::TYPE, .codec = fieldCodecOf(), - } } + }}, { "Transparency", { + .backingField = &transparency, + .type = &Data::Float::TYPE, + .codec = fieldCodecOf(), + }} } }); } diff --git a/core/src/objects/part.h b/core/src/objects/part.h index a0ef113..e3c6944 100644 --- a/core/src/objects/part.h +++ b/core/src/objects/part.h @@ -32,6 +32,7 @@ public: Data::CFrame cframe; glm::vec3 size; Data::Color3 color; + float transparency = 0.f; bool selected = false; bool anchored = false; diff --git a/editor/panes/propertiesmodel.cpp b/editor/panes/propertiesmodel.cpp index 74db11f..73947cf 100644 --- a/editor/panes/propertiesmodel.cpp +++ b/editor/panes/propertiesmodel.cpp @@ -56,10 +56,10 @@ bool PropertiesModel::setData(const QModelIndex &index, const QVariant &value, i switch (role) { case Qt::EditRole: - if (meta.type != &Data::String::TYPE) + if (!meta.type->fromString) return false; - selectedItem->SetPropertyValue(propertyName, value.toString().toStdString()); + selectedItem->SetPropertyValue(propertyName, meta.type->fromString(value.toString().toStdString())); return true; case Qt::CheckStateRole: if (meta.type != &Data::Bool::TYPE)