From 8a80f76fd6591b0553c5e9574a5f04cd3bebb659 Mon Sep 17 00:00:00 2001 From: Michael Brasser Date: Mon, 2 Jul 2012 10:36:35 +1000 Subject: [PATCH] Improve wheel event handling. Use new angleDelta() rather than deprecated event data. Change-Id: I28d0a1ff1bc99b35e1ce3d553e5cb9bdc9362f4c Reviewed-by: Martin Jones --- src/quick/items/qquickcanvas.cpp | 9 +++++- src/quick/items/qquickcanvas_p.h | 2 + src/quick/items/qquickflickable.cpp | 31 ++++++++++++------- .../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 7e0f482..12173a3 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 1bbf36f..b93bf5a 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 3a56dd1..5a21b07 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 dc895dc..54f7d52 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); } -- 1.7.2.5