diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2020-08-19 22:45:17 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2020-09-16 14:47:36 +0200 |
commit | 1fdbbb49d9f2d2bb62e151a29e5615031af6606a (patch) | |
tree | 7017337c0b95c5f4628945a111889ade98553d6a /tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp | |
parent | 2692237bb1b0c0f50b7cc5d920eb8ab065063d47 (diff) |
Calculate velocity in QMutEventPoint::setTimestamp() with Kalman filter
This functionality was only in Qt Quick in Qt 5. Now we move it up to QtGui
so that every QEventPoint will have a valid velocity() before being delivered
anywhere.
[ChangeLog][QtGui][QPointerEvent] Every QEventPoint should now carry a valid
velocity(): if the operating system doesn't provide it, Qt will calculate it,
using a simple Kalman filter to provide a weighted average over time.
Fixes: QTBUG-33891
Change-Id: I40352f717f0ad6edd87cf71ef55e955a591eeea1
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
Diffstat (limited to 'tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp')
-rw-r--r-- | tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp b/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp index 4a5843bb13..38e58c9cc0 100644 --- a/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp +++ b/tests/auto/gui/kernel/qtouchevent/tst_qtouchevent.cpp @@ -215,10 +215,16 @@ struct GrabberWindow : public QWindow { bool grabExclusive = false; bool grabPassive = false; + QVector2D velocity; + ulong timestamp; + ulong lastTimestamp; void touchEvent(QTouchEvent *ev) override { qCDebug(lcTests) << ev; const auto &firstPoint = ev->point(0); + velocity = firstPoint.velocity(); + timestamp = firstPoint.timestamp(); + lastTimestamp = firstPoint.lastTimestamp(); switch (ev->type()) { case QEvent::TouchBegin: { QCOMPARE(ev->exclusiveGrabber(firstPoint), nullptr); @@ -264,6 +270,7 @@ private slots: void testMultiDevice(); void grabbers_data(); void grabbers(); + void velocity(); private: QPointingDevice *touchScreenDevice; @@ -1942,6 +1949,45 @@ void tst_QTouchEvent::grabbers() QTRY_COMPARE(devPriv->activePoints.count(), 0); } +void tst_QTouchEvent::velocity() +{ + GrabberWindow w; + w.grabExclusive = true; + w.setGeometry(100, 100, 100, 100); + w.show(); + QVERIFY(QTest::qWaitForWindowExposed(&w)); + + auto devPriv = QPointingDevicePrivate::get(touchScreenDevice); + devPriv->activePoints.clear(); + QPoint pos(10, 10); + QTest::touchEvent(&w, touchScreenDevice).press(0, pos, &w); + QCOMPARE(devPriv->activePoints.count(), 1); + const auto &firstPoint = devPriv->pointById(0)->eventPoint; + qCDebug(lcTests) << "persistent active point after press" << firstPoint; + QCOMPARE(firstPoint.velocity(), QVector2D()); + + QCOMPARE(firstPoint.pressTimestamp(), firstPoint.timestamp()); + QVERIFY(firstPoint.timestamp() > 0); + QCOMPARE(firstPoint.state(), QEventPoint::State::Pressed); + + ulong timestamp = firstPoint.timestamp(); + for (int i = 1; i < 4; ++i) { + qCDebug(lcTests) << "sending touch move event" << i; + pos += {10, 10}; + QTest::touchEvent(&w, touchScreenDevice).move(0, pos, &w); + qCDebug(lcTests) << firstPoint; + QVERIFY(firstPoint.timestamp() > timestamp); + QVERIFY(w.timestamp > w.lastTimestamp); + QCOMPARE(w.timestamp, firstPoint.timestamp()); + timestamp = firstPoint.timestamp(); + QVERIFY(w.velocity.x() > 0); + QVERIFY(w.velocity.y() > 0); + } + QTest::touchEvent(&w, touchScreenDevice).release(0, pos, &w); + QVERIFY(w.velocity.x() > 0); + QVERIFY(w.velocity.y() > 0); +} + QTEST_MAIN(tst_QTouchEvent) #include "tst_qtouchevent.moc" |