From b5501e9043cabcbf74d3d53b424ece5deb706a27 Mon Sep 17 00:00:00 2001 From: Richard Moe Gustavsen Date: Mon, 19 Oct 2020 23:25:22 +0200 Subject: TableView: ensure we rebuild the sync view, even when flicking on a sync view child When two table views are connect through the syncView property, both views will flick when you flick on either of them. This also means that if you fast-flick more than a page on the sync view child, the sync view needs to rebuild, like if you did the fast-flick directly on the sync view. Because we updated the sync view's viewportRect too soon while fast-flicking on the the sync child, we didn't detect that it was a fast-flick, and that a rebuild was needed. The result is that you could sometimes end up with the views getting out-of-sync. This patch will allow TableView to only move the viewport without updating the internal viewportRect while flicking. The viewportRect will instead be sync-ed at a later point, like we do when you flick on the sync view directly. This will ensure that we rebuild if needed, also while fast-flicking on the child view. Task-number: QTBUG-87821 Pick-to: 5.15 Change-Id: Ifc74473eb43406acaa8e24880066fb4ca89d3a4e Reviewed-by: Mitch Curtis --- src/quick/items/qquicktableview.cpp | 23 ++++++++++++++--------- src/quick/items/qquicktableview_p_p.h | 1 + 2 files changed, 15 insertions(+), 9 deletions(-) (limited to 'src/quick') diff --git a/src/quick/items/qquicktableview.cpp b/src/quick/items/qquicktableview.cpp index 9a0a21cccd..6f16562455 100644 --- a/src/quick/items/qquicktableview.cpp +++ b/src/quick/items/qquicktableview.cpp @@ -2096,6 +2096,8 @@ void QQuickTableViewPrivate::loadInitialTable() if (!syncVertically && rebuildOptions & RebuildOption::PositionViewAtRow) setLocalViewportY(topLeftPos.y()); + syncViewportRect(); + if (!model) { qCDebug(lcTableViewDelegateLifecycle()) << "no model found, leaving table empty"; return; @@ -2180,6 +2182,8 @@ void QQuickTableViewPrivate::adjustViewportXAccordingToAlignment() Q_TABLEVIEW_UNREACHABLE("options are checked in setter"); break; } + + syncViewportRect(); } void QQuickTableViewPrivate::adjustViewportYAccordingToAlignment() @@ -2213,6 +2217,8 @@ void QQuickTableViewPrivate::adjustViewportYAccordingToAlignment() Q_TABLEVIEW_UNREACHABLE("options are checked in setter"); break; } + + syncViewportRect(); } void QQuickTableViewPrivate::unloadEdge(Qt::Edge edge) @@ -2559,9 +2565,8 @@ void QQuickTableViewPrivate::syncWithPendingChanges() // we're e.g in the middle of e.g loading a new row. Since this will lead to // unpredicted behavior, and possibly a crash, we need to postpone taking // such assignments into effect until we're in a state that allows it. - Q_Q(QQuickTableView); - viewportRect = QRectF(q->contentX(), q->contentY(), q->width(), q->height()); + syncViewportRect(); syncModel(); syncDelegate(); syncSyncView(); @@ -2907,10 +2912,6 @@ void QQuickTableViewPrivate::setLocalViewportX(qreal contentX) return; q->setContentX(contentX); - - // Keep our own viewportRect in sync - viewportRect.moveLeft(contentX); - qCDebug(lcTableViewDelegateLifecycle) << "viewportRect adjusted to:" << viewportRect; } void QQuickTableViewPrivate::setLocalViewportY(qreal contentY) @@ -2925,10 +2926,14 @@ void QQuickTableViewPrivate::setLocalViewportY(qreal contentY) return; q->setContentY(contentY); +} - // Keep our own viewportRect in sync - viewportRect.moveTop(contentY); - qCDebug(lcTableViewDelegateLifecycle) << "viewportRect adjusted to:" << viewportRect; +void QQuickTableViewPrivate::syncViewportRect() +{ + // Sync viewportRect so that it contains the actual geometry of the viewport + Q_Q(QQuickTableView); + viewportRect = QRectF(q->contentX(), q->contentY(), q->width(), q->height()); + qCDebug(lcTableViewDelegateLifecycle) << viewportRect; } void QQuickTableViewPrivate::syncViewportPosRecursive() diff --git a/src/quick/items/qquicktableview_p_p.h b/src/quick/items/qquicktableview_p_p.h index 6a8c5fa7fa..ef408be668 100644 --- a/src/quick/items/qquicktableview_p_p.h +++ b/src/quick/items/qquicktableview_p_p.h @@ -454,6 +454,7 @@ public: void scheduleRebuildIfFastFlick(); void setLocalViewportX(qreal contentX); void setLocalViewportY(qreal contentY); + void syncViewportRect(); void syncViewportPosRecursive(); void fetchMoreData(); -- cgit v1.2.3