diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -29,6 +29,7 @@ target_link_libraries( dolphinvcs PUBLIC Qt5::Widgets + Qt5::Concurrent ) set_target_properties(dolphinvcs PROPERTIES diff --git a/src/kitemviews/kitemlistcontroller.h b/src/kitemviews/kitemlistcontroller.h --- a/src/kitemviews/kitemlistcontroller.h +++ b/src/kitemviews/kitemlistcontroller.h @@ -29,6 +29,7 @@ #include #include +#include class QTimer; class KItemModelBase; class KItemListKeyboardSearchManager; @@ -347,6 +348,11 @@ */ int m_keyboardAnchorIndex; qreal m_keyboardAnchorPos; + /** + * Stores the expensive to calculate results of the checks if a (long) list of urls + * contains a directory url, i.e. trying to paste over itself. + */ + QHash m_dropAccepted; }; #endif diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -58,7 +58,8 @@ m_autoActivationTimer(nullptr), m_oldSelection(), m_keyboardAnchorIndex(-1), - m_keyboardAnchorPos(0) + m_keyboardAnchorPos(0), + m_dropAccepted() { connect(m_keyboardManager, &KItemListKeyboardSearchManager::changeCurrentItem, this, &KItemListController::slotChangeCurrentItem); @@ -849,6 +850,9 @@ { Q_UNUSED(event); Q_UNUSED(transform); + + m_dropAccepted.clear(); + return false; } @@ -875,7 +879,6 @@ return false; } - QUrl hoveredDir = m_model->directory(); KItemListWidget* oldHoveredWidget = hoveredWidget(); @@ -929,7 +932,12 @@ m_view->hideDropIndicator(); } - event->setAccepted(!DragAndDropHelper::urlListMatchesUrl(event->mimeData()->urls(), hoveredDir)); + if (!m_dropAccepted.contains(hoveredDir)) + { + m_dropAccepted.insert(hoveredDir, + !DragAndDropHelper::urlListMatchesUrl(event->mimeData()->urls(), hoveredDir)); + } + event->setAccepted(m_dropAccepted[hoveredDir]); return false; } diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp --- a/src/views/draganddrophelper.cpp +++ b/src/views/draganddrophelper.cpp @@ -39,6 +39,10 @@ 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"))) {