diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 130936488..b5438e5d4 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -46,6 +46,7 @@ KItemListController::KItemListController(KItemModelBase* model, KItemListView* v m_singleClickActivationEnforced(false), m_selectionTogglePressed(false), m_clearSelectionIfItemsAreNotDragged(false), + m_currentDropAcceptState(false), m_selectionBehavior(NoSelection), m_autoActivationBehavior(ActivationAndExpansion), m_mouseDoubleClickAction(ActivateItemOnly), @@ -849,6 +850,9 @@ bool KItemListController::dragEnterEvent(QGraphicsSceneDragDropEvent* event, con { Q_UNUSED(event); Q_UNUSED(transform); + + m_currentDropAcceptState = !DragAndDropHelper::urlListMatchesUrl(event->mimeData()->urls(), m_model->directory()); + return false; } @@ -857,6 +861,8 @@ bool KItemListController::dragLeaveEvent(QGraphicsSceneDragDropEvent* event, con Q_UNUSED(event); Q_UNUSED(transform); + m_currentDropAcceptState = false; + m_autoActivationTimer->stop(); m_view->setAutoScroll(false); m_view->hideDropIndicator(); @@ -876,7 +882,6 @@ bool KItemListController::dragMoveEvent(QGraphicsSceneDragDropEvent* event, cons } - QUrl hoveredDir = m_model->directory(); KItemListWidget* oldHoveredWidget = hoveredWidget(); const QPointF pos = transform.map(event->pos()); @@ -901,7 +906,7 @@ bool KItemListController::dragMoveEvent(QGraphicsSceneDragDropEvent* event, cons const int index = newHoveredWidget->index(); if (m_model->isDir(index)) { - hoveredDir = m_model->url(index); + m_currentDropAcceptState = !DragAndDropHelper::urlListMatchesUrl(event->mimeData()->urls(), m_model->url(index)); } if (!droppingBetweenItems) { @@ -929,7 +934,7 @@ bool KItemListController::dragMoveEvent(QGraphicsSceneDragDropEvent* event, cons m_view->hideDropIndicator(); } - event->setAccepted(!DragAndDropHelper::urlListMatchesUrl(event->mimeData()->urls(), hoveredDir)); + event->setAccepted(m_currentDropAcceptState); return false; } diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h index 3de5edece..c9ad4b7d4 100644 --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -311,6 +311,7 @@ private: bool m_singleClickActivationEnforced; bool m_selectionTogglePressed; bool m_clearSelectionIfItemsAreNotDragged; + bool m_currentDropAcceptState; SelectionBehavior m_selectionBehavior; AutoActivationBehavior m_autoActivationBehavior; MouseDoubleClickAction m_mouseDoubleClickAction; diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index e40e49d6e..11f542962 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -1071,6 +1071,7 @@ void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* even event->mimeData(), event->buttons(), event->modifiers()); + dropEvent.setAccepted(event->isAccepted()); dropUrls(destUrl, &dropEvent, this); setActive(true); diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp index e944227df..7bd004052 100644 --- a/src/views/draganddrophelper.cpp +++ b/src/views/draganddrophelper.cpp @@ -39,6 +39,11 @@ bool DragAndDropHelper::urlListMatchesUrl(const QList& urls, const QUrl& d KIO::DropJob* DragAndDropHelper::dropUrls(const QUrl& destUrl, QDropEvent* event, QWidget* window) { + // The drop event isn't accpeted. Could for instance be because of dropping on itself. + if (!event->isAccepted()) { + return nullptr; + } + const QMimeData* mimeData = event->mimeData(); if (mimeData->hasFormat(QStringLiteral("application/x-kde-ark-dndextract-service")) && mimeData->hasFormat(QStringLiteral("application/x-kde-ark-dndextract-path"))) { @@ -50,10 +55,6 @@ 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);