feat(datatype): float parser

This commit is contained in:
maelstrom 2025-03-05 23:31:16 +01:00
parent 23ac7ee634
commit 28ed11fb53
5 changed files with 36 additions and 9 deletions

View file

@ -4,7 +4,7 @@
#define IMPL_WRAPPER_CLASS(CLASS_NAME, WRAPPED_TYPE, TYPE_NAME) Data::CLASS_NAME::CLASS_NAME(WRAPPED_TYPE in) : value(in) {} \ #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::~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 }; \ 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())); }
@ -45,6 +45,11 @@ 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) {
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 { const Data::String Data::Int::ToString() const {
return Data::String(std::to_string(value)); 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()); 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 { const Data::String Data::Float::ToString() const {
return Data::String(std::to_string(value)); return Data::String(std::to_string(value));
} }
@ -61,6 +71,11 @@ 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) {
return Data::Float(std::stof(string));
}
const Data::String Data::String::ToString() const { const Data::String Data::String::ToString() const {
return *this; return *this;
} }
@ -68,3 +83,7 @@ const Data::String Data::String::ToString() const {
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) {
return Data::String(string);
}

View file

@ -16,15 +16,18 @@ public: \
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); \
}; };
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;
struct TypeInfo { struct TypeInfo {
std::string name; std::string name;
Deserializer deserializer; Deserializer deserializer;
FromString fromString;
TypeInfo(const TypeInfo&) = delete; TypeInfo(const TypeInfo&) = delete;
}; };

View file

@ -95,6 +95,10 @@ Part::Part(PartConstructParams params): Instance(&TYPE), cframe(Data::CFrame(par
.backingField = &color, .backingField = &color,
.type = &Data::Color3::TYPE, .type = &Data::Color3::TYPE,
.codec = fieldCodecOf<Data::Color3>(), .codec = fieldCodecOf<Data::Color3>(),
}}, { "Transparency", {
.backingField = &transparency,
.type = &Data::Float::TYPE,
.codec = fieldCodecOf<Data::Float, float>(),
}} }}
} }
}); });

View file

@ -32,6 +32,7 @@ public:
Data::CFrame cframe; Data::CFrame cframe;
glm::vec3 size; glm::vec3 size;
Data::Color3 color; Data::Color3 color;
float transparency = 0.f;
bool selected = false; bool selected = false;
bool anchored = false; bool anchored = false;

View file

@ -56,10 +56,10 @@ bool PropertiesModel::setData(const QModelIndex &index, const QVariant &value, i
switch (role) { switch (role) {
case Qt::EditRole: case Qt::EditRole:
if (meta.type != &Data::String::TYPE) if (!meta.type->fromString)
return false; return false;
selectedItem->SetPropertyValue(propertyName, value.toString().toStdString()); selectedItem->SetPropertyValue(propertyName, meta.type->fromString(value.toString().toStdString()));
return true; return true;
case Qt::CheckStateRole: case Qt::CheckStateRole:
if (meta.type != &Data::Bool::TYPE) if (meta.type != &Data::Bool::TYPE)