From 0de18de1ca0c1471292f14a35b79ca832a696452 Mon Sep 17 00:00:00 2001
From: Marco Bubke <marco.bubke@nokia.com>
Date: Wed, 9 Feb 2011 16:30:00 +0100
Subject: [PATCH] QmlDesigner.NodeInstances: Use a dummy context instead of the
 root context

All type information should be now available.
---
 .../instances/nodeinstanceserver.cpp          | 19 +++++++++++++------
 .../instances/nodeinstanceserver.h            |  4 ++++
 .../instances/objectnodeinstance.cpp          | 10 ++++------
 .../instances/servernodeinstance.cpp          |  6 +++---
 4 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp
index ed24dd45de4..1701e0c96aa 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.cpp
@@ -336,19 +336,21 @@ void NodeInstanceServer::addImports(const QVector<AddImportContainer> &container
         }
     }
 
-    QDeclarativeComponent importComponent(engine(), 0);
+    delete m_importComponent.data();
+    delete m_importComponentObject.data();
+
+    m_importComponent = new QDeclarativeComponent(engine(), 0);
     QString componentString;
     foreach(const QString &importStatement, m_importList)
         componentString += QString("%1").arg(importStatement);
 
     componentString += QString("Item {}\n");
 
-    importComponent.setData(componentString.toUtf8(), fileUrl());
-
-    if (!importComponent.errorString().isEmpty())
-        qDebug() << "QmlDesigner.NodeInstances: import wrong: " << importComponent.errorString();
+    m_importComponent->setData(componentString.toUtf8(), fileUrl());
+    m_importComponentObject = m_importComponent->create();
 
-    refreshBindings();
+    if (!m_importComponent->errorString().isEmpty())
+        qDebug() << "QmlDesigner.NodeInstances: import wrong: " << m_importComponent->errorString();
 }
 
 void NodeInstanceServer::addImport(const AddImportCommand &command)
@@ -415,6 +417,11 @@ QDeclarativeEngine *NodeInstanceServer::engine() const
     return 0;
 }
 
+QDeclarativeContext *NodeInstanceServer::context() const
+{
+    return QDeclarativeEngine::contextForObject(m_importComponentObject.data());
+}
+
 QDeclarativeView *NodeInstanceServer::delcarativeView() const
 {
     return m_declarativeView.data();
diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h
index 8a4998aa948..2deb34a07ae 100644
--- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h
+++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserver.h
@@ -15,6 +15,7 @@ class QDeclarativeView;
 class QDeclarativeEngine;
 class QGraphicsObject;
 class QFileInfo;
+class QDeclarativeComponent;
 QT_END_NAMESPACE
 
 namespace QmlDesigner {
@@ -63,6 +64,7 @@ public:
     bool hasInstanceForObject(QObject *object) const;
 
     QDeclarativeEngine *engine() const;
+    QDeclarativeContext *context() const;
 
     void removeAllInstanceRelationships();
 
@@ -165,6 +167,8 @@ private:
     QStringList m_importList;
     QList<ServerNodeInstance> m_completedComponentList;
     QWeakPointer<QObject> m_dummyContextObject;
+    QWeakPointer<QDeclarativeComponent> m_importComponent;
+    QWeakPointer<QObject> m_importComponentObject;
 };
 
 }
diff --git a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp
index 08aee473f19..45778b40881 100644
--- a/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/objectnodeinstance.cpp
@@ -823,12 +823,10 @@ void ObjectNodeInstance::updateAnchors()
 
 QDeclarativeContext *ObjectNodeInstance::context() const
 {
-    QDeclarativeContext *context = QDeclarativeEngine::contextForObject(object());
-    if (context)
-        return context;
-    else if (nodeInstanceServer())
-        return nodeInstanceServer()->engine()->rootContext();
+    if (nodeInstanceServer())
+        return nodeInstanceServer()->context();
 
+    qWarning() << "Error: No NodeInstanceServer";
     return 0;
 }
 
@@ -885,7 +883,7 @@ void ObjectNodeInstance::populateResetValueHash()
     QStringList propertyNameList = propertyNameForWritableProperties(object());
 
     foreach(const QString &propertyName, propertyNameList) {
-        QDeclarativeProperty property(object(), propertyName, context());
+        QDeclarativeProperty property(object(), propertyName, QDeclarativeEngine::contextForObject(object()));
         if (property.isWritable())
             m_resetValueHash.insert(propertyName, property.read());
     }
diff --git a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp
index f08987dea93..2ef797edb49 100644
--- a/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/servernodeinstance.cpp
@@ -195,16 +195,16 @@ ServerNodeInstance ServerNodeInstance::create(NodeInstanceServer *nodeInstanceSe
     Q_ASSERT(instanceContainer.instanceId() != -1);
     Q_ASSERT(nodeInstanceServer);
 
-    QDeclarativeContext *context = nodeInstanceServer->engine()->rootContext();
+    QDeclarativeContext *context = nodeInstanceServer->context();
 
     QObject *object = Internal::ObjectNodeInstance::createObject(instanceContainer.type(), instanceContainer.majorNumber(), instanceContainer.minorNumber(), instanceContainer.componentPath(), context);
 
     ServerNodeInstance instance(createInstance(object));
 
-    instance.internalInstance()->setInstanceId(instanceContainer.instanceId());
-
     instance.internalInstance()->setNodeInstanceServer(nodeInstanceServer);
 
+    instance.internalInstance()->setInstanceId(instanceContainer.instanceId());
+
     instance.internalInstance()->initializePropertyWatcher(instance.m_nodeInstance);
 
     //QObject::connect(instance.internalObject(), SIGNAL(destroyed(QObject*)), nodeInstanceView, SLOT(removeIdFromContext(QObject*)));
-- 
GitLab