diff options
Diffstat (limited to 'src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp')
-rw-r--r-- | src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 4abf7d2802..0efa621e68 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -88,11 +88,17 @@ static TypeName resolveTypeName(const ASTPropertyReference *ref, const ContextPt if (ref->ast()->propertyToken.isValid()) { type = ref->ast()->memberType->name.toUtf8(); - if (type == "alias") { - const Value *value = context->lookupReference(ref); + const Value *value = context->lookupReference(ref); + + if (!value) + return type; - if (!value) - return type; + if (const CppComponentValue * componentObjectValue = value->asCppComponentValue()) { + type = componentObjectValue->className().toUtf8(); + dotProperties = getObjectTypes(componentObjectValue, context); + } + + if (type == "alias") { if (const ASTObjectValue * astObjectValue = value->asAstObjectValue()) { if (astObjectValue->typeName()) { @@ -336,14 +342,14 @@ private: static inline bool isValueType(const TypeName &type) { static const PropertyTypeList objectValuesList({"QFont", "QPoint", "QPointF", - "QSize", "QSizeF", "QVector3D", "QVector2D", "font"}); + "QSize", "QSizeF", "QVector3D", "QVector2D", "vector2d", "vector3d", "font"}); return objectValuesList.contains(type); } static inline bool isValueType(const QString &type) { static const QStringList objectValuesList({"QFont", "QPoint", "QPointF", - "QSize", "QSizeF", "QVector3D", "QVector2D", "font"}); + "QSize", "QSizeF", "QVector3D", "QVector2D", "vector2d", "vector3d", "font"}); return objectValuesList.contains(type); } @@ -494,8 +500,31 @@ QVector<PropertyInfo> getObjectTypes(const ObjectValue *objectValue, const Conte PropertyMemberProcessor processor(context); objectValue->processMembers(&processor); + const auto props = processor.properties(); + + for (const PropertyInfo &property : props) { + const PropertyName name = property.first; + const QString nameAsString = QString::fromUtf8(name); + + if (isValueType(property.second)) { + const Value *dotValue = objectValue->lookupMember(nameAsString, context); + if (!dotValue) + continue; - propertyList.append(processor.properties()); + if (const Reference *ref = dotValue->asReference()) + dotValue = context->lookupReference(ref); + + if (const ObjectValue *dotObjectValue = dotValue->asObjectValue()) { + const QVector<PropertyInfo> dotProperties = getObjectTypes(dotObjectValue, context, false, rec + 1); + for (const PropertyInfo &propertyInfo : dotProperties) { + const PropertyName dotName = name + '.' + propertyInfo.first; + const TypeName type = propertyInfo.second; + propertyList.append({dotName, type}); + } + } + } + propertyList.append(property); + } if (!local) { const ObjectValue* prototype = objectValue->prototype(context); @@ -1067,6 +1096,12 @@ QVariant::Type NodeMetaInfoPrivate::variantTypeId(const PropertyName &propertyNa if (typeName == "var") return QVariant::UserType; + if (typeName == "vector2d") + return QVariant::Vector2D; + + if (typeName == "vector3d") + return QVariant::Vector3D; + return QVariant::nameToType(typeName.data()); } |