┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
authorEmirald Mateli <[email protected]>2017-11-11 15:05:15 +0100
committerElvis Angelaccio <[email protected]>2017-11-11 15:06:13 +0100
commit99e80c1c7e6e77aa26ccbca4fbb0430b35974544 (patch)
treebe2f13eb7b687cdead75488e4324e5f821214871 /src/kitemviews
parentfa04e37569a316b3aaab3ca9fc42d50501347fd8 (diff)
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
Diffstat (limited to 'src/kitemviews')
-rw-r--r--src/kitemviews/kfileitemmodel.h2
-rw-r--r--src/kitemviews/kitemlistcontroller.cpp11
-rw-r--r--src/kitemviews/kitemmodelbase.cpp14
-rw-r--r--src/kitemviews/kitemmodelbase.h14
4 files changed, 39 insertions, 2 deletions
diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h
index 5dbeb32b2..0ca748d7a 100644
--- a/src/kitemviews/kfileitemmodel.h
+++ b/src/kitemviews/kfileitemmodel.h
@@ -73,7 +73,7 @@ public:
* the root-parent of all items.
* @see rootItem()
*/
- QUrl directory() const;
+ QUrl directory() const Q_DECL_OVERRIDE;
/**
* Cancels the loading of a directory which has been started by either
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp
index 753d7915d..008b6c4c6 100644
--- a/src/kitemviews/kitemlistcontroller.cpp
+++ b/src/kitemviews/kitemlistcontroller.cpp
@@ -39,6 +39,7 @@
#include <QMimeData>
#include <QTimer>
#include <QAccessible>
+#include <views/draganddrophelper.h>
KItemListController::KItemListController(KItemModelBase* model, KItemListView* view, QObject* parent) :
QObject(parent),
@@ -842,6 +843,7 @@ bool KItemListController::dragLeaveEvent(QGraphicsSceneDragDropEvent* event, con
Q_UNUSED(event);
Q_UNUSED(transform);
+ m_autoActivationTimer->stop();
m_view->setAutoScroll(false);
m_view->hideDropIndicator();
@@ -859,8 +861,8 @@ bool KItemListController::dragMoveEvent(QGraphicsSceneDragDropEvent* event, cons
return false;
}
- event->acceptProposedAction();
+ QUrl hoveredDir = m_model->directory();
KItemListWidget* oldHoveredWidget = hoveredWidget();
const QPointF pos = transform.map(event->pos());
@@ -883,6 +885,11 @@ bool KItemListController::dragMoveEvent(QGraphicsSceneDragDropEvent* event, cons
}
const int index = newHoveredWidget->index();
+
+ if (m_model->isDir(index)) {
+ hoveredDir = m_model->url(index);
+ }
+
if (!droppingBetweenItems) {
if (m_model->supportsDropping(index)) {
// Something has been dragged on an item.
@@ -908,6 +915,8 @@ bool KItemListController::dragMoveEvent(QGraphicsSceneDragDropEvent* event, cons
m_view->hideDropIndicator();
}
+ event->setAccepted(!DragAndDropHelper::urlListMatchesUrl(event->mimeData()->urls(), hoveredDir));
+
return false;
}
diff --git a/src/kitemviews/kitemmodelbase.cpp b/src/kitemviews/kitemmodelbase.cpp
index ee7e81084..d73468336 100644
--- a/src/kitemviews/kitemmodelbase.cpp
+++ b/src/kitemviews/kitemmodelbase.cpp
@@ -164,3 +164,17 @@ void KItemModelBase::onSortOrderChanged(Qt::SortOrder current, Qt::SortOrder pre
Q_UNUSED(previous);
}
+QUrl KItemModelBase::url(int index) const
+{
+ return data(index).value("url").toUrl();
+}
+
+bool KItemModelBase::isDir(int index) const
+{
+ return data(index).value("isDir").toBool();
+}
+
+QUrl KItemModelBase::directory() const
+{
+ return QUrl();
+} \ No newline at end of file
diff --git a/src/kitemviews/kitemmodelbase.h b/src/kitemviews/kitemmodelbase.h
index 45ad1f61a..55078dc24 100644
--- a/src/kitemviews/kitemmodelbase.h
+++ b/src/kitemviews/kitemmodelbase.h
@@ -182,6 +182,20 @@ public:
*/
QString blacklistItemDropEventMimeType() const;
+ /**
+ * @return URL of the item at the specified index
+ */
+ virtual QUrl url(int index) const;
+
+ /**
+ * @return True, if item at specified index is a directory
+ */
+ virtual bool isDir(int index) const;
+
+ /**
+ * @return Parent directory of the items that are shown
+ */
+ virtual QUrl directory() const;
signals:
/**
* Is emitted if one or more items have been inserted. Each item-range consists