From fc5314f96990148a7c32b988caf53c5db92b2b4b Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Fri, 4 Apr 2014 10:42:37 +0200 Subject: ListView: fix rounding errors Task-number: QTBUG-37339 Change-Id: I223e4d6bcabb1daa705c0ed2212e7e2b2fc3f37c Reviewed-by: Andy Shaw Reviewed-by: Alan Alpert --- .../quick/qquicklistview/tst_qquicklistview.cpp | 60 ++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'tests/auto/quick/qquicklistview/tst_qquicklistview.cpp') diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index 288c0d0a58..29755e3890 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -224,6 +224,9 @@ private slots: void QTBUG_36481(); void QTBUG_35920(); + void roundingErrors(); + void roundingErrors_data(); + private: template void items(const QUrl &source); template void changed(const QUrl &source); @@ -7201,6 +7204,63 @@ void tst_QQuickListView::QTBUG_35920() QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(10,100)); } +void tst_QQuickListView::roundingErrors() +{ + QFETCH(bool, pixelAligned); + + QScopedPointer window(createView()); + window->setSource(testFileUrl("roundingErrors.qml")); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window.data())); + + QQuickListView *listview = qobject_cast(window->rootObject()); + QVERIFY(listview); + listview->setPixelAligned(pixelAligned); + listview->positionViewAtIndex(20, QQuickListView::Beginning); + + QQuickItem *content = listview->contentItem(); + QVERIFY(content); + + const QPoint viewPos(150, 36); + const QPointF contentPos = content->mapFromItem(listview, viewPos); + + QPointer item = listview->itemAt(contentPos.x(), contentPos.y()); + QVERIFY(item); + + // QTBUG-37339: drag an item and verify that it doesn't + // get prematurely released due to rounding errors + QTest::mousePress(window.data(), Qt::LeftButton, 0, viewPos); + for (int i = 0; i < 150; i += 5) { + QTest::mouseMove(window.data(), viewPos - QPoint(i, 0)); + QVERIFY(item); + } + QTest::mouseRelease(window.data(), Qt::LeftButton, 0, QPoint(0, 36)); + + // maintain position relative to the right edge + listview->setLayoutDirection(Qt::RightToLeft); + const qreal contentX = listview->contentX(); + listview->setContentX(contentX + 0.2); + QCOMPARE(listview->contentX(), pixelAligned ? qRound(contentX + 0.2) : contentX + 0.2); + listview->setWidth(listview->width() - 0.2); + QCOMPARE(listview->contentX(), pixelAligned ? qRound(contentX + 0.2) : contentX + 0.2); + + // maintain position relative to the bottom edge + listview->setOrientation(QQuickListView::Vertical); + listview->setVerticalLayoutDirection(QQuickListView::BottomToTop); + const qreal contentY = listview->contentY(); + listview->setContentY(contentY + 0.2); + QCOMPARE(listview->contentY(), pixelAligned ? qRound(contentY + 0.2) : contentY + 0.2); + listview->setHeight(listview->height() - 0.2); + QCOMPARE(listview->contentY(), pixelAligned ? qRound(contentY + 0.2) : contentY + 0.2); +} + +void tst_QQuickListView::roundingErrors_data() +{ + QTest::addColumn("pixelAligned"); + QTest::newRow("pixelAligned=true") << true; + QTest::newRow("pixelAligned=false") << false; +} + QTEST_MAIN(tst_QQuickListView) #include "tst_qquicklistview.moc" -- cgit v1.2.3