aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>2012-03-19 12:35:45 +0200
committerQt by Nokia <qt-info@nokia.com>2012-03-21 08:04:33 +0100
commit1312f4d1fefb3a7b5b8c7b720c45f542981250f3 (patch)
tree587ddb1363fcab7f954fe3af2c25b8ac2415a7e7
parent80b5612708a115613c534644053eb0d8b2cda108 (diff)
Allow flick on press-move-release in Flickable.
Right now it needs at least a press-move-move-release to start a flick which is not ideal for touchscreens because a quick, short flick may result in reporting only a single move. Change-Id: I9bf2b4fea23b0eea9d9d00f0e79ce34f4d964bea Reviewed-by: Martin Jones <martin.jones@nokia.com>
-rw-r--r--src/quick/items/qquickflickable.cpp46
-rw-r--r--tests/auto/quick/qquickflickable/tst_qquickflickable.cpp15
2 files changed, 36 insertions, 25 deletions
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp
index f0eadc0daa..62d0e4aa41 100644
--- a/src/quick/items/qquickflickable.cpp
+++ b/src/quick/items/qquickflickable.cpp
@@ -887,11 +887,11 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event)
bool stealY = stealMouse;
bool stealX = stealMouse;
- qint64 elapsed = computeCurrentTime(event) - lastPressTime;
+ qint64 elapsedSincePress = computeCurrentTime(event) - lastPressTime;
if (q->yflick()) {
qreal dy = event->localPos().y() - pressPos.y();
- if (qAbs(dy) > qApp->styleHints()->startDragDistance() || elapsed > 200) {
+ if (qAbs(dy) > qApp->styleHints()->startDragDistance() || elapsedSincePress > 200) {
if (!vMoved)
vData.dragStartOffset = dy;
qreal newY = dy + vData.pressPos - vData.dragStartOffset;
@@ -924,7 +924,7 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event)
if (q->xflick()) {
qreal dx = event->localPos().x() - pressPos.x();
- if (qAbs(dx) > qApp->styleHints()->startDragDistance() || elapsed > 200) {
+ if (qAbs(dx) > qApp->styleHints()->startDragDistance() || elapsedSincePress > 200) {
if (!hMoved)
hData.dragStartOffset = dx;
qreal newX = dx + hData.pressPos - hData.dragStartOffset;
@@ -974,28 +974,26 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event)
q->movementStarting();
}
- if (!lastPos.isNull()) {
- qint64 currentTimestamp = computeCurrentTime(event);
- qreal elapsed = qreal(currentTimestamp - lastPosTime) / 1000.;
- if (elapsed <= 0)
- return;
- lastPosTime = currentTimestamp;
- QQuickMouseEventEx *extended = QQuickMouseEventEx::extended(event);
- if (q->yflick() && !rejectY) {
- if (extended && extended->capabilities().testFlag(QTouchDevice::Velocity)) {
- vData.addVelocitySample(extended->velocity().y(), maxVelocity);
- } else {
- qreal dy = event->localPos().y()-lastPos.y();
- vData.addVelocitySample(dy/elapsed, maxVelocity);
- }
+ qint64 currentTimestamp = computeCurrentTime(event);
+ qreal elapsed = qreal(currentTimestamp - (lastPos.isNull() ? lastPressTime : lastPosTime)) / 1000.;
+ if (elapsed <= 0)
+ return;
+ lastPosTime = currentTimestamp;
+ QQuickMouseEventEx *extended = QQuickMouseEventEx::extended(event);
+ if (q->yflick() && !rejectY) {
+ if (extended && extended->capabilities().testFlag(QTouchDevice::Velocity)) {
+ vData.addVelocitySample(extended->velocity().y(), maxVelocity);
+ } else {
+ qreal dy = event->localPos().y() - (lastPos.isNull() ? pressPos.y() : lastPos.y());
+ vData.addVelocitySample(dy/elapsed, maxVelocity);
}
- if (q->xflick() && !rejectX) {
- if (extended && extended->capabilities().testFlag(QTouchDevice::Velocity)) {
- hData.addVelocitySample(extended->velocity().x(), maxVelocity);
- } else {
- qreal dx = event->localPos().x()-lastPos.x();
- hData.addVelocitySample(dx/elapsed, maxVelocity);
- }
+ }
+ if (q->xflick() && !rejectX) {
+ if (extended && extended->capabilities().testFlag(QTouchDevice::Velocity)) {
+ hData.addVelocitySample(extended->velocity().x(), maxVelocity);
+ } else {
+ qreal dx = event->localPos().x() - (lastPos.isNull() ? pressPos.x() : lastPos.x());
+ hData.addVelocitySample(dx/elapsed, maxVelocity);
}
}
diff --git a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp
index 9f5bd46864..2ed42e7f0f 100644
--- a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp
+++ b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp
@@ -441,6 +441,19 @@ void tst_qquickflickable::movingAndDragging()
// wait for any motion to end
QTRY_VERIFY(flickable->isMoving() == false);
+ // Vertical with a quick press-move-release: should cause a flick in release.
+ QSignalSpy vFlickSpy(flickable, SIGNAL(flickingVerticallyChanged()));
+
+ QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50, 90));
+ QTest::qWait(10);
+ QTest::mouseMove(canvas, QPoint(50, 40));
+ QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50, 40));
+
+ QCOMPARE(vFlickSpy.count(), 1);
+
+ // wait for any motion to end
+ QTRY_VERIFY(flickable->isMoving() == false);
+
//Horizontal
vDragSpy.clear();
hDragSpy.clear();
@@ -493,7 +506,7 @@ void tst_qquickflickable::movingAndDragging()
vMoveSpy.clear();
hMoveSpy.clear();
moveSpy.clear();
- QSignalSpy vFlickSpy(flickable, SIGNAL(flickingVerticallyChanged()));
+ vFlickSpy.clear();
QSignalSpy hFlickSpy(flickable, SIGNAL(flickingHorizontallyChanged()));
QSignalSpy flickSpy(flickable, SIGNAL(flickingChanged()));