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