From a84add82f1a13bf549ab50e34ec6fe2f07901043 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 2 Jul 2019 19:29:04 -0700 Subject: [PATCH] began drag n drop support in projectexplorer --- app/project/project.cpp | 6 ++ app/project/projectviewmodel.cpp | 69 +++++++++++++++++++ app/project/projectviewmodel.h | 5 ++ .../projectexplorertreeview.cpp | 12 ++++ 4 files changed, 92 insertions(+) diff --git a/app/project/project.cpp b/app/project/project.cpp index d5e518026..8cbfb0036 100644 --- a/app/project/project.cpp +++ b/app/project/project.cpp @@ -28,6 +28,12 @@ Project::Project() Folder* f = new Folder(); f->set_name("Foldery Boy"); root()->add_child(f); + Folder* f2 = new Folder(); + f2->set_name("DarnMan"); + root()->add_child(f2); + Folder* f3 = new Folder(); + f3->set_name("DamnDude"); + f2->add_child(f3); // END Test code } diff --git a/app/project/projectviewmodel.cpp b/app/project/projectviewmodel.cpp index 79c517e10..a526fd89c 100644 --- a/app/project/projectviewmodel.cpp +++ b/app/project/projectviewmodel.cpp @@ -20,6 +20,9 @@ #include "projectviewmodel.h" +#include +#include + ProjectViewModel::ProjectViewModel(QObject *parent) : QAbstractItemModel(parent), project_(nullptr) @@ -193,3 +196,69 @@ bool ProjectViewModel::hasChildren(const QModelIndex &parent) const // Otherwise, return default behavior return QAbstractItemModel::hasChildren(parent); } + +Qt::ItemFlags ProjectViewModel::flags(const QModelIndex &index) const +{ + return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | QAbstractItemModel::flags(index); +} + +QStringList ProjectViewModel::mimeTypes() const +{ + return {"application/x-oliveprojectitemdata"}; +} + +QMimeData *ProjectViewModel::mimeData(const QModelIndexList &indexes) const +{ + QMimeData* data = new QMimeData(); + + QByteArray encoded_data; + QDataStream stream(&encoded_data, QIODevice::WriteOnly); + + foreach (QModelIndex index, indexes) { + if (index.isValid()) { + stream << reinterpret_cast(index.internalPointer()); + } + } + + data->setData("application/x-oliveprojectitemdata", encoded_data); + + return data; +} + +bool ProjectViewModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) +{ + // Default recommended checks from https://doc.qt.io/qt-5/model-view-programming.html#using-drag-and-drop-with-item-views + if (!canDropMimeData(data, action, row, column, parent)) { + return false; + } + + if (action == Qt::IgnoreAction) { + return true; + } + + // Probe mime data for its format + QStringList mime_formats = data->formats(); + + if (mime_formats.contains("application/x-oliveprojectitemdata")) { + // Data is drag/drop data from this model + QByteArray model_data = data->data("application/x-oliveprojectitemdata"); + + // Use stream to deserialize the data + QDataStream stream(&model_data, QIODevice::ReadOnly); + + // Variables to deserialize into + quintptr item_ptr; + + // Loop through all data + while (!stream.atEnd()) { + stream >> item_ptr; + + Item* item = reinterpret_cast(item_ptr); + qDebug() << "Dragged" << item->name(); + } + + return true; + } + + return false; +} diff --git a/app/project/projectviewmodel.h b/app/project/projectviewmodel.h index d2c437201..29fb66b7d 100644 --- a/app/project/projectviewmodel.h +++ b/app/project/projectviewmodel.h @@ -83,6 +83,11 @@ public: virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const override; + /** Drag and drop support */ + virtual Qt::ItemFlags flags(const QModelIndex &index) const override; + virtual QStringList mimeTypes() const override; + virtual QMimeData * mimeData(const QModelIndexList &indexes) const override; + virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override; private: Project* project_; diff --git a/app/widget/projectexplorer/projectexplorertreeview.cpp b/app/widget/projectexplorer/projectexplorertreeview.cpp index 9063fb7f8..5cc3c6e80 100644 --- a/app/widget/projectexplorer/projectexplorertreeview.cpp +++ b/app/widget/projectexplorer/projectexplorertreeview.cpp @@ -27,6 +27,18 @@ ProjectExplorerTreeView::ProjectExplorerTreeView(QWidget *parent) : { // Set selection mode (allows multiple item selection) setSelectionMode(QAbstractItemView::ExtendedSelection); + + // Allow dragging and dropping + setDragDropMode(QAbstractItemView::DragDrop); + + // Enable dragging + setDragEnabled(true); + + // Allow dropping from external sources + setAcceptDrops(true); + + // Set context menu to emit a signal + setContextMenuPolicy(Qt::CustomContextMenu); } void ProjectExplorerTreeView::mouseDoubleClickEvent(QMouseEvent *event)