diff options
-rw-r--r-- | src/declarative/items/qsglistview.cpp | 2 | ||||
-rw-r--r-- | tests/auto/declarative/qsglistview/tst_qsglistview.cpp | 55 |
2 files changed, 57 insertions, 0 deletions
diff --git a/src/declarative/items/qsglistview.cpp b/src/declarative/items/qsglistview.cpp index d9792d1770..e1623390f8 100644 --- a/src/declarative/items/qsglistview.cpp +++ b/src/declarative/items/qsglistview.cpp @@ -603,6 +603,8 @@ bool QSGListViewPrivate::removeNonVisibleItems(int bufferFrom, int bufferTo) while (visibleItems.count() > 1 && (item = visibleItems.first()) && item->endPosition() <= bufferFrom) { if (item->attached->delayRemove()) break; + if (item->size() == 0) + break; // qDebug() << "refill: remove first" << visibleIndex << "top end pos" << item->endPosition(); if (item->index != -1) visibleIndex++; diff --git a/tests/auto/declarative/qsglistview/tst_qsglistview.cpp b/tests/auto/declarative/qsglistview/tst_qsglistview.cpp index f4a2384729..6f19692ad0 100644 --- a/tests/auto/declarative/qsglistview/tst_qsglistview.cpp +++ b/tests/auto/declarative/qsglistview/tst_qsglistview.cpp @@ -121,6 +121,7 @@ private slots: void sizeLessThan1(); void QTBUG_14821(); void resizeDelegate(); + void resizeFirstDelegate(); void QTBUG_16037(); void indexAt(); void incrementalModel(); @@ -2717,6 +2718,60 @@ void tst_QSGListView::resizeDelegate() delete canvas; } +void tst_QSGListView::resizeFirstDelegate() +{ + // QTBUG-20712: Content Y jumps constantly if first delegate height == 0 + // and other delegates have height > 0 + + QSGView *canvas = createView(); + canvas->show(); + + // bug only occurs when all items in the model are visible + TestModel model; + for (int i = 0; i < 10; i++) + model.addItem("Item" + QString::number(i), ""); + + QDeclarativeContext *ctxt = canvas->rootContext(); + ctxt->setContextProperty("testModel", &model); + + TestObject *testObject = new TestObject; + ctxt->setContextProperty("testObject", testObject); + + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/listviewtest.qml")); + qApp->processEvents(); + + QSGListView *listview = findItem<QSGListView>(canvas->rootObject(), "list"); + QVERIFY(listview != 0); + + QSGItem *contentItem = listview->contentItem(); + QVERIFY(contentItem != 0); + + QSGItem *item = 0; + for (int i = 0; i < model.count(); ++i) { + item = findItem<QSGItem>(contentItem, "wrapper", i); + QVERIFY(item != 0); + QCOMPARE(item->y(), i*20.0); + } + + item = findItem<QSGItem>(contentItem, "wrapper", 0); + item->setHeight(0); + + // check the content y has not jumped up and down + QCOMPARE(listview->contentY(), 0.0); + QSignalSpy spy(listview, SIGNAL(contentYChanged())); + QTest::qWait(300); + QCOMPARE(spy.count(), 0); + + for (int i = 1; i < model.count(); ++i) { + item = findItem<QSGItem>(contentItem, "wrapper", i); + QVERIFY(item != 0); + QTRY_COMPARE(item->y(), (i-1)*20.0); + } + + delete testObject; + delete canvas; +} + void tst_QSGListView::QTBUG_16037() { QSGView *canvas = createView(); |