diff options
author | Michael Brasser <michael.brasser@nokia.com> | 2012-07-02 10:36:35 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-07-04 10:12:10 +0200 |
commit | 8a80f76fd6591b0553c5e9574a5f04cd3bebb659 (patch) | |
tree | e70a366323d0b64722ab4d40fe2cd086a9d16dc2 | |
parent | e10706d393937ccf2c2a33920d66617bacc0e5d7 (diff) |
Improve wheel event handling.
Use new angleDelta() rather than deprecated event data.
Change-Id: I28d0a1ff1bc99b35e1ce3d553e5cb9bdc9362f4c
Reviewed-by: Martin Jones <martin.jones@nokia.com>
-rw-r--r-- | src/quick/items/qquickcanvas.cpp | 9 | ||||
-rw-r--r-- | src/quick/items/qquickcanvas_p.h | 2 | ||||
-rw-r--r-- | src/quick/items/qquickflickable.cpp | 31 | ||||
-rw-r--r-- | tests/auto/quick/qquickflickable/tst_qquickflickable.cpp | 7 |
4 files changed, 34 insertions, 15 deletions
diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp index 7e0f482ee0..12173a3e26 100644 --- a/src/quick/items/qquickcanvas.cpp +++ b/src/quick/items/qquickcanvas.cpp @@ -337,6 +337,7 @@ QQuickCanvasPrivate::QQuickCanvasPrivate() , clearBeforeRendering(true) , persistentGLContext(false) , persistentSceneGraph(false) + , lastWheelEventAccepted(false) , renderTarget(0) , renderTargetId(0) , incubationController(0) @@ -1408,10 +1409,16 @@ void QQuickCanvas::wheelEvent(QWheelEvent *event) { Q_D(QQuickCanvas); #ifdef MOUSE_DEBUG - qWarning() << "QQuickCanvas::wheelEvent()" << event->pos() << event->delta() << event->orientation(); + qWarning() << "QQuickCanvas::wheelEvent()" << event->pos() << event->pixelDelta() << event->angleDelta(); #endif + + //if the actual wheel event was accepted, accept the compatability wheel event and return early + if (d->lastWheelEventAccepted && event->angleDelta().isNull()) + return; + event->ignore(); d->deliverWheelEvent(d->rootItem, event); + d->lastWheelEventAccepted = event->isAccepted(); } #endif // QT_NO_WHEELEVENT diff --git a/src/quick/items/qquickcanvas_p.h b/src/quick/items/qquickcanvas_p.h index 1bbf36f541..b93bf5a8dc 100644 --- a/src/quick/items/qquickcanvas_p.h +++ b/src/quick/items/qquickcanvas_p.h @@ -199,6 +199,8 @@ public: uint persistentGLContext : 1; uint persistentSceneGraph : 1; + uint lastWheelEventAccepted : 1; + QOpenGLFramebufferObject *renderTarget; uint renderTargetId; QSize renderTargetSize; diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp index 3a56dd1c23..5a21b073cc 100644 --- a/src/quick/items/qquickflickable.cpp +++ b/src/quick/items/qquickflickable.cpp @@ -1238,13 +1238,18 @@ void QQuickFlickable::wheelEvent(QWheelEvent *event) Q_D(QQuickFlickable); if (!d->interactive) { QQuickItem::wheelEvent(event); - } else if (yflick() && event->orientation() == Qt::Vertical) { + return; + } + + int yDelta = event->angleDelta().y(); + int xDelta = event->angleDelta().x(); + if (yflick() && yDelta != 0) { bool valid = false; - if (event->delta() > 0 && contentY() > -minYExtent()) { - d->vData.velocity = qMax(event->delta()*2 - d->vData.smoothVelocity.value(), qreal(d->maxVelocity/4)); + if (yDelta > 0 && contentY() > -minYExtent()) { + d->vData.velocity = qMax(yDelta*2 - d->vData.smoothVelocity.value(), qreal(d->maxVelocity/4)); valid = true; - } else if (event->delta() < 0 && contentY() < -maxYExtent()) { - d->vData.velocity = qMin(event->delta()*2 - d->vData.smoothVelocity.value(), qreal(-d->maxVelocity/4)); + } else if (yDelta < 0 && contentY() < -maxYExtent()) { + d->vData.velocity = qMin(yDelta*2 - d->vData.smoothVelocity.value(), qreal(-d->maxVelocity/4)); valid = true; } if (valid) { @@ -1257,13 +1262,14 @@ void QQuickFlickable::wheelEvent(QWheelEvent *event) } event->accept(); } - } else if (xflick() && event->orientation() == Qt::Horizontal) { + } + if (xflick() && xDelta != 0) { bool valid = false; - if (event->delta() > 0 && contentX() > -minXExtent()) { - d->hData.velocity = qMax(event->delta()*2 - d->hData.smoothVelocity.value(), qreal(d->maxVelocity/4)); + if (xDelta > 0 && contentX() > -minXExtent()) { + d->hData.velocity = qMax(xDelta*2 - d->hData.smoothVelocity.value(), qreal(d->maxVelocity/4)); valid = true; - } else if (event->delta() < 0 && contentX() < -maxXExtent()) { - d->hData.velocity = qMin(event->delta()*2 - d->hData.smoothVelocity.value(), qreal(-d->maxVelocity/4)); + } else if (xDelta < 0 && contentX() < -maxXExtent()) { + d->hData.velocity = qMin(xDelta*2 - d->hData.smoothVelocity.value(), qreal(-d->maxVelocity/4)); valid = true; } if (valid) { @@ -1276,9 +1282,10 @@ void QQuickFlickable::wheelEvent(QWheelEvent *event) } event->accept(); } - } else { - QQuickItem::wheelEvent(event); } + + if (!event->isAccepted()) + QQuickItem::wheelEvent(event); } bool QQuickFlickablePrivate::isOutermostPressDelay() const diff --git a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp index dc895dc423..54f7d5210f 100644 --- a/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp +++ b/tests/auto/quick/qquickflickable/tst_qquickflickable.cpp @@ -489,7 +489,8 @@ void tst_qquickflickable::wheel() QVERIFY(flick != 0); { - QWheelEvent event(QPoint(200, 200), -120, Qt::NoButton, Qt::NoModifier, Qt::Vertical); + QPoint pos(200, 200); + QWheelEvent event(pos, canvas->mapToGlobal(pos), QPoint(), QPoint(0,-120), -120, Qt::Vertical, Qt::NoButton, Qt::NoModifier); event.setAccepted(false); QGuiApplication::sendEvent(canvas, &event); } @@ -501,7 +502,9 @@ void tst_qquickflickable::wheel() QVERIFY(flick->contentY() == 0); { - QWheelEvent event(QPoint(200, 200), -120, Qt::NoButton, Qt::NoModifier, Qt::Horizontal); + QPoint pos(200, 200); + QWheelEvent event(pos, canvas->mapToGlobal(pos), QPoint(), QPoint(-120,0), -120, Qt::Horizontal, Qt::NoButton, Qt::NoModifier); + event.setAccepted(false); QGuiApplication::sendEvent(canvas, &event); } |