diff --git a/src/dolphinplacesmodelsingleton.cpp b/src/dolphinplacesmodelsingleton.cpp index c31ffc4c3c..258be155ba 100644 --- a/src/dolphinplacesmodelsingleton.cpp +++ b/src/dolphinplacesmodelsingleton.cpp @@ -6,11 +6,13 @@ #include "dolphinplacesmodelsingleton.h" #include "trash/dolphintrash.h" +#include "views/draganddrophelper.h" #include #include #include +#include DolphinPlacesModel::DolphinPlacesModel(const QString &alternativeApplicationName, QObject *parent) : KFilePlacesModel(alternativeApplicationName, parent) @@ -47,6 +49,25 @@ void DolphinPlacesModel::setPanelsLocked(bool locked) } } +QStringList DolphinPlacesModel::mimeTypes() const +{ + QStringList types = KFilePlacesModel::mimeTypes(); + types << DragAndDropHelper::arkDndServiceMimeType() + << DragAndDropHelper::arkDndPathMimeType(); + return types; +} + +bool DolphinPlacesModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) +{ + // We make the view accept the drag by returning them from mimeTypes() + // but the drop should be handled exclusively by PlacesPanel::slotUrlsDropped + if (DragAndDropHelper::isArkDndMimeType(data)) { + return false; + } + + return KFilePlacesModel::dropMimeData(data, action, row, column, parent); +} + QVariant DolphinPlacesModel::data(const QModelIndex &index, int role) const { switch (role) { diff --git a/src/dolphinplacesmodelsingleton.h b/src/dolphinplacesmodelsingleton.h index 996f9de78f..13e1193423 100644 --- a/src/dolphinplacesmodelsingleton.h +++ b/src/dolphinplacesmodelsingleton.h @@ -29,6 +29,9 @@ public: bool panelsLocked() const; void setPanelsLocked(bool locked); + QStringList mimeTypes() const override; + bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override; + protected: QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp index 2466b2ab7e..b3f2a4c3e0 100644 --- a/src/views/draganddrophelper.cpp +++ b/src/views/draganddrophelper.cpp @@ -35,10 +35,9 @@ bool DragAndDropHelper::urlListMatchesUrl(const QList& urls, const QUrl& d KIO::DropJob* DragAndDropHelper::dropUrls(const QUrl& destUrl, QDropEvent* event, QWidget* window) { const QMimeData* mimeData = event->mimeData(); - if (mimeData->hasFormat(QStringLiteral("application/x-kde-ark-dndextract-service")) && - mimeData->hasFormat(QStringLiteral("application/x-kde-ark-dndextract-path"))) { - const QString remoteDBusClient = mimeData->data(QStringLiteral("application/x-kde-ark-dndextract-service")); - const QString remoteDBusPath = mimeData->data(QStringLiteral("application/x-kde-ark-dndextract-path")); + if (isArkDndMimeType(mimeData)) { + const QString remoteDBusClient = mimeData->data(arkDndServiceMimeType()); + const QString remoteDBusPath = mimeData->data(arkDndPathMimeType()); QDBusMessage message = QDBusMessage::createMethodCall(remoteDBusClient, remoteDBusPath, QStringLiteral("org.kde.ark.DndExtract"), QStringLiteral("extractSelectedFilesTo")); @@ -63,3 +62,8 @@ void DragAndDropHelper::clearUrlListMatchesUrlCache() DragAndDropHelper::m_urlListMatchesUrlCache.clear(); } +bool DragAndDropHelper::isArkDndMimeType(const QMimeData *mimeData) +{ + return mimeData->hasFormat(arkDndServiceMimeType()) + && mimeData->hasFormat(arkDndPathMimeType()); +} diff --git a/src/views/draganddrophelper.h b/src/views/draganddrophelper.h index 5f9d3754b9..19a30404e7 100644 --- a/src/views/draganddrophelper.h +++ b/src/views/draganddrophelper.h @@ -11,9 +11,11 @@ #include "dolphin_export.h" #include +#include #include class QDropEvent; +class QMimeData; class QWidget; namespace KIO { class DropJob; } @@ -42,6 +44,13 @@ public: */ static bool urlListMatchesUrl(const QList& urls, const QUrl& destUrl); + /** + * @return True if mimeData contains Ark's drag and drop mime types. + */ + static bool isArkDndMimeType(const QMimeData *mimeData); + static QString arkDndServiceMimeType() { return QStringLiteral("application/x-kde-ark-dndextract-service"); } + static QString arkDndPathMimeType() { return QStringLiteral("application/x-kde-ark-dndextract-path"); } + /** * clear the internal cache. */