From d853997f9985b5bd6144e8dd3df15e7e02938c64 Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Fri, 15 Jul 2011 18:21:05 +0200
Subject: [PATCH] QmlDesigner.dragAndDrop: crash fix

This fixes a crash if we drag in complex items with children.

Change-Id: I0e924d3130cbd43dc9a20469576dce8a0f67f3df
Reviewed-on: http://codereview.qt.nokia.com/1715
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
---
 .../qmldesigner/components/formeditor/dragtool.cpp     | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp
index f2f95f52cd3..865583602f2 100644
--- a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp
+++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp
@@ -185,12 +185,20 @@ void DragTool::createQmlItemNodeFromImage(const QString &imageName, QmlItemNode
     m_selectionIndicator.setItems(scene()->itemsForQmlItemNodes(nodeList));
 }
 
+static inline bool isAncestorOf(FormEditorItem *formEditorItem, FormEditorItem *newParentItem)
+{
+    if (formEditorItem && newParentItem)
+        return formEditorItem->isAncestorOf(newParentItem);
+    return false;
+}
+
 FormEditorItem* DragTool::calculateContainer(const QPointF &point, FormEditorItem * currentItem)
 {
     QList<QGraphicsItem *> list = scene()->items(point);
     foreach (QGraphicsItem *item, list) {
          FormEditorItem *formEditorItem = FormEditorItem::fromQGraphicsItem(item);
-         if (formEditorItem && formEditorItem != currentItem && formEditorItem->isContainer())
+         if (formEditorItem && formEditorItem != currentItem && formEditorItem->isContainer()
+             && !isAncestorOf(currentItem, formEditorItem))
              return formEditorItem;
     }
 
-- 
GitLab