From 30a65658c84e9e631b55f03303e19148b391b08b Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Wed, 24 Jun 2015 15:56:09 +1000 Subject: Correctly initialize ListView section attached properties. During item insertion, indexes of items in the visibleItems list were not adjusted before new items were created. Section initialization was broken during insertion because section calculation relies on the indexes of the items in the visibleItems list. The incorrect section properties caused spurious section header creation, and layout issues. Apply the index offset before creating the new items. This mirrors what GridView already does. Change-Id: I549a81825cf0e979bc5830840bf6cb75c7a82cac Task-number: QTBUG-43873 Reviewed-by: Bea Lam --- .../quick/qquicklistview/tst_qquicklistview.cpp | 62 ++++++++++++++++++++++ 1 file changed, 62 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 3e19b005b7..c93aac456d 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -133,6 +133,7 @@ private slots: void sectionsDelegate_headerVisibility(); void sectionPropertyChange(); void sectionDelegateChange(); + void sectionsItemInsertion(); void cacheBuffer(); void positionViewAtBeginningEnd(); void positionViewAtIndex(); @@ -2540,6 +2541,67 @@ void tst_QQuickListView::sectionDelegateChange() delete window; } +// QTBUG-43873 +void tst_QQuickListView::sectionsItemInsertion() +{ + QQuickView *window = createView(); + + QaimModel model; + for (int i = 0; i < 30; i++) + model.addItem("Item" + QString::number(i), QString::number(i/5)); + + QQmlContext *ctxt = window->rootContext(); + ctxt->setContextProperty("testModel", &model); + + window->setSource(testFileUrl("listview-sections_delegate.qml")); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window)); + + QQuickListView *listview = findItem(window->rootObject(), "list"); + QTRY_VERIFY(listview != 0); + QQuickItem *contentItem = listview->contentItem(); + QTRY_VERIFY(contentItem != 0); + QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + + for (int i = 0; i < 3; ++i) { + QQuickItem *item = findItem(contentItem, "sect_" + QString::number(i)); + QVERIFY(item); + QTRY_COMPARE(item->y(), qreal(i*20*6)); + } + + QQuickItem *topItem = findVisibleChild(contentItem, "sect_0"); // section header + QVERIFY(topItem); + QCOMPARE(topItem->y(), 0.); + + // Insert a full screen of items at the beginning. + for (int i = 0; i < 10; i++) + model.insertItem(i, "Item" + QString::number(i), QLatin1String("A")); + + QTRY_COMPARE(QQuickItemPrivate::get(listview)->polishScheduled, false); + + int itemCount = findItems(contentItem, "wrapper").count(); + QVERIFY(itemCount > 10); + + // Verify that the new items are postioned correctly, and have the correct attached section properties + for (int i = 0; i < 10 && i < itemCount; ++i) { + QQuickItem *item = findItem(contentItem, "wrapper", i); + QVERIFY(item); + QTRY_COMPARE(item->y(), 20+i*20.0); + QCOMPARE(item->property("section").toString(), QLatin1String("A")); + QCOMPARE(item->property("nextSection").toString(), i < 9 ? QLatin1String("A") : QLatin1String("0")); + QCOMPARE(item->property("prevSection").toString(), i > 0 ? QLatin1String("A") : QLatin1String("")); + } + // Verify that the exiting items are postioned correctly, and have the correct attached section properties + for (int i = 10; i < 15 && i < itemCount; ++i) { + QQuickItem *item = findItem(contentItem, "wrapper", i); + QVERIFY(item); + QTRY_COMPARE(item->y(), 40+i*20.0); + QCOMPARE(item->property("section").toString(), QLatin1String("0")); + QCOMPARE(item->property("nextSection").toString(), i < 14 ? QLatin1String("0") : QLatin1String("1")); + QCOMPARE(item->property("prevSection").toString(), i > 10 ? QLatin1String("0") : QLatin1String("A")); + } +} + void tst_QQuickListView::currentIndex_delayedItemCreation() { QFETCH(bool, setCurrentToZero); -- cgit v1.2.3