diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2019-09-24 10:09:12 +0200 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2019-09-25 10:12:15 +0200 |
commit | 9d9ba61a7503047e8417a52e3799f51e76067df8 (patch) | |
tree | 960007d582a4ab8c00dfaa1fc118fbe4ceece13b /src | |
parent | 188a2210348461b3060eddd5c9368759d93d40c6 (diff) |
Tumbler: fix displacement calculation when wrap is false
Use the position of the item and the currentItem in the calculation
in order to get reliable results. This fixes the displacement being
off by a small margin, which increased as the delegate height became
smaller.
Fixes: QTBUG-66799
Change-Id: Ieca5033fb4c0ed62f5965a21fcab7aa558bd40e6
Reviewed-by: Andy Shaw <andy.shaw@qt.io>
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
(cherry picked from commit d39a6d80f63414a4e933ac2f859805635850942a)
Diffstat (limited to 'src')
-rw-r--r-- | src/quicktemplates2/qquicktumbler.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/quicktemplates2/qquicktumbler.cpp b/src/quicktemplates2/qquicktumbler.cpp index 25710231..3ca3ea76 100644 --- a/src/quicktemplates2/qquicktumbler.cpp +++ b/src/quicktemplates2/qquicktumbler.cpp @@ -912,9 +912,20 @@ void QQuickTumblerAttachedPrivate::calculateDisplacement() const qreal contentY = tumblerPrivate->viewContentY; const qreal delegateH = delegateHeight(tumbler); const qreal preferredHighlightBegin = tumblerPrivate->view->property("preferredHighlightBegin").toReal(); - // Tumbler's displacement goes from negative at the top to positive towards the bottom, so we must switch this around. - const qreal reverseDisplacement = (contentY + preferredHighlightBegin) / delegateH; - displacement = reverseDisplacement - index; + const qreal itemY = qobject_cast<QQuickItem*>(parent)->y(); + qreal currentItemY = 0; + auto currentItem = tumblerPrivate->view->property("currentItem").value<QQuickItem*>(); + if (currentItem) + currentItemY = currentItem->y(); + // Start from the y position of the current item. + const qreal topOfCurrentItemInViewport = currentItemY - contentY; + // Then, calculate the distance between it and the preferredHighlightBegin. + const qreal relativePositionToPreferredHighlightBegin = topOfCurrentItemInViewport - preferredHighlightBegin; + // Next, calculate the distance between us and the current item. + const qreal distanceFromCurrentItem = currentItemY - itemY; + const qreal displacementInPixels = distanceFromCurrentItem - relativePositionToPreferredHighlightBegin; + // Convert it from pixels to a floating point index. + displacement = displacementInPixels / delegateH; } emitIfDisplacementChanged(previousDisplacement, displacement); |