diff options
author | Andras Becsi <andras.becsi@nokia.com> | 2011-11-29 15:24:27 +0100 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-12-20 13:36:16 +0100 |
commit | a231d3c67acca174da7066b3457f4e31a5c8e506 (patch) | |
tree | 315b6c120170f3d10be8cfa1ee83cd94122f4321 /src | |
parent | 0332e605f916ff67ce579172e857e457e8ea3e41 (diff) |
Use input event timestamps in QQuickFlickable if available.
Change-Id: If89ad205dec9ffdba4ca196cdc1a2e5fd9258260
Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/items/qquickflickable.cpp | 40 | ||||
-rw-r--r-- | src/quick/items/qquickflickable_p_p.h | 7 |
2 files changed, 32 insertions, 15 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index aca3542a92..704d1e13f5 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -174,6 +174,8 @@ QQuickFlickablePrivate::QQuickFlickablePrivate() , hMoved(false), vMoved(false) , stealMouse(false), pressed(false), interactive(true), calcVelocity(false) , pixelAligned(false) + , lastPosTime(-1) + , lastPressTime(0) , deceleration(QML_FLICK_DEFAULTDECELERATION) , maxVelocity(QML_FLICK_DEFAULTMAXVELOCITY), reportedVelocitySmoothing(100) , delayedPressEvent(0), delayedPressTarget(0), pressDelay(0), fixupDuration(400) @@ -194,7 +196,6 @@ void QQuickFlickablePrivate::init() q->setFiltersChildMouseEvents(true); QQuickItemPrivate *viewportPrivate = QQuickItemPrivate::get(contentItem); viewportPrivate->addItemChangeListener(this, QQuickItemPrivate::Geometry); - lastPosTime.invalidate(); } /* @@ -792,9 +793,18 @@ void QQuickFlickable::setPixelAligned(bool align) } } +qint64 QQuickFlickablePrivate::computeCurrentTime(QInputEvent *event) +{ + if (0 != event->timestamp() && QQuickItemPrivate::consistentTime == -1) + return event->timestamp(); + + return QQuickItemPrivate::elapsed(timer); +} + void QQuickFlickablePrivate::handleMousePressEvent(QMouseEvent *event) { Q_Q(QQuickFlickable); + QQuickItemPrivate::start(timer); if (interactive && timeline.isActive() && (qAbs(hData.smoothVelocity.value()) > RetainGrabVelocity || qAbs(vData.smoothVelocity.value()) > RetainGrabVelocity)) { @@ -813,20 +823,20 @@ void QQuickFlickablePrivate::handleMousePressEvent(QMouseEvent *event) vData.dragMaxBound = q->maxYExtent(); fixupMode = Normal; lastPos = QPointF(); - QQuickItemPrivate::start(lastPosTime); + lastPosTime = computeCurrentTime(event); pressPos = event->localPos(); hData.pressPos = hData.move.value(); vData.pressPos = vData.move.value(); hData.flicking = false; vData.flicking = false; - QQuickItemPrivate::start(pressTime); + lastPressTime = computeCurrentTime(event); QQuickItemPrivate::start(velocityTime); } void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event) { Q_Q(QQuickFlickable); - if (!interactive || !lastPosTime.isValid()) + if (!interactive || lastPosTime == -1) return; bool rejectY = false; bool rejectX = false; @@ -834,9 +844,11 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event) bool stealY = stealMouse; bool stealX = stealMouse; + qint64 elapsed = computeCurrentTime(event) - lastPressTime; + if (q->yflick()) { qreal dy = event->localPos().y() - pressPos.y(); - if (qAbs(dy) > qApp->styleHints()->startDragDistance() || QQuickItemPrivate::elapsed(pressTime) > 200) { + if (qAbs(dy) > qApp->styleHints()->startDragDistance() || elapsed > 200) { if (!vMoved) vData.dragStartOffset = dy; qreal newY = dy + vData.pressPos - vData.dragStartOffset; @@ -868,7 +880,7 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event) if (q->xflick()) { qreal dx = event->localPos().x() - pressPos.x(); - if (qAbs(dx) > qApp->styleHints()->startDragDistance() || QQuickItemPrivate::elapsed(pressTime) > 200) { + if (qAbs(dx) > qApp->styleHints()->startDragDistance() || elapsed > 200) { if (!hMoved) hData.dragStartOffset = dx; qreal newX = dx + hData.pressPos - hData.dragStartOffset; @@ -919,10 +931,11 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event) } if (!lastPos.isNull()) { - qreal elapsed = qreal(QQuickItemPrivate::elapsed(lastPosTime)) / 1000.; + qint64 currentTimestamp = computeCurrentTime(event); + qreal elapsed = qreal(currentTimestamp - lastPosTime) / 1000.; if (elapsed <= 0) return; - QQuickItemPrivate::restart(lastPosTime); + lastPosTime = currentTimestamp; qreal dy = event->localPos().y()-lastPos.y(); if (q->yflick() && !rejectY) vData.addVelocitySample(dy/elapsed, maxVelocity); @@ -942,14 +955,14 @@ void QQuickFlickablePrivate::handleMouseReleaseEvent(QMouseEvent *event) pressed = false; // if we drag then pause before release we should not cause a flick. - qint64 elapsed = QQuickItemPrivate::elapsed(lastPosTime); + qint64 elapsed = computeCurrentTime(event) - lastPosTime; vData.updateVelocity(); hData.updateVelocity(); draggingEnding(); - if (!lastPosTime.isValid()) + if (lastPosTime == -1) return; vTime = timeline.time(); @@ -1659,6 +1672,7 @@ bool QQuickFlickable::sendMouseEvent(QMouseEvent *event) QMouseEvent mouseEvent(event->type(), mapFromScene(event->windowPos()), event->windowPos(), event->screenPos(), event->button(), event->buttons(), event->modifiers()); + mouseEvent.setTimestamp(event->timestamp()); mouseEvent.setAccepted(false); switch (mouseEvent.type()) { @@ -1701,12 +1715,12 @@ bool QQuickFlickable::sendMouseEvent(QMouseEvent *event) } return stealThisEvent || d->delayedPressEvent || disabledItem; - } else if (d->lastPosTime.isValid()) { - d->lastPosTime.invalidate(); + } else if (d->lastPosTime != -1) { + d->lastPosTime = -1; returnToBounds(); } if (event->type() == QEvent::MouseButtonRelease) { - d->lastPosTime.invalidate(); + d->lastPosTime = -1; d->clearDelayedPress(); d->stealMouse = false; d->pressed = false; diff --git a/src/quick/items/qquickflickable_p_p.h b/src/quick/items/qquickflickable_p_p.h index 8ceea6162f..69fad683df 100644 --- a/src/quick/items/qquickflickable_p_p.h +++ b/src/quick/items/qquickflickable_p_p.h @@ -183,10 +183,11 @@ public: bool interactive : 1; bool calcVelocity : 1; bool pixelAligned : 1; - QElapsedTimer lastPosTime; + QElapsedTimer timer; + qint64 lastPosTime; + qint64 lastPressTime; QPointF lastPos; QPointF pressPos; - QElapsedTimer pressTime; qreal deceleration; qreal maxVelocity; QElapsedTimer velocityTime; @@ -215,6 +216,8 @@ public: void handleMouseMoveEvent(QMouseEvent *); void handleMouseReleaseEvent(QMouseEvent *); + qint64 computeCurrentTime(QInputEvent *event); + // flickableData property static void data_append(QDeclarativeListProperty<QObject> *, QObject *); static int data_count(QDeclarativeListProperty<QObject> *); |