From 180c662b0790c6eceffdcb4661681d7df1541a2d Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Wed, 23 Dec 2020 22:21:08 +0100 Subject: QHeaderView: Mark the drop section during section move Currently there is no visual feedback where the section move will end up. Therefore mark the drop section to show where the dragged section will be inserted. Fixes: QTBUG-673 Fixes: QTBUG-1114 Change-Id: I3e45a9a9c0604342bb0286fc7cd4c89c757c28cd Reviewed-by: Richard Moe Gustavsen --- src/widgets/itemviews/qheaderview.cpp | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'src/widgets/itemviews/qheaderview.cpp') diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index 8ddbbd903a..e815ff53fa 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -2572,7 +2572,8 @@ void QHeaderView::mousePressEvent(QMouseEvent *e) acceptMoveSection = false; // Do not allow moving the tree nod if (acceptMoveSection) { - d->section = d->target = d->pressed; + d->target = -1; + d->section = d->pressed; if (d->section == -1) return; d->state = QHeaderViewPrivate::MoveSection; @@ -2645,6 +2646,7 @@ void QHeaderView::mouseMoveEvent(QMouseEvent *e) const int posThreshold = d->headerSectionPosition(visual) - d->offset + d->headerSectionSize(visual) / 2; const int checkPos = d->reverse() ? d->viewport->width() - pos : pos; int moving = visualIndex(d->section); + int oldTarget = d->target; if (visual < moving) { if (checkPos < posThreshold) d->target = d->logicalIndex(visual); @@ -2658,6 +2660,8 @@ void QHeaderView::mouseMoveEvent(QMouseEvent *e) } else { d->target = d->section; } + if (oldTarget != d->target || oldTarget == -1) + d->updateSectionsBeforeAfter(d->target); d->updateSectionIndicator(d->section, pos); } return; @@ -2729,6 +2733,8 @@ void QHeaderView::mouseReleaseEvent(QMouseEvent *e) moveSection(from, to); d->section = d->target = -1; d->updateSectionIndicator(d->section, pos); + if (from == to) + d->updateSectionsBeforeAfter(from); break; } // not moving Q_FALLTHROUGH(); @@ -2986,6 +2992,7 @@ void QHeaderView::initStyleOptionForIndex(QStyleOptionHeader *option, int logica opt.selectedPosition = QStyleOptionHeader::NextIsSelected; else opt.selectedPosition = QStyleOptionHeader::NotAdjacent; + opt.isSectionDragTarget = d->target == logicalIndex; } /*! @@ -4047,6 +4054,25 @@ void QHeaderViewPrivate::setScrollOffset(const QScrollBar *scrollBar, QAbstractI } } +void QHeaderViewPrivate::updateSectionsBeforeAfter(int logical) +{ + Q_Q(QHeaderView); + const int visual = visualIndex(logical); + int from = logicalIndex(visual > 1 ? visual - 1 : 0); + int to = logicalIndex(visual + 1 >= sectionCount() ? visual : visual + 1); + QRect updateRect; + if (orientation == Qt::Horizontal) { + if (reverse()) + std::swap(from, to); + updateRect = QRect(QPoint(q->sectionViewportPosition(from), 0), + QPoint(q->sectionViewportPosition(to) + headerSectionSize(to), viewport->height())); + } else { + updateRect = QRect(QPoint(0, q->sectionViewportPosition(from)), + QPoint(viewport->width(), q->sectionViewportPosition(to) + headerSectionSize(to))); + } + viewport->update(updateRect); +} + #ifndef QT_NO_DATASTREAM void QHeaderViewPrivate::write(QDataStream &out) const { -- cgit v1.2.3