From 08e4b339f174fb97776c6efa195190ae767f8bcf Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Tue, 28 Jun 2011 13:24:18 +0200
Subject: [PATCH] QmlDesigner.instances: allow fallback to item

If we know from the (text editor) meta system that an object is an
(visible) item, we always create an item as fallback.

We might not be able to instaciate the original item.

Change-Id: I6851cd7a8de68d9d09b789927c204f0617017de7
Reviewed-on: http://codereview.qt.nokia.com/829
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Marco Bubke <marco.bubke@nokia.com>
---
 .../qml/qmlpuppet/container/instancecontainer.cpp | 11 +++++++++--
 .../qml/qmlpuppet/container/instancecontainer.h   |  9 ++++++++-
 .../qmlpuppet/instances/servernodeinstance.cpp    |  7 +++++++
 .../designercore/instances/nodeinstanceview.cpp   | 15 +++++++++++++--
 4 files changed, 37 insertions(+), 5 deletions(-)

diff --git a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp
index 57a18385766..ce4095e6a58 100644
--- a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp
+++ b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.cpp
@@ -39,9 +39,9 @@ InstanceContainer::InstanceContainer()
 {
 }
 
-InstanceContainer::InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &nodeSource, NodeSourceType nodeSourceType)
+InstanceContainer::InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &nodeSource, NodeSourceType nodeSourceType,NodeMetaType metaType)
     : m_instanceId(instanceId), m_type(type), m_majorNumber(majorNumber), m_minorNumber(minorNumber), m_componentPath(componentPath),
-      m_nodeSource(nodeSource), m_nodeSourceType(nodeSourceType)
+      m_nodeSource(nodeSource), m_nodeSourceType(nodeSourceType), m_metaType(metaType)
 {
     m_type.replace(QLatin1Char('.'), QLatin1Char('/'));
 }
@@ -81,6 +81,11 @@ InstanceContainer::NodeSourceType InstanceContainer::nodeSourceType() const
     return static_cast<NodeSourceType>(m_nodeSourceType);
 }
 
+InstanceContainer::NodeMetaType InstanceContainer::metaType() const
+{
+    return static_cast<NodeMetaType>(m_metaType);
+}
+
 QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
 {
     out << container.instanceId();
@@ -90,6 +95,7 @@ QDataStream &operator<<(QDataStream &out, const InstanceContainer &container)
     out << container.componentPath();
     out << container.nodeSource();
     out << container.nodeSourceType();
+    out << container.metaType();
 
     return out;
 }
@@ -104,6 +110,7 @@ QDataStream &operator>>(QDataStream &in, InstanceContainer &container)
     in >> container.m_componentPath;
     in >> container.m_nodeSource;
     in >> container.m_nodeSourceType;
+    in >> container.m_metaType;
 
     return in;
 }
diff --git a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.h b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.h
index b80bec5d398..25835c1ee94 100644
--- a/share/qtcreator/qml/qmlpuppet/container/instancecontainer.h
+++ b/share/qtcreator/qml/qmlpuppet/container/instancecontainer.h
@@ -54,8 +54,13 @@ public:
         ComponentSource = 2
     };
 
+    enum NodeMetaType {
+        ObjectMetaType,
+        ItemMetaType
+    };
+
     InstanceContainer();
-    InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &nodeSource, NodeSourceType nodeSourceType);
+    InstanceContainer(qint32 instanceId, const QString &type, int majorNumber, int minorNumber, const QString &componentPath, const QString &nodeSource, NodeSourceType nodeSourceType, NodeMetaType metaType);
 
     qint32 instanceId() const;
     QString type() const;
@@ -64,6 +69,7 @@ public:
     QString componentPath() const;
     QString nodeSource() const;
     NodeSourceType nodeSourceType() const;
+    NodeMetaType metaType() const;
 
 private:
     qint32 m_instanceId;
@@ -73,6 +79,7 @@ private:
     QString m_componentPath;
     QString m_nodeSource;
     qint32 m_nodeSourceType;
+    qint32 m_metaType;
 };
 
 } // namespace QmlDesigner
diff --git a/share/qtcreator/qml/qmlpuppet/instances/servernodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/instances/servernodeinstance.cpp
index 63434ad2ffb..73a2c9f2700 100644
--- a/share/qtcreator/qml/qmlpuppet/instances/servernodeinstance.cpp
+++ b/share/qtcreator/qml/qmlpuppet/instances/servernodeinstance.cpp
@@ -218,6 +218,13 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe
         object = Internal::ObjectNodeInstance::createPrimitive(instanceContainer.type(), instanceContainer.majorNumber(), instanceContainer.minorNumber(), nodeInstanceServer->context());
     }
 
+    if ((object == 0) && (instanceContainer.metaType() == InstanceContainer::ItemMetaType)) //If we cannot instanciate the object but we know it has to be an Ttem, we create an Item instead.
+#if QT_VERSION >= 0x050000
+        object = Internal::ObjectNodeInstance::createPrimitive("QSGItem", 2, 0, nodeInstanceServer->context())
+#else
+        object = Internal::ObjectNodeInstance::createPrimitive("QDeclarativeItem", 2, 0, nodeInstanceServer->context());
+#endif
+
     ServerNodeInstance instance(createInstance(object));
 
     instance.internalInstance()->setNodeInstanceServer(nodeInstanceServer);
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
index eeb80734213..8417c368911 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp
@@ -766,13 +766,19 @@ CreateSceneCommand NodeInstanceView::createCreateSceneCommand()
     QVector<InstanceContainer> instanceContainerList;
     foreach(const NodeInstance &instance, instanceList) {
         InstanceContainer::NodeSourceType nodeSourceType = static_cast<InstanceContainer::NodeSourceType>(instance.modelNode().nodeSourceType());
+
+        InstanceContainer::NodeMetaType nodeMetaType = nodeMetaType = InstanceContainer::ObjectMetaType;
+        if (instance.modelNode().metaInfo().isSubclassOf("QtQuick.Item", -1, -1))
+            nodeMetaType = InstanceContainer::ItemMetaType;
+
         InstanceContainer container(instance.instanceId(),
                                     instance.modelNode().type(),
                                     instance.modelNode().majorVersion(),
                                     instance.modelNode().minorVersion(),
                                     instance.modelNode().metaInfo().componentFileName(),
                                     instance.modelNode().nodeSource(),
-                                    nodeSourceType
+                                    nodeSourceType,
+                                    nodeMetaType
                                    );
 
         instanceContainerList.append(container);
@@ -862,8 +868,13 @@ CreateInstancesCommand NodeInstanceView::createCreateInstancesCommand(const QLis
     QVector<InstanceContainer> containerList;
     foreach(const NodeInstance &instance, instanceList) {
         InstanceContainer::NodeSourceType nodeSourceType = static_cast<InstanceContainer::NodeSourceType>(instance.modelNode().nodeSourceType());
+
+        InstanceContainer::NodeMetaType nodeMetaType = nodeMetaType = InstanceContainer::ObjectMetaType;
+        if (instance.modelNode().metaInfo().isSubclassOf("QtQuick.Item", -1, -1))
+            nodeMetaType = InstanceContainer::ItemMetaType;
+
         InstanceContainer container(instance.instanceId(), instance.modelNode().type(), instance.modelNode().majorVersion(), instance.modelNode().minorVersion(),
-                                    instance.modelNode().metaInfo().componentFileName(), instance.modelNode().nodeSource(), nodeSourceType);
+                                    instance.modelNode().metaInfo().componentFileName(), instance.modelNode().nodeSource(), nodeSourceType, nodeMetaType);
         containerList.append(container);
     }
 
-- 
GitLab