diff options
| author | Santhosh Kumar <santhosh.kumar.selvaraj@qt.io> | 2023-06-23 16:16:27 +0200 |
|---|---|---|
| committer | Santhosh Kumar <santhosh.kumar.selvaraj@qt.io> | 2023-06-30 10:47:17 +0200 |
| commit | e034a18dfa7bc14c85d2a5641bcc0f2673199516 (patch) | |
| tree | 39885bf5d170917d8956b961b9b10025c39383b9 /src | |
| parent | f4ba1178ccdf35c40870abc4467fb927b5ea61ba (diff) | |
Fix stop bound behavior in Flickable during mouse wheel event
The patch set b1766d9d629f61d824146e69f1f3b319cbee3d11 modifies
flickable behavior during mouse wheel event but bound behavior not been
considered.
This patchset fixes stop bound behavior of Flickable during mouse wheel
event by considering extents.
Fixes: QTBUG-114607
Pick-to: 6.6
Change-Id: Ic1f1eba9a6fa8b968cc4b673eb08bb157bbfbd3b
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
Diffstat (limited to 'src')
| -rw-r--r-- | src/quick/items/qquickflickable.cpp | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 5427cff7e4..9f461b46c1 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -1659,29 +1659,63 @@ void QQuickFlickable::wheelEvent(QWheelEvent *event) // no pixel delta (physical mouse wheel, or "dumb" touchpad), so use angleDelta int xDelta = event->angleDelta().x(); int yDelta = event->angleDelta().y(); - qreal wheelScroll = - qApp->styleHints()->wheelScrollLines() * 24; if (d->wheelDeceleration > _q_MaximumWheelDeceleration) { + const qreal wheelScroll = -qApp->styleHints()->wheelScrollLines() * 24; // If wheelDeceleration is very large, i.e. the user or the platform does not want to have any mouse wheel // acceleration behavior, we want to move a distance proportional to QStyleHints::wheelScrollLines() if (yflick() && yDelta != 0) { d->moveReason = QQuickFlickablePrivate::Mouse; // ItemViews will set fixupMode to Immediate in fixup() without this. - d->resetTimeline(d->vData); d->vMoved = true; - movementStarting(); - d->timeline.moveBy(d->vData.move, -yDelta / 120.0 * wheelScroll, QEasingCurve(QEasingCurve::OutExpo), 3*d->fixupDuration/4); - d->vData.fixingUp = true; - d->timeline.callback(QQuickTimeLineCallback(&d->vData.move, QQuickFlickablePrivate::fixupY_callback, d)); + qreal scrollPixel = (-yDelta / 120.0 * wheelScroll); + if (d->boundsBehavior == QQuickFlickable::StopAtBounds) { + const qreal estContentPos = scrollPixel + d->vData.move.value(); + if (scrollPixel > 0) { // Forward direction (away from user) + if (d->vData.move.value() >= minYExtent()) + d->vMoved = false; + else if (estContentPos > minYExtent()) + scrollPixel = minYExtent() - d->vData.move.value(); + } else { // Backward direction (towards user) + if (d->vData.move.value() <= maxYExtent()) + d->vMoved = false; + else if (estContentPos < maxYExtent()) + scrollPixel = maxYExtent() - d->vData.move.value(); + } + } + if (d->vMoved) { + d->resetTimeline(d->vData); + movementStarting(); + d->timeline.moveBy(d->vData.move, scrollPixel, QEasingCurve(QEasingCurve::OutExpo), 3*d->fixupDuration/4); + d->vData.fixingUp = true; + d->timeline.callback(QQuickTimeLineCallback(&d->vData.move, QQuickFlickablePrivate::fixupY_callback, d)); + } event->accept(); } if (xflick() && xDelta != 0) { d->moveReason = QQuickFlickablePrivate::Mouse; // ItemViews will set fixupMode to Immediate in fixup() without this. - d->resetTimeline(d->hData); d->hMoved = true; - movementStarting(); - d->timeline.moveBy(d->hData.move, -xDelta / 120.0 * wheelScroll, QEasingCurve(QEasingCurve::OutExpo), 3*d->fixupDuration/4); - d->hData.fixingUp = true; - d->timeline.callback(QQuickTimeLineCallback(&d->hData.move, QQuickFlickablePrivate::fixupX_callback, d)); + qreal scrollPixel = (-xDelta / 120.0 * wheelScroll); + if (d->boundsBehavior == QQuickFlickable::StopAtBounds) { + const qreal estContentPos = scrollPixel + d->hData.move.value(); + if (scrollPixel > 0) { // Forward direction (away from user) + if (d->hData.move.value() >= minXExtent()) + d->hMoved = false; + else if (estContentPos > minXExtent()) + scrollPixel = minXExtent() - d->hData.move.value(); + } else { // Backward direction (towards user) + if (d->hData.move.value() <= maxXExtent()) + d->hMoved = false; + else if (estContentPos < maxXExtent()) + scrollPixel = maxXExtent() - d->hData.move.value(); + } + } + if (d->hMoved) { + d->resetTimeline(d->hData); + movementStarting(); + d->timeline.moveBy(d->hData.move, scrollPixel, QEasingCurve(QEasingCurve::OutExpo), 3*d->fixupDuration/4); + d->hData.fixingUp = true; + d->timeline.callback(QQuickTimeLineCallback(&d->hData.move, QQuickFlickablePrivate::fixupX_callback, d)); + } event->accept(); } } else { |
