]> cloud.milkyroute.net Git - dolphin.git/commitdiff
[Places Panel] Support drag and drop from Ark
authorKai Uwe Broulik <kde@privat.broulik.de>
Thu, 7 Apr 2022 19:41:43 +0000 (21:41 +0200)
committerKai Uwe Broulik <kde@privat.broulik.de>
Mon, 11 Apr 2022 16:01:51 +0000 (18:01 +0200)
Accepts Ark's special dnd mime types so that archive contents can
be dragged onto a place to extract and/or (mount and) switch to the
hovered location.

src/dolphinplacesmodelsingleton.cpp
src/dolphinplacesmodelsingleton.h
src/views/draganddrophelper.cpp
src/views/draganddrophelper.h

index c31ffc4c3cd1c0c4afeb676ecc25606f3f91e901..258be155ba3bd412fa2d54b3961e1facf156b69a 100644 (file)
@@ -6,11 +6,13 @@
 
 #include "dolphinplacesmodelsingleton.h"
 #include "trash/dolphintrash.h"
+#include "views/draganddrophelper.h"
 
 #include <KAboutData>
 #include <KFilePlacesModel>
 
 #include <QIcon>
+#include <QMimeData>
 
 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) {
index 996f9de78fb559a00101ec21e4bd99c4cf4e21eb..13e1193423d23a6655717344d6ff8d89e99b2703 100644 (file)
@@ -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;
 
index 2466b2ab7e775d34798da5c68911e3ca0a606139..b3f2a4c3e03d3c2084c046b1d056a9315635a184 100644 (file)
@@ -35,10 +35,9 @@ bool DragAndDropHelper::urlListMatchesUrl(const QList<QUrl>& 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());
+}
index 5f9d3754b9aa5bdc61d451868feacb25f23eeb7d..19a30404e727a54c36787463a71cc8ce0b75c612 100644 (file)
 #include "dolphin_export.h"
 
 #include <QList>
+#include <QString>
 #include <QUrl>
 
 class QDropEvent;
+class QMimeData;
 class QWidget;
 namespace KIO { class DropJob; }
 
@@ -42,6 +44,13 @@ public:
      */
     static bool urlListMatchesUrl(const QList<QUrl>& 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.
      */