diff options
author | Ralf Engels <ralf.engels@nokia.com> | 2010-12-20 15:47:07 (GMT) |
---|---|---|
committer | Robert Griebl <robert.griebl@nokia.com> | 2011-01-24 13:12:30 (GMT) |
commit | fa845566b3733bc06454b71e33b1ff405ba32280 (patch) | |
tree | a696a0a343bb823eefd9804832564612f6c6bf07 /src/gui/util | |
parent | 43a1d0839be33754c5da78d8255e7b4c37a910e0 (diff) | |
download | Qt-fa845566b3733bc06454b71e33b1ff405ba32280.zip Qt-fa845566b3733bc06454b71e33b1ff405ba32280.tar.gz Qt-fa845566b3733bc06454b71e33b1ff405ba32280.tar.bz2 |
Improve overshooting behaviour
Diffstat (limited to 'src/gui/util')
-rw-r--r-- | src/gui/util/qscroller.cpp | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/src/gui/util/qscroller.cpp b/src/gui/util/qscroller.cpp index 2ca4a6e..a9906f0 100644 --- a/src/gui/util/qscroller.cpp +++ b/src/gui/util/qscroller.cpp @@ -1253,17 +1253,6 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp qScrollerDebug() << "+++ createScrollingSegments: s:" << startPos << "maxPos:" << maxPos << "o:" << int(orientation); - // -- check if we are in overshoot - if (startPos < minPos) { - createScrollToSegments(v, sp->overshootScrollTime * 0.5, minPos, orientation, ScrollTypeOvershoot); - return; - } - - if (startPos > maxPos) { - createScrollToSegments(v, sp->overshootScrollTime * 0.5, maxPos, orientation, ScrollTypeOvershoot); - return; - } - qScrollerDebug() << "v = " << v << ", decelerationFactor = " << sp->decelerationFactor << ", curveType = " << sp->scrollingCurve.type(); // This is only correct for QEasingCurve::OutQuad (linear velocity, @@ -1299,6 +1288,20 @@ void QScrollerPrivate::createScrollingSegments(qreal v, qreal startPos, qreal pp if (nextSnap < lowerSnapPos || qIsNaN(lowerSnapPos)) lowerSnapPos = nextSnap; + // -- check if we end in overshoot + if ((startPos < minPos && endPos < minPos) || + (startPos > maxPos && endPos > maxPos)) { + qreal stopPos = endPos < minPos ? minPos : maxPos; + qreal oDistance = viewSize * sp->overshootScrollDistanceFactor * v / sp->maximumVelocity; + qreal oDeltaTime = sp->overshootScrollTime; + + if (qAbs(v) > sp->minimumVelocity) + pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.5, startPos, startPos + oDistance, sp->scrollingCurve.type(), orientation); + pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.3, startPos + oDistance, stopPos + oDistance * 0.3, QEasingCurve::InQuad, orientation); + pushSegment(ScrollTypeOvershoot, oDeltaTime * 0.2, stopPos + oDistance * 0.3, stopPos, QEasingCurve::OutQuad, orientation); + return; + } + if (qAbs(v) < sp->minimumVelocity) { qScrollerDebug() << "### below minimum Vel" << orientation; |