Improve wheel event handling.
authorMichael Brasser <michael.brasser@nokia.com>
Mon, 2 Jul 2012 00:36:35 +0000 (10:36 +1000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 4 Jul 2012 08:12:10 +0000 (10:12 +0200)
Use new angleDelta() rather than deprecated event data.

Change-Id: I28d0a1ff1bc99b35e1ce3d553e5cb9bdc9362f4c
Reviewed-by: Martin Jones <martin.jones@nokia.com>
src/quick/items/qquickcanvas.cpp
src/quick/items/qquickcanvas_p.h
src/quick/items/qquickflickable.cpp
tests/auto/quick/qquickflickable/tst_qquickflickable.cpp

index 7e0f482..12173a3 100644 (file)
@@ -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
 
index 1bbf36f..b93bf5a 100644 (file)
@@ -199,6 +199,8 @@ public:
     uint persistentGLContext : 1;
     uint persistentSceneGraph : 1;
 
+    uint lastWheelEventAccepted : 1;
+
     QOpenGLFramebufferObject *renderTarget;
     uint renderTargetId;
     QSize renderTargetSize;
index 3a56dd1..5a21b07 100644 (file)
@@ -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
index dc895dc..54f7d52 100644 (file)
@@ -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);
     }