From 6e30faba7338d805a3c33cd73677c1d73480dec9 Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <thomas.hartmann@qt.io>
Date: Tue, 21 Feb 2017 15:00:26 +0100
Subject: [PATCH] QmlDesigner: Quick fix for Popup

This is a quickfix for Controls 2 Popup, Drawer, Menu and Dialog.
We pretend everything derived from QtQuick.Controls.Popup
is an item instead of a QQObject.

Change-Id: I603dce8a1a1b08df3e2c1dccc0fa57e7ccef0800
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
---
 .../qml2puppet/instances/objectnodeinstance.cpp      | 12 ++++++++++--
 .../designercore/metainfo/nodemetainfo.cpp           |  4 +++-
 .../qmldesigner/designercore/model/qmlitemnode.cpp   |  3 +++
 3 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp
index 6bd10a2e0b8..8cd156345da 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/objectnodeinstance.cpp
@@ -605,14 +605,22 @@ ObjectNodeInstance::Pointer ObjectNodeInstance::create(QObject *object)
 
 QObject *ObjectNodeInstance::createPrimitive(const QString &typeName, int majorNumber, int minorNumber, QQmlContext *context)
 {
-    QObject *object = QmlPrivateGate::createPrimitive(typeName, majorNumber, minorNumber, context);
+    QString polishTypeName = typeName;
+    if (typeName == "QtQuick.Controls/Popup"
+            || typeName == "QtQuick.Controls/Drawer"
+            || typeName == "QtQuick.Controls/Dialog"
+            || typeName == "QtQuick.Controls/Menu"
+            || typeName == "QtQuick.Controls/ToolTip")
+        polishTypeName = "QtQuick/Item";
+
+    QObject *object = QmlPrivateGate::createPrimitive(polishTypeName, 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);
+        object = createPrimitiveFromSource(polishTypeName, majorNumber, minorNumber, context);
 
     return object;
 }
diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
index 6c5650359dc..17b1cf08628 100644
--- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
+++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp
@@ -1560,7 +1560,9 @@ bool NodeMetaInfo::isSubclassOf(const TypeName &type, int majorVersion, int mino
 
 bool NodeMetaInfo::isGraphicalItem() const
 {
-    return isSubclassOf("QtQuick.Item") || isSubclassOf("QtQuick.Window.Window");
+    return isSubclassOf("QtQuick.Item")
+            || isSubclassOf("QtQuick.Window.Window")
+            || isSubclassOf("QtQuick.Controls.Popup");
 }
 
 void NodeMetaInfo::clearCache()
diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
index fa3f719ae29..4345a87c8eb 100644
--- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
+++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp
@@ -54,6 +54,9 @@ bool QmlItemNode::isItemOrWindow(const ModelNode &modelNode)
     if (modelNode.metaInfo().isSubclassOf("QtQuick.Window.Window") && modelNode.isRootNode())
         return true;
 
+    if (modelNode.metaInfo().isSubclassOf("QtQuick.Controls.Popup"))
+        return true;
+
     return false;
 }
 
-- 
GitLab