diff --git a/editor/panes/propertiesmodel.cpp b/editor/panes/propertiesmodel.cpp index b26125c..c1c0a33 100644 --- a/editor/panes/propertiesmodel.cpp +++ b/editor/panes/propertiesmodel.cpp @@ -1,4 +1,5 @@ #include "propertiesmodel.h" +#include "datatypes/base.h" #include "qnamespace.h" PropertiesModel::PropertiesModel(InstanceRef selectedItem, QWidget *parent) @@ -21,8 +22,9 @@ QVariant PropertiesModel::data(const QModelIndex &index, int role) const { case Qt::DisplayRole: if (index.column() == 0) return QString::fromStdString(propertyName); - else if (index.column() == 1) + else if (index.column() == 1) { return QString::fromStdString(selectedItem->GetPropertyValue(propertyName).value().ToString()); + } // case Qt::DecorationRole: // return iconOf(item->GetClass()); } @@ -33,8 +35,12 @@ QVariant PropertiesModel::data(const QModelIndex &index, int role) const { bool PropertiesModel::setData(const QModelIndex &index, const QVariant &value, int role) { if (index.column() != 1 && role != Qt::EditRole) return false; - selectedItem->SetPropertyValue(propertiesList[index.row()], value.toString().toStdString()); - return true; + if (selectedItem->GetPropertyMeta(propertiesList[index.row()])->type == &Data::String::TYPE) { + selectedItem->SetPropertyValue(propertiesList[index.row()], value.toString().toStdString()); + return true; + } + + return false; } Qt::ItemFlags PropertiesModel::flags(const QModelIndex &index) const { diff --git a/src/datatypes/base.h b/src/datatypes/base.h index 84db758..47c701d 100644 --- a/src/datatypes/base.h +++ b/src/datatypes/base.h @@ -18,6 +18,7 @@ public: \ namespace Data { struct TypeInfo { std::string name; + TypeInfo(const TypeInfo&) = delete; }; class String; diff --git a/src/objects/base/instance.cpp b/src/objects/base/instance.cpp index 72c3f1a..3889262 100644 --- a/src/objects/base/instance.cpp +++ b/src/objects/base/instance.cpp @@ -30,7 +30,7 @@ Instance::Instance(InstanceType* type) { this->memberMap = std::make_unique( MemberMap { .super = std::nullopt, .members = { - { "Name", { .backingField = &name, .codec = fieldCodecOf() } } + { "Name", { .backingField = &name, .type = &Data::String::TYPE, .codec = fieldCodecOf() } } } }); } diff --git a/src/objects/base/member.h b/src/objects/base/member.h index 3859afe..87de137 100644 --- a/src/objects/base/member.h +++ b/src/objects/base/member.h @@ -34,7 +34,7 @@ constexpr FieldCodec fieldCodecOf() { struct PropertyMeta { void* backingField; - Data::TypeInfo type; + const Data::TypeInfo* type; FieldCodec codec; }; diff --git a/src/objects/part.cpp b/src/objects/part.cpp index b8c7570..1454c1f 100644 --- a/src/objects/part.cpp +++ b/src/objects/part.cpp @@ -23,11 +23,11 @@ Part::Part(): Part(PartConstructParams {}) { Part::Part(PartConstructParams params): Instance(&TYPE_), position(params.position), rotation(params.rotation), scale(params.scale), material(params.material), anchored(params.anchored) { - + this->memberMap = std::make_unique(MemberMap { .super = std::move(this->memberMap), .members = { - { "Anchored", { .backingField = &anchored, .codec = fieldCodecOf() } } + { "Anchored", { .backingField = &anchored, .type = &Data::Bool::TYPE, .codec = fieldCodecOf() } } } }); }