From 106e940d1c40e181a18919b0dc9e9a8a148b449a Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Wed, 23 Mar 2011 12:39:10 +0100
Subject: [PATCH] QmlDesigner.nodeInstances: fix for flickable

Items with a viewport like flickable do not work in 2.2.
This is a regression from 2.1.

Reviewed-by: Kai Koehne
Task-number: QTCREATORBUG-3998
---
 .../instances/graphicsobjectnodeinstance.cpp  | 24 +++++++++++++++++++
 .../instances/graphicsobjectnodeinstance.h    |  1 +
 2 files changed, 25 insertions(+)

diff --git a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp
index 6f0d2724e66..f6e075020e5 100644
--- a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp
+++ b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.cpp
@@ -72,12 +72,36 @@ QList<ServerNodeInstance> GraphicsObjectNodeInstance::childItems() const
         QGraphicsObject *childObject = item->toGraphicsObject();
         if (childObject && nodeInstanceServer()->hasInstanceForObject(childObject)) {
             instanceList.append(nodeInstanceServer()->instanceForObject(childObject));
+        } else { //there might be an item in between the parent instance
+                 //and the child instance.
+                 //Popular example is flickable which has a viewport item between
+                 //the flickable item and the flickable children
+            instanceList.append(childItemsForChild(item)); //In such a case we go deeper inside the item and
+                                                           //search for child items with instances.
         }
     }
 
     return instanceList;
 }
 
+QList<ServerNodeInstance> GraphicsObjectNodeInstance::childItemsForChild(QGraphicsItem *childItem) const
+{
+    QList<ServerNodeInstance> instanceList;
+    if (childItem) {
+
+        foreach(QGraphicsItem *item, childItem->childItems())
+        {
+            QGraphicsObject *childObject = item->toGraphicsObject();
+            if (childObject && nodeInstanceServer()->hasInstanceForObject(childObject)) {
+                instanceList.append(nodeInstanceServer()->instanceForObject(childObject));
+            } else {
+                instanceList.append(childItemsForChild(item));
+            }
+        }
+    }
+    return instanceList;
+}
+
 void GraphicsObjectNodeInstance::setHasContent(bool hasContent)
 {
     m_hasContent = hasContent;
diff --git a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h
index 333d0ceaaba..e6fa5060c91 100644
--- a/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h
+++ b/src/plugins/qmldesigner/designercore/instances/graphicsobjectnodeinstance.h
@@ -76,6 +76,7 @@ public:
     bool hasContent() const;
 
     QList<ServerNodeInstance> childItems() const;
+    QList<ServerNodeInstance> childItemsForChild(QGraphicsItem *childItem) const;
 
     void paintUpdate();
 
-- 
GitLab