From cc42a0872317b7b51c96bf68171993bff90bdf2c Mon Sep 17 00:00:00 2001
From: Eike Ziller <eike.ziller@theqtcompany.com>
Date: Fri, 17 Oct 2014 10:22:26 +0200
Subject: [PATCH] Class view: Add drag & drop onto editor splits

Change-Id: I35bc03d4e963500a7edf37d6f9d0ddd0a6c68529
Reviewed-by: Daniel Teske <daniel.teske@digia.com>
---
 .../classview/classviewnavigationwidget.cpp   |  3 ++
 .../classview/classviewparsertreeitem.cpp     |  4 +++
 .../classview/classviewtreeitemmodel.cpp      | 30 +++++++++++++++++++
 .../classview/classviewtreeitemmodel.h        | 16 +++++-----
 4 files changed, 44 insertions(+), 9 deletions(-)

diff --git a/src/plugins/classview/classviewnavigationwidget.cpp b/src/plugins/classview/classviewnavigationwidget.cpp
index 9243fae81d9..49ab4ab0e88 100644
--- a/src/plugins/classview/classviewnavigationwidget.cpp
+++ b/src/plugins/classview/classviewnavigationwidget.cpp
@@ -99,6 +99,9 @@ NavigationWidget::NavigationWidget(QWidget *parent) :
     verticalLayout->setContentsMargins(0, 0, 0, 0);
     treeView = new ::Utils::NavigationTreeView(this);
     treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
+    treeView->setDragEnabled(true);
+    treeView->setDragDropMode(QAbstractItemView::DragOnly);
+    treeView->setDefaultDropAction(Qt::MoveAction);
     verticalLayout->addWidget(Core::ItemViewFind::createSearchableWrapper(
                                   treeView, Core::ItemViewFind::DarkColored,
                                   Core::ItemViewFind::FetchMoreWhileSearching));
diff --git a/src/plugins/classview/classviewparsertreeitem.cpp b/src/plugins/classview/classviewparsertreeitem.cpp
index a054339c344..89e33d9de00 100644
--- a/src/plugins/classview/classviewparsertreeitem.cpp
+++ b/src/plugins/classview/classviewparsertreeitem.cpp
@@ -316,6 +316,10 @@ void ParserTreeItem::convertTo(QStandardItem *item) const
             // icon
             add->setIcon(ptr->icon());
 
+            // draggable
+            if (!ptr->symbolLocations().isEmpty())
+                add->setFlags(add->flags() | Qt::ItemIsDragEnabled);
+
             // locations
             add->setData(Utils::locationsToRole(ptr->symbolLocations()),
                          Constants::SymbolLocationsRole);
diff --git a/src/plugins/classview/classviewtreeitemmodel.cpp b/src/plugins/classview/classviewtreeitemmodel.cpp
index f719b3378ce..8f7b033aba0 100644
--- a/src/plugins/classview/classviewtreeitemmodel.cpp
+++ b/src/plugins/classview/classviewtreeitemmodel.cpp
@@ -34,6 +34,7 @@
 #include "classviewutils.h"
 
 #include <cplusplus/Icons.h>
+#include <utils/fileutils.h>
 
 namespace ClassView {
 namespace Internal {
@@ -133,6 +134,35 @@ bool TreeItemModel::hasChildren(const QModelIndex &parent) const
     return Manager::instance()->hasChildren(itemFromIndex(parent));
 }
 
+Qt::DropActions TreeItemModel::supportedDragActions() const
+{
+    return Qt::MoveAction | Qt::CopyAction;
+}
+
+QStringList TreeItemModel::mimeTypes() const
+{
+    return ::Utils::FileDropSupport::mimeTypesForFilePaths();
+}
+
+QMimeData *TreeItemModel::mimeData(const QModelIndexList &indexes) const
+{
+    auto mimeData = new ::Utils::FileDropMimeData;
+    mimeData->setOverrideFileDropAction(Qt::CopyAction);
+    foreach (const QModelIndex &index, indexes) {
+        const QSet<SymbolLocation> locations = Utils::roleToLocations(
+                    data(index, Constants::SymbolLocationsRole).toList());
+        if (locations.isEmpty())
+            continue;
+        const SymbolLocation loc = *locations.constBegin();
+        mimeData->addFile(loc.fileName(), loc.line(), loc.column());
+    }
+    if (mimeData->files().isEmpty()) {
+        delete mimeData;
+        return 0;
+    }
+    return mimeData;
+}
+
 /*!
    Moves the root item to the \a target item.
 */
diff --git a/src/plugins/classview/classviewtreeitemmodel.h b/src/plugins/classview/classviewtreeitemmodel.h
index 0a793f37853..55d1ec387c8 100644
--- a/src/plugins/classview/classviewtreeitemmodel.h
+++ b/src/plugins/classview/classviewtreeitemmodel.h
@@ -43,21 +43,19 @@ class TreeItemModel : public QStandardItemModel
     Q_OBJECT
 
 public:
-    explicit TreeItemModel(QObject *parent=0);
+    explicit TreeItemModel(QObject *parent = 0);
     virtual ~TreeItemModel();
 
     void moveRootToTarget(const QStandardItem *target);
 
-    //! \implements QStandardItemModel::data
     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+    bool canFetchMore(const QModelIndex &parent) const;
+    void fetchMore(const QModelIndex &parent);
+    bool hasChildren(const QModelIndex &parent = QModelIndex()) const;
 
-    //! \implements QStandardItemModel::canFetchMore
-    virtual bool canFetchMore(const QModelIndex &parent) const;
-
-    //! \implements QStandardItemModel::fetchMore
-    virtual void fetchMore(const QModelIndex &parent);
-
-    virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const;
+    Qt::DropActions supportedDragActions() const;
+    QStringList mimeTypes() const;
+    QMimeData *mimeData(const QModelIndexList &indexes) const;
 
 private:
     //! private class data pointer
-- 
GitLab