From 99e80c1c7e6e77aa26ccbca4fbb0430b35974544 Mon Sep 17 00:00:00 2001 From: Emirald Mateli Date: Sat, 11 Nov 2017 15:05:15 +0100 Subject: Prevent folders from drag and dropping onto themselves in dolphin main view Summary: This patch aims to improve user experience by not allowing the user to drag and drop a folder into itself. The current behavior shows a red message at the top which can then be closed by the user, instead of relying on that, this patch disables the option of dropping onto self and uses the "Invalid drop target cursor" to highlight the behavior. BUG: 307747 Since spectacle is unable to screenshot the cursor overlay, find attached a photo of the screen. {F3787651} Test Plan: 1. Drag a folder. 2. Drop it onto itself. Reviewers: #dolphin, elvisangelaccio, ngraham, rkflx, dfaure Reviewed By: #dolphin, elvisangelaccio, rkflx, dfaure Subscribers: rkflx, ngraham, elvisangelaccio, dfaure, anthonyfieroni, #konqueror Tags: #dolphin Differential Revision: https://phabricator.kde.org/D6281 --- src/views/draganddrophelper.cpp | 12 ++++++++++++ src/views/draganddrophelper.h | 11 +++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) (limited to 'src/views') diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp index 01b41f8b2..831a9d43e 100644 --- a/src/views/draganddrophelper.cpp +++ b/src/views/draganddrophelper.cpp @@ -29,6 +29,14 @@ #include #include + +bool DragAndDropHelper::urlListMatchesUrl(const QList& urls, const QUrl& destUrl) +{ + return std::find_if(urls.constBegin(), urls.constEnd(), [destUrl](const QUrl& url) { + return url.matches(destUrl, QUrl::StripTrailingSlash); + }) != urls.constEnd(); +} + KIO::DropJob* DragAndDropHelper::dropUrls(const QUrl& destUrl, QDropEvent* event, QWidget* window) { const QMimeData* mimeData = event->mimeData(); @@ -42,6 +50,10 @@ KIO::DropJob* DragAndDropHelper::dropUrls(const QUrl& destUrl, QDropEvent* event message.setArguments({destUrl.toDisplayString(QUrl::PreferLocalFile)}); QDBusConnection::sessionBus().call(message); } else { + if (urlListMatchesUrl(event->mimeData()->urls(), destUrl)) { + return nullptr; + } + // Drop into a directory or a desktop-file KIO::DropJob *job = KIO::drop(event, destUrl); KJobWidgets::setWindow(job, window); diff --git a/src/views/draganddrophelper.h b/src/views/draganddrophelper.h index 3153f06ef..e47f83ca8 100644 --- a/src/views/draganddrophelper.h +++ b/src/views/draganddrophelper.h @@ -22,9 +22,10 @@ #define DRAGANDDROPHELPER_H #include "dolphin_export.h" +#include +#include -class QUrl; class QDropEvent; class QWidget; namespace KIO { class DropJob; } @@ -42,11 +43,17 @@ public: * is true. * @param event Drop event. * @param window Widget where the drop happened, will be used as parent of the drop menu. - * @return KIO::DropJob pointer + * @return KIO::DropJob pointer or null in case the destUrl is contained + * in the mimeData url list. */ static KIO::DropJob* dropUrls(const QUrl& destUrl, QDropEvent* event, QWidget *window); + + /** + * @return True if destUrl is contained in the urls parameter. + */ + static bool urlListMatchesUrl(const QList& urls, const QUrl& destUrl); }; #endif -- cgit v1.3