aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSanthosh Kumar <santhosh.kumar.selvaraj@qt.io>2023-06-23 16:16:27 +0200
committerSanthosh Kumar <santhosh.kumar.selvaraj@qt.io>2023-06-30 10:47:17 +0200
commite034a18dfa7bc14c85d2a5641bcc0f2673199516 (patch)
tree39885bf5d170917d8956b961b9b10025c39383b9 /src
parentf4ba1178ccdf35c40870abc4467fb927b5ea61ba (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.cpp56
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 {