aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brasser <michael.brasser@nokia.com>2012-07-02 10:36:35 +1000
committerQt by Nokia <qt-info@nokia.com>2012-07-04 10:12:10 +0200
commit8a80f76fd6591b0553c5e9574a5f04cd3bebb659 (patch)
treee70a366323d0b64722ab4d40fe2cd086a9d16dc2
parente10706d393937ccf2c2a33920d66617bacc0e5d7 (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.cpp9
-rw-r--r--src/quick/items/qquickcanvas_p.h2
-rw-r--r--src/quick/items/qquickflickable.cpp31
-rw-r--r--tests/auto/quick/qquickflickable/tst_qquickflickable.cpp7
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);
}