diff options
author | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2020-12-08 21:27:40 +0100 |
---|---|---|
committer | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2021-01-18 19:51:07 +0100 |
commit | 12d8bb0709bf7982061cb0c3e608e4a581892e35 (patch) | |
tree | 94a63fcb39ee85a81e8e81684e834688b581c0d5 | |
parent | 6ee13db700eecd8dfed54a9ec2d1081b39511562 (diff) | |
download | qtbase-12d8bb0709bf7982061cb0c3e608e4a581892e35.tar.gz |
ItemViews: Don't remove items on internal move
When an itemview only allows internal moving of items it can happen that
the target accepts the drag'n'drop operation since it's out of the
control of Qt (e.g. Recycle Bin or an other application). Due to the
nature of a move, the original item is deleted. Therefore check if the
internal move target is the same as the source and don't delete it
otherwse.
Fixes: QTBUG-86020
Pick-to: 6.0
Change-Id: I69de4b8d76d1b0f57338b402aee87580226cd6cb
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
-rw-r--r-- | src/widgets/itemviews/qabstractitemview.cpp | 6 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistview.cpp | 6 |
2 files changed, 8 insertions, 4 deletions
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index 9b889ea36d..bd89f43ca1 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -3701,8 +3701,10 @@ void QAbstractItemView::startDrag(Qt::DropActions supportedActions) else if (supportedActions & Qt::CopyAction && dragDropMode() != QAbstractItemView::InternalMove) defaultDropAction = Qt::CopyAction; d->dropEventMoved = false; - if (drag->exec(supportedActions, defaultDropAction) == Qt::MoveAction && !d->dropEventMoved) - d->clearOrRemove(); + if (drag->exec(supportedActions, defaultDropAction) == Qt::MoveAction && !d->dropEventMoved) { + if (dragDropMode() != InternalMove || drag->target() == viewport()) + d->clearOrRemove(); + } d->dropEventMoved = false; // Reset the drop indicator d->dropIndicatorRect = QRect(); diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index 1f3b22e8f8..27b4402e88 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -2898,8 +2898,10 @@ bool QIconModeViewBase::filterStartDrag(Qt::DropActions supportedActions) Qt::DropAction action = drag->exec(supportedActions, dd->defaultDropAction); draggedItems.clear(); // delete item, unless it has already been moved internally (see filterDropEvent) - if (action == Qt::MoveAction && !dd->dropEventMoved) - dd->clearOrRemove(); + if (action == Qt::MoveAction && !dd->dropEventMoved) { + if (dd->dragDropMode != QAbstractItemView::InternalMove || drag->target() == qq->viewport()) + dd->clearOrRemove(); + } dd->dropEventMoved = false; } return true; |