diff options
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/itemviews/qabstractitemview.cpp | 5 | ||||
-rw-r--r-- | src/widgets/itemviews/qabstractitemview_p.h | 1 | ||||
-rw-r--r-- | src/widgets/itemviews/qlistview.cpp | 33 | ||||
-rw-r--r-- | src/widgets/itemviews/qtablewidget.cpp | 2 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreewidget.cpp | 2 |
5 files changed, 28 insertions, 15 deletions
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index 3a11ff4a90..b8cc5621fb 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -98,6 +98,7 @@ QAbstractItemViewPrivate::QAbstractItemViewPrivate() dragEnabled(false), dragDropMode(QAbstractItemView::NoDragDrop), overwrite(false), + dropEventMoved(false), dropIndicatorPosition(QAbstractItemView::OnItem), defaultDropAction(Qt::IgnoreAction), #endif @@ -3711,8 +3712,10 @@ void QAbstractItemView::startDrag(Qt::DropActions supportedActions) defaultDropAction = d->defaultDropAction; else if (supportedActions & Qt::CopyAction && dragDropMode() != QAbstractItemView::InternalMove) defaultDropAction = Qt::CopyAction; - if (drag->exec(supportedActions, defaultDropAction) == Qt::MoveAction) + d->dropEventMoved = false; + if (drag->exec(supportedActions, defaultDropAction) == Qt::MoveAction && !d->dropEventMoved) d->clearOrRemove(); + d->dropEventMoved = false; // Reset the drop indicator d->dropIndicatorRect = QRect(); d->dropIndicatorPosition = OnItem; diff --git a/src/widgets/itemviews/qabstractitemview_p.h b/src/widgets/itemviews/qabstractitemview_p.h index fe1c00248f..33924799fe 100644 --- a/src/widgets/itemviews/qabstractitemview_p.h +++ b/src/widgets/itemviews/qabstractitemview_p.h @@ -406,6 +406,7 @@ public: bool dragEnabled; QAbstractItemView::DragDropMode dragDropMode; bool overwrite; + bool dropEventMoved; QAbstractItemView::DropIndicatorPosition dropIndicatorPosition; Qt::DropAction defaultDropAction; #endif diff --git a/src/widgets/itemviews/qlistview.cpp b/src/widgets/itemviews/qlistview.cpp index d34965fe07..2d33759d8c 100644 --- a/src/widgets/itemviews/qlistview.cpp +++ b/src/widgets/itemviews/qlistview.cpp @@ -932,7 +932,7 @@ void QListView::dropEvent(QDropEvent *event) } } - if (!topIndexDropped) { + if (!topIndexDropped && !topIndex.isValid()) { std::sort(persIndexes.begin(), persIndexes.end()); // The dropped items will remain in the same visual order. QPersistentModelIndex dropRow = model()->index(row, col, topIndex); @@ -940,19 +940,29 @@ void QListView::dropEvent(QDropEvent *event) int r = row == -1 ? model()->rowCount() : (dropRow.row() >= 0 ? dropRow.row() : row); for (int i = 0; i < persIndexes.count(); ++i) { const QPersistentModelIndex &pIndex = persIndexes.at(i); - model()->moveRow(QModelIndex(), pIndex.row(), QModelIndex(), r); + if (r != pIndex.row()) { + // try to move (preserves selection) + d->dropEventMoved |= model()->moveRow(QModelIndex(), pIndex.row(), QModelIndex(), r); + if (!d->dropEventMoved) // can't move - abort and let QAbstractItemView handle this + break; + } else { + // move onto itself is blocked, don't delete anything + d->dropEventMoved = true; + } r = pIndex.row() + 1; // Dropped items are inserted contiguously and in the right order. } - - event->accept(); - // Don't want QAbstractItemView to delete it because it was "moved" we already did it - event->setDropAction(Qt::CopyAction); + if (d->dropEventMoved) + event->accept(); // data moved, nothing to be done in QAbstractItemView::dropEvent } } } - if (!d->commonListView->filterDropEvent(event)) + if (!d->commonListView->filterDropEvent(event) || !d->dropEventMoved) { + // icon view didn't move the data, and moveRows not implemented, so fall back to default + if (!d->dropEventMoved) + event->ignore(); QAbstractItemView::dropEvent(event); + } } /*! @@ -2879,12 +2889,13 @@ bool QIconModeViewBase::filterStartDrag(Qt::DropActions supportedActions) drag->setMimeData(dd->model->mimeData(indexes)); drag->setPixmap(pixmap); drag->setHotSpot(dd->pressedPosition - rect.topLeft()); + dd->dropEventMoved = false; Qt::DropAction action = drag->exec(supportedActions, dd->defaultDropAction); draggedItems.clear(); - // for internal moves the action was set to Qt::CopyAction in - // filterDropEvent() to avoid the deletion here - if (action == Qt::MoveAction) + // delete item, unless it has already been moved internally (see filterDropEvent) + if (action == Qt::MoveAction && !dd->dropEventMoved) dd->clearOrRemove(); + dd->dropEventMoved = false; } return true; } @@ -2919,8 +2930,6 @@ bool QIconModeViewBase::filterDropEvent(QDropEvent *e) dd->stopAutoScroll(); draggedItems.clear(); dd->emitIndexesMoved(indexes); - // do not delete item on internal move, see filterStartDrag() - e->setDropAction(Qt::CopyAction); e->accept(); // we have handled the event // if the size has not grown, we need to check if it has shrinked if (contentsSize != contents) { diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index 7b1f1a1caf..057bc3ae04 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -2793,7 +2793,7 @@ void QTableWidget::dropEvent(QDropEvent *event) { event->accept(); // Don't want QAbstractItemView to delete it because it was "moved" we already did it - event->setDropAction(Qt::CopyAction); + d->dropEventMoved = true; } } diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp index 504d13d688..47b06a4138 100644 --- a/src/widgets/itemviews/qtreewidget.cpp +++ b/src/widgets/itemviews/qtreewidget.cpp @@ -3577,7 +3577,7 @@ void QTreeWidget::dropEvent(QDropEvent *event) { event->accept(); // Don't want QAbstractItemView to delete it because it was "moved" we already did it - event->setDropAction(Qt::CopyAction); + d->dropEventMoved = true; } } |