aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>2012-03-01 13:45:29 +0200
committerQt by Nokia <qt-info@nokia.com>2012-03-02 08:26:52 +0100
commit82a252afdd0f920357b1e543f2ee97f92c34919b (patch)
treeac9d56f277d24e915b6d6715ec8622b1dac7d7b8
parent3c42ca87fac3326bb86a8bb816de07223b7b2e9d (diff)
Use velocity from touch events only when they are valid
Add the capability flags to the extended mouse events. Otherwise it is not possible to tell if the velocity is valid. While the original version is fine if velocity is guaranteed to be available whenever QT_TRANSLATE_TOUCH_TO_MOUSE is set, some platform and driver combinations, e.g. the evdevtouch plugin that comes with Qt, do not provide velocity data in touch events. The touch-only mode of QML may be very useful in these cases too, we just need to fall back to the built-in velocity calculation. Change-Id: Iec5e7632a66380dc04c9435b09f5c173107bbe00 Reviewed-by: Martin Jones <martin.jones@nokia.com>
-rw-r--r--src/quick/items/qquickcanvas.cpp4
-rw-r--r--src/quick/items/qquickevents_p_p.h14
-rw-r--r--src/quick/items/qquickflickable.cpp17
3 files changed, 27 insertions, 8 deletions
diff --git a/src/quick/items/qquickcanvas.cpp b/src/quick/items/qquickcanvas.cpp
index 670baa8df7..f135975b3c 100644
--- a/src/quick/items/qquickcanvas.cpp
+++ b/src/quick/items/qquickcanvas.cpp
@@ -378,6 +378,7 @@ void QQuickCanvasPrivate::translateTouchToMouse(QTouchEvent *event)
QQuickMouseEventEx me = touchToMouseEvent(QEvent::MouseButtonDblClick, p);
me.setTimestamp(event->timestamp());
me.setAccepted(false);
+ me.setCapabilities(event->device()->capabilities());
if (!mouseGrabberItem) {
if (deliverInitialMousePressEvent(rootItem, &me)) {
touchMouseId = p.id();
@@ -394,6 +395,7 @@ void QQuickCanvasPrivate::translateTouchToMouse(QTouchEvent *event)
QQuickMouseEventEx me = touchToMouseEvent(QEvent::MouseButtonPress, p);
me.setTimestamp(event->timestamp());
me.setAccepted(false);
+ me.setCapabilities(event->device()->capabilities());
deliverMouseEvent(&me);
if (me.isAccepted()) {
touchMouseId = p.id();
@@ -405,6 +407,7 @@ void QQuickCanvasPrivate::translateTouchToMouse(QTouchEvent *event)
if (p.state() & Qt::TouchPointMoved) {
QQuickMouseEventEx me = touchToMouseEvent(QEvent::MouseMove, p);
me.setTimestamp(event->timestamp());
+ me.setCapabilities(event->device()->capabilities());
if (!mouseGrabberItem) {
if (lastMousePosition.isNull())
lastMousePosition = me.windowPos();
@@ -428,6 +431,7 @@ void QQuickCanvasPrivate::translateTouchToMouse(QTouchEvent *event)
return;
QQuickMouseEventEx me = touchToMouseEvent(QEvent::MouseButtonRelease, p);
me.setTimestamp(event->timestamp());
+ me.setCapabilities(event->device()->capabilities());
deliverMouseEvent(&me);
mouseGrabberItem = 0;
}
diff --git a/src/quick/items/qquickevents_p_p.h b/src/quick/items/qquickevents_p_p.h
index 1d13a19fed..7ff4835b4c 100644
--- a/src/quick/items/qquickevents_p_p.h
+++ b/src/quick/items/qquickevents_p_p.h
@@ -163,8 +163,11 @@ public:
QQuickMouseEventEx(const QMouseEvent &event)
: QMouseEvent(event)
{
- if (extended(&event))
- setVelocity(extended(&event)->velocity());
+ const QQuickMouseEventEx *eventEx = extended(&event);
+ if (eventEx) {
+ setVelocity(eventEx->velocity());
+ setCapabilities(eventEx->capabilities());
+ }
}
static const QQuickMouseEventEx *extended(const QMouseEvent *e) {
@@ -186,8 +189,15 @@ public:
}
QVector2D velocity() const { return _velocity; }
+ void setCapabilities(QTouchDevice::Capabilities caps) {
+ setExtended();
+ _capabilities = caps;
+ }
+ QTouchDevice::Capabilities capabilities() const { return _capabilities; }
+
private:
QVector2D _velocity;
+ QTouchDevice::Capabilities _capabilities;
};
diff --git a/src/quick/items/qquickflickable.cpp b/src/quick/items/qquickflickable.cpp
index 43aaf92b1a..0e8097af15 100644
--- a/src/quick/items/qquickflickable.cpp
+++ b/src/quick/items/qquickflickable.cpp
@@ -975,7 +975,7 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event)
lastPosTime = currentTimestamp;
QQuickMouseEventEx *extended = QQuickMouseEventEx::extended(event);
if (q->yflick() && !rejectY) {
- if (extended) {
+ if (extended && extended->capabilities().testFlag(QTouchDevice::Velocity)) {
vData.addVelocitySample(extended->velocity().y(), maxVelocity);
} else {
qreal dy = event->localPos().y()-lastPos.y();
@@ -983,7 +983,7 @@ void QQuickFlickablePrivate::handleMouseMoveEvent(QMouseEvent *event)
}
}
if (q->xflick() && !rejectX) {
- if (extended) {
+ if (extended && extended->capabilities().testFlag(QTouchDevice::Velocity)) {
hData.addVelocitySample(extended->velocity().x(), maxVelocity);
} else {
qreal dx = event->localPos().x()-lastPos.x();
@@ -1020,7 +1020,8 @@ void QQuickFlickablePrivate::handleMouseReleaseEvent(QMouseEvent *event)
qreal vVelocity = 0;
if (elapsed < 100 && vData.velocity != 0.) {
QQuickMouseEventEx *extended = QQuickMouseEventEx::extended(event);
- vVelocity = extended ? extended->velocity().y() : vData.velocity;
+ vVelocity = (extended && extended->capabilities().testFlag(QTouchDevice::Velocity))
+ ? extended->velocity().y() : vData.velocity;
}
if (vData.atBeginning || vData.atEnd) {
vVelocity /= 2;
@@ -1035,7 +1036,8 @@ void QQuickFlickablePrivate::handleMouseReleaseEvent(QMouseEvent *event)
qreal hVelocity = 0;
if (elapsed < 100 && hData.velocity != 0.) {
QQuickMouseEventEx *extended = QQuickMouseEventEx::extended(event);
- hVelocity = extended ? extended->velocity().x() : hData.velocity;
+ hVelocity = (extended && extended->capabilities().testFlag(QTouchDevice::Velocity))
+ ? extended->velocity().x() : hData.velocity;
}
if (hData.atBeginning || hData.atEnd) {
hVelocity /= 2;
@@ -1769,8 +1771,11 @@ bool QQuickFlickable::sendMouseEvent(QMouseEvent *event)
QQuickMouseEventEx mouseEvent(event->type(), mapFromScene(event->windowPos()),
event->windowPos(), event->screenPos(),
event->button(), event->buttons(), event->modifiers());
- if (QQuickMouseEventEx::extended(event))
- mouseEvent.setVelocity(QQuickMouseEventEx::extended(event)->velocity());
+ QQuickMouseEventEx *eventEx = QQuickMouseEventEx::extended(event);
+ if (eventEx) {
+ mouseEvent.setVelocity(eventEx->velocity());
+ mouseEvent.setCapabilities(eventEx->capabilities());
+ }
mouseEvent.setTimestamp(event->timestamp());
mouseEvent.setAccepted(false);