From ed3ed0b9db97a8fab0c03add23228b6b0a96f171 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Mon, 12 Feb 2018 16:26:38 +0100 Subject: Fix touch point positions of non-transformable QGraphicsItems TouchEvent::TouchPoint::pos was not updated in QGraphicsScenePrivate::updateTouchPointsForItem(). To prevent the transformation being calculated repeatedly for each touch point member, extract a function genericMapFromSceneTransform() from genericMapFromScene() returning the transformation and use that whereever multiple points are transformed. Add a test, extracting helper functionality from tst_QGraphicsItem::touchEventPropagation(). In addition, fold tst_QGraphicsScene::checkTouchPointsEllipseDiameters() from c48f4bde0044bd5b23af231f3639d0779ecbdb03 into this test, so that it is testing all transformations. Task-number: QTBUG-66192 Change-Id: If71886d2c14c4e216f7781ea2f22f1adc444e6cf Reviewed-by: Andy Shaw Reviewed-by: Richard Moe Gustavsen --- .../qgraphicsscene/tst_qgraphicsscene.cpp | 76 ---------------------- 1 file changed, 76 deletions(-) (limited to 'tests/auto/widgets/graphicsview/qgraphicsscene') diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp index fe8571abf1..3b340d06ab 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp @@ -254,7 +254,6 @@ private slots: void zeroScale(); void focusItemChangedSignal(); void minimumRenderSize(); - void checkTouchPointsEllipseDiameters(); // task specific tests below me void task139710_bspTreeCrash(); @@ -4765,81 +4764,6 @@ void tst_QGraphicsScene::minimumRenderSize() QVERIFY(smallChild->repaints > smallerGrandChild->repaints); } -class TouchItem : public QGraphicsRectItem -{ -public: - TouchItem() : QGraphicsRectItem(QRectF(-10, -10, 20, 20)), - seenTouch(false) - { - setAcceptTouchEvents(true); - setFlag(QGraphicsItem::ItemIgnoresTransformations); - } - bool seenTouch; - QList touchPoints; -protected: - bool sceneEvent(QEvent *event) override - { - switch (event->type()) { - case QEvent::TouchBegin: - case QEvent::TouchUpdate: - case QEvent::TouchEnd: - seenTouch = true; - touchPoints = static_cast(event)->touchPoints(); - event->accept(); - return true; - default: - break; - } - return QGraphicsRectItem::sceneEvent(event); - } -}; - -void tst_QGraphicsScene::checkTouchPointsEllipseDiameters() -{ - QGraphicsScene scene; - QGraphicsView view(&scene); - scene.setSceneRect(1, 1, 198, 198); - view.scale(1.5, 1.5); - view.setFocus(); - TouchItem *rect = new TouchItem; - scene.addItem(rect); - view.show(); - QApplication::setActiveWindow(&view); - QVERIFY(QTest::qWaitForWindowActive(&view)); - - const QSizeF ellipseDiameters(10.0, 10.0); - QTouchEvent::TouchPoint touchPoint(0); - touchPoint.setState(Qt::TouchPointPressed); - touchPoint.setPos(view.mapFromScene(rect->mapToScene(rect->boundingRect().center()))); - touchPoint.setScreenPos(view.mapToGlobal(touchPoint.pos().toPoint())); - touchPoint.setEllipseDiameters(ellipseDiameters); - - QList touchPoints = { touchPoint }; - - QTouchDevice *testDevice = QTest::createTouchDevice(QTouchDevice::TouchPad); - QTouchEvent touchEvent(QEvent::TouchBegin, - testDevice, - Qt::NoModifier, - Qt::TouchPointPressed, - touchPoints); - QApplication::sendEvent(view.viewport(), &touchEvent); - QVERIFY(rect->seenTouch); - QVERIFY(rect->touchPoints.size() == 1); - QCOMPARE(ellipseDiameters, rect->touchPoints.first().ellipseDiameters()); - - rect->seenTouch = false; - rect->touchPoints.clear(); - QTouchEvent touchUpdateEvent(QEvent::TouchUpdate, - testDevice, - Qt::NoModifier, - Qt::TouchPointMoved, - touchPoints); - QApplication::sendEvent(view.viewport(), &touchEvent); - QVERIFY(rect->seenTouch); - QVERIFY(rect->touchPoints.size() == 1); - QCOMPARE(ellipseDiameters, rect->touchPoints.first().ellipseDiameters()); -} - void tst_QGraphicsScene::taskQTBUG_15977_renderWithDeviceCoordinateCache() { QGraphicsScene scene; -- cgit v1.2.3