, 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)
q->setFiltersChildMouseEvents(true);
QQuickItemPrivate *viewportPrivate = QQuickItemPrivate::get(contentItem);
viewportPrivate->addItemChangeListener(this, QQuickItemPrivate::Geometry);
- lastPosTime.invalidate();
}
/*
}
}
+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)) {
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;
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;
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;
}
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);
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();
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()) {
}
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;