summaryrefslogtreecommitdiffstats
path: root/src/gui/util
diff options
context:
space:
mode:
authorRalf Engels <ralf.engels@nokia.com>2010-12-20 15:47:07 (GMT)
committerRobert Griebl <robert.griebl@nokia.com>2011-01-24 13:12:30 (GMT)
commitfa845566b3733bc06454b71e33b1ff405ba32280 (patch)
treea696a0a343bb823eefd9804832564612f6c6bf07 /src/gui/util
parent43a1d0839be33754c5da78d8255e7b4c37a910e0 (diff)
downloadQt-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.cpp25
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;