From 12f6c8f631f096bf44f737eded26d0adf187086b Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Fri, 8 Jan 2010 17:13:33 +0100
Subject: [PATCH] Qml Designer: fixes nasty crash bug in Navigator

We have to use LinkAction instead of MoveAction
otherwise the model and the ItemView executes
the move/reparenting which turns the ItemModel
invalid and results in a crash
---
 .../components/navigator/navigatortreemodel.cpp          | 9 +++++----
 .../qmldesigner/components/navigator/navigatorwidget.cpp | 1 +
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
index ef9b8601439..e172f53cc04 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp
@@ -48,7 +48,7 @@ NavigatorTreeModel::NavigatorTreeModel(QObject *parent)
     setHorizontalHeaderItem(1,  new QStandardItem(tr("Type")));
     setHorizontalHeaderItem(2,  new QStandardItem(tr("Show in Editor")));
 
-    setSupportedDragActions(Qt::MoveAction);
+    setSupportedDragActions(Qt::LinkAction);
 
     connect(this, SIGNAL(itemChanged(QStandardItem*)),
             this, SLOT(handleChangedItem(QStandardItem*)));
@@ -60,7 +60,7 @@ NavigatorTreeModel::~NavigatorTreeModel()
 
 Qt::DropActions NavigatorTreeModel::supportedDropActions() const
 {
-    return Qt::MoveAction;
+    return Qt::LinkAction;
 }
 
 QStringList NavigatorTreeModel::mimeTypes() const
@@ -113,7 +113,7 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *data,
 {
     if (action == Qt::IgnoreAction)
         return true;
-    if (action != Qt::MoveAction)
+    if (action != Qt::LinkAction)
         return false;
     if (!data->hasFormat("application/vnd.modelnode.list"))
         return false;
@@ -159,7 +159,8 @@ bool NavigatorTreeModel::dropMimeData(const QMimeData *data,
         if (!isAnchestorInList(node, nodeList)) {
             if (node.parentProperty().parentModelNode() != parentItemNode) {
                 QmlItemNode itemNode(node);
-                itemNode.setParent(parentItemNode);
+                if (node != parentItemNode)
+                    itemNode.setParent(parentItemNode);
             }
 
             if (node.parentProperty().isNodeListProperty()) {
diff --git a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp
index 36a08386491..761b256c610 100644
--- a/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp
+++ b/src/plugins/qmldesigner/components/navigator/navigatorwidget.cpp
@@ -46,6 +46,7 @@ NavigatorWidget::NavigatorWidget(QWidget* parent) :
     m_treeView->setAcceptDrops(true);
     m_treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
     m_treeView->header()->setStretchLastSection(false);
+    m_treeView->setDefaultDropAction(Qt::LinkAction);
 
     QVBoxLayout *layout = new QVBoxLayout;
     layout->setSpacing(0);
-- 
GitLab