diff options
author | J-P Nurmi <jpnurmi@digia.com> | 2014-04-04 10:42:37 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-04-09 00:29:23 +0200 |
commit | fc5314f96990148a7c32b988caf53c5db92b2b4b (patch) | |
tree | 2e376334b071b30072ab5aa111432cdd733f0597 /tests/auto/quick/qquicklistview | |
parent | 1674bf32c8d2b52d95dab62429bb605ca9d279cc (diff) |
ListView: fix rounding errors
Task-number: QTBUG-37339
Change-Id: I223e4d6bcabb1daa705c0ed2212e7e2b2fc3f37c
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
Reviewed-by: Alan Alpert <aalpert@blackberry.com>
Diffstat (limited to 'tests/auto/quick/qquicklistview')
-rw-r--r-- | tests/auto/quick/qquicklistview/data/roundingErrors.qml | 130 | ||||
-rw-r--r-- | tests/auto/quick/qquicklistview/tst_qquicklistview.cpp | 60 |
2 files changed, 190 insertions, 0 deletions
diff --git a/tests/auto/quick/qquicklistview/data/roundingErrors.qml b/tests/auto/quick/qquicklistview/data/roundingErrors.qml new file mode 100644 index 0000000000..aebdce04c3 --- /dev/null +++ b/tests/auto/quick/qquicklistview/data/roundingErrors.qml @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.0 +import QtQml.Models 2.1 + +ListView { + id: listview + + width: 600 + height: 200 + + spacing: 8 + orientation: ListView.Horizontal + + Component.onCompleted: { + var colors = ["blue", "green", "red", "yellow", "orange", "purple", "cyan", + "magenta", "chartreuse", "aquamarine", "indigo", "lightsteelblue", + "violet", "grey", "springgreen", "salmon", "blanchedalmond", + "forestgreen", "pink", "navy", "goldenrod", "crimson", "teal" ] + for (var i = 0; i < 100; ++i) + colorModel.append( { nid: i, color: colors[i%colors.length] } ) + } + + model: DelegateModel { + id: visualModel + + model: ListModel { + id: colorModel + } + + delegate: MouseArea { + id: delegateRoot + objectName: model.nid + + width: 107.35 + height: 63.35 + + drag.target: icon + + Rectangle{ + id: icon + width: delegateRoot.width + height: delegateRoot.height + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + color: model.color + + Drag.active: delegateRoot.drag.active + Drag.source: delegateRoot + Drag.hotSpot.x: 36 + Drag.hotSpot.y: 36 + + Text { + id: text + anchors.fill: parent + font.pointSize: 40 + text: model.nid + horizontalAlignment: Qt.AlignHCenter + verticalAlignment: Qt.AlignVCenter + } + + states: [ + State { + when: icon.Drag.active + ParentChange { + target: icon + parent: delegateRoot.ListView.view + } + + AnchorChanges { + target: icon + anchors.horizontalCenter: undefined + anchors.verticalCenter: undefined + } + } + ] + } + } + } + + DropArea { + anchors.fill: parent + onPositionChanged: { + var to = listview.indexAt(drag.x + listview.contentX, 0) + if (to !== -1) { + var from = drag.source.DelegateModel.itemsIndex + if (from !== to) + visualModel.items.move(from, to) + drag.accept() + } + } + } +} 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 <class T> void items(const QUrl &source); template <class T> 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<QQuickView> window(createView()); + window->setSource(testFileUrl("roundingErrors.qml")); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window.data())); + + QQuickListView *listview = qobject_cast<QQuickListView *>(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<QQuickItem> 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<bool>("pixelAligned"); + QTest::newRow("pixelAligned=true") << true; + QTest::newRow("pixelAligned=false") << false; +} + QTEST_MAIN(tst_QQuickListView) #include "tst_qquicklistview.moc" |