diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -1176,6 +1176,8 @@ return; } + this->view()->setDragSource(data->urls()); + // The created drag object will be owned and deleted // by QApplication::activeWindow(). QDrag* drag = new QDrag(QApplication::activeWindow()); diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -705,6 +705,8 @@ static int itemsPerSize(qreal size, qreal itemSize, qreal itemMargin); private: + QUrl m_dropUrl; + QList m_dragSource; bool m_enabledSelectionToggles; bool m_grouped; bool m_supportsItemExpanding; @@ -767,6 +769,13 @@ friend class KItemListControllerTest; friend class KItemListViewAccessible; friend class KItemListAccessibleCell; + +public: + void setDropUrl(QUrl value); + QUrl dropUrl(); + + void setDragSource(QList); + QList dragSource(); }; /** diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -44,6 +44,7 @@ #include #include +#include #include "kitemlistviewaccessible.h" @@ -936,12 +937,13 @@ void KItemListView::dragEnterEvent(QGraphicsSceneDragDropEvent* event) { - event->setAccepted(true); setAutoScroll(true); } void KItemListView::dragMoveEvent(QGraphicsSceneDragDropEvent* event) { + event->setAccepted(!m_dragSource.contains(m_dropUrl)); + QGraphicsWidget::dragMoveEvent(event); m_mousePos = transform().map(event->pos()); @@ -2672,7 +2674,25 @@ return count; } +QUrl KItemListView::dropUrl() +{ + return m_dropUrl; +} + +void KItemListView::setDropUrl(QUrl value) +{ + m_dropUrl = value; +} +void KItemListView::setDragSource(QList dragSource) +{ + m_dragSource = dragSource; +} + +QList KItemListView::dragSource() +{ + return m_dragSource; +} KItemListCreatorBase::~KItemListCreatorBase() { diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -1014,6 +1014,10 @@ { const KFileItem item = m_model->fileItem(index); + if (m_dragging) { + m_container->controller()->view()->setDropUrl(item.url()); + } + if (GeneralSettings::showToolTips() && !m_dragging) { QRectF itemRect = m_container->controller()->view()->itemContextRect(index); const QPoint pos = m_container->mapToGlobal(itemRect.topLeft().toPoint()); @@ -1030,6 +1034,8 @@ Q_UNUSED(index); hideToolTip(); emit requestItemInfo(KFileItem()); + + m_container->controller()->view()->setDropUrl(QUrl()); } void DolphinView::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event) diff --git a/src/views/draganddrophelper.cpp b/src/views/draganddrophelper.cpp --- a/src/views/draganddrophelper.cpp +++ b/src/views/draganddrophelper.cpp @@ -42,6 +42,14 @@ message.setArguments({destUrl.toDisplayString(QUrl::PreferLocalFile)}); QDBusConnection::sessionBus().call(message); } else { + // Prevent drag and drop onto self + if (mimeData->urls().contains(destUrl)) { + event->ignore(); + event->setAccepted(false); + + return NULL; + } + // Drop into a directory or a desktop-file KIO::DropJob *job = KIO::drop(event, destUrl); KJobWidgets::setWindow(job, window);