From f952c3ee4a2a7f1560a1718c29967bc181a5bba2 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 31 Oct 2016 14:34:32 +0100 Subject: [PATCH] QmlDesigner: Fallback to create types from source We fallback to create types from source, if other means failed. This can be required if the meta info is incomplete/incorrect when a C++ type is mocked. Change-Id: I50d45a6f9d7eba3483da10d9e1d7d6644d9aeb96 Reviewed-by: Tim Jenssen --- .../instances/objectnodeinstance.cpp | 28 ++++++++++++++++++- .../qml2puppet/instances/objectnodeinstance.h | 1 + 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp index c3d0437bf6a..6bd10a2e0b8 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp @@ -605,7 +605,33 @@ ObjectNodeInstance::Pointer ObjectNodeInstance::create(QObject *object) QObject *ObjectNodeInstance::createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context) { - return QmlPrivateGate::createPrimitive(typeName, majorNumber, minorNumber, context); + QObject *object = QmlPrivateGate::createPrimitive(typeName, majorNumber, minorNumber, context); + + /* Let's try to create the primitive from source, since with incomplete meta info this might be a pure + * QML type. This is the case for example if a C++ type is mocked up with a QML file. + */ + + if (!object) + object = createPrimitiveFromSource(typeName, majorNumber, minorNumber, context); + + return object; +} + +QObject *ObjectNodeInstance::createPrimitiveFromSource(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context) +{ + if (typeName.isEmpty()) + return 0; + + QStringList parts = typeName.split("/"); + const QString unqualifiedTypeName = parts.last(); + parts.removeLast(); + + if (parts.isEmpty()) + return 0; + + const QString importString = parts.join(".") + " " + QString::number(majorNumber) + "." + QString::number(minorNumber); + QString source = "import " + importString + "\n" + unqualifiedTypeName + " {\n" + "}\n"; + return createCustomParserObject(source, "", context); } QObject *ObjectNodeInstance::createComponentWrap(const QString &nodeSource, const QByteArray &importCode, QQmlContext *context) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h index cecc9c8ee3c..8266f0addf8 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.h @@ -67,6 +67,7 @@ public: static Pointer create(QObject *objectToBeWrapped); static QObject *createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context); + static QObject *createPrimitiveFromSource(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context); static QObject *createCustomParserObject(const QString &nodeSource, const QByteArray &importCode, QQmlContext *context); static QObject *createComponent(const QString &componentPath, QQmlContext *context); static QObject *createComponent(const QUrl &componentUrl, QQmlContext *context);