aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickvisualitemmodel.cpp8
-rw-r--r--tests/auto/quick/qquicklistview/data/itemlist-flicker.qml46
-rw-r--r--tests/auto/quick/qquicklistview/tst_qquicklistview.cpp50
3 files changed, 102 insertions, 2 deletions
diff --git a/src/quick/items/qquickvisualitemmodel.cpp b/src/quick/items/qquickvisualitemmodel.cpp
index 1cefcb4ce9..1cb595ec4d 100644
--- a/src/quick/items/qquickvisualitemmodel.cpp
+++ b/src/quick/items/qquickvisualitemmodel.cpp
@@ -192,8 +192,10 @@ QQuickItem *QQuickVisualItemModel::item(int index, bool)
Q_D(QQuickVisualItemModel);
QQuickVisualItemModelPrivate::Item &item = d->children[index];
item.addRef();
- emit initItem(index, item.item);
- emit createdItem(index, item.item);
+ if (item.ref == 1) {
+ emit initItem(index, item.item);
+ emit createdItem(index, item.item);
+ }
return item.item;
}
@@ -205,6 +207,8 @@ QQuickVisualModel::ReleaseFlags QQuickVisualItemModel::release(QQuickItem *item)
if (d->children[idx].deref()) {
// XXX todo - the original did item->scene()->removeItem(). Why?
item->setParentItem(0);
+ } else {
+ return QQuickVisualModel::Referenced;
}
}
return 0;
diff --git a/tests/auto/quick/qquicklistview/data/itemlist-flicker.qml b/tests/auto/quick/qquicklistview/data/itemlist-flicker.qml
new file mode 100644
index 0000000000..c0cc807bc0
--- /dev/null
+++ b/tests/auto/quick/qquicklistview/data/itemlist-flicker.qml
@@ -0,0 +1,46 @@
+// This example demonstrates placing items in a view using
+// a VisualItemModel
+
+import QtQuick 2.0
+
+Rectangle {
+ color: "lightgray"
+ width: 240
+ height: 320
+
+ VisualItemModel {
+ id: itemModel
+ objectName: "itemModel"
+ Rectangle {
+ objectName: "item1"
+ height: view.height / 3
+ width: view.width; color: "#FFFEF0"
+ Text { objectName: "text1"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+ }
+ Rectangle {
+ objectName: "item2"
+ height: view.height / 3
+ width: view.width; color: "#F0FFF7"
+ Text { objectName: "text2"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+ }
+ Rectangle {
+ objectName: "item3"
+ height: view.height / 3
+ width: view.width; color: "#F4F0FF"
+ Text { objectName: "text3"; text: "index: " + parent.VisualItemModel.index; font.bold: true; anchors.centerIn: parent }
+ }
+ }
+
+ ListView {
+ id: view
+ objectName: "view"
+ anchors.fill: parent
+ anchors.bottomMargin: 30
+ model: itemModel
+ preferredHighlightBegin: 0
+ preferredHighlightEnd: 0
+ highlightRangeMode: "StrictlyEnforceRange"
+ orientation: ListView.Vertical
+ flickDeceleration: 2000
+ }
+}
diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
index 8d4453a6e0..45337e2814 100644
--- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
+++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
@@ -126,6 +126,7 @@ private slots:
void insertBeforeVisible_data();
void swapWithFirstItem();
void itemList();
+ void itemListFlicker();
void currentIndex_delayedItemCreation();
void currentIndex_delayedItemCreation_data();
void currentIndex();
@@ -2642,6 +2643,55 @@ void tst_QQuickListView::itemList()
delete canvas;
}
+void tst_QQuickListView::itemListFlicker()
+{
+ QQuickView *canvas = createView();
+ canvas->setSource(testFileUrl("itemlist-flicker.qml"));
+ canvas->show();
+ qApp->processEvents();
+
+ QQuickListView *listview = findItem<QQuickListView>(canvas->rootObject(), "view");
+ QTRY_VERIFY(listview != 0);
+
+ QQuickItem *contentItem = listview->contentItem();
+ QTRY_VERIFY(contentItem != 0);
+
+ QQuickVisualItemModel *model = canvas->rootObject()->findChild<QQuickVisualItemModel*>("itemModel");
+ QTRY_VERIFY(model != 0);
+
+ QTRY_VERIFY(model->count() == 3);
+ QTRY_COMPARE(listview->currentIndex(), 0);
+
+ QQuickItem *item;
+
+ QVERIFY(item = findItem<QQuickItem>(contentItem, "item1"));
+ QVERIFY(item->isVisible());
+ QVERIFY(item = findItem<QQuickItem>(contentItem, "item2"));
+ QVERIFY(item->isVisible());
+ QVERIFY(item = findItem<QQuickItem>(contentItem, "item3"));
+ QVERIFY(item->isVisible());
+
+ listview->setCurrentIndex(1);
+
+ QVERIFY(item = findItem<QQuickItem>(contentItem, "item1"));
+ QVERIFY(item->isVisible());
+ QVERIFY(item = findItem<QQuickItem>(contentItem, "item2"));
+ QVERIFY(item->isVisible());
+ QVERIFY(item = findItem<QQuickItem>(contentItem, "item3"));
+ QVERIFY(item->isVisible());
+
+ listview->setCurrentIndex(2);
+
+ QVERIFY(item = findItem<QQuickItem>(contentItem, "item1"));
+ QVERIFY(item->isVisible());
+ QVERIFY(item = findItem<QQuickItem>(contentItem, "item2"));
+ QVERIFY(item->isVisible());
+ QVERIFY(item = findItem<QQuickItem>(contentItem, "item3"));
+ QVERIFY(item->isVisible());
+
+ delete canvas;
+}
+
void tst_QQuickListView::cacheBuffer()
{
QQuickView *canvas = createView();