aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquicklistview.cpp21
-rw-r--r--tests/auto/quick/qquicklistview/data/sectiondelegatechange.qml61
-rw-r--r--tests/auto/quick/qquicklistview/tst_qquicklistview.cpp41
3 files changed, 123 insertions, 0 deletions
diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp
index 062cd58bbd..d67e02e8c2 100644
--- a/src/quick/items/qquicklistview.cpp
+++ b/src/quick/items/qquicklistview.cpp
@@ -113,6 +113,7 @@ public:
virtual void updateSections();
QQuickItem *getSectionItem(const QString &section);
void releaseSectionItem(QQuickItem *item);
+ void releaseSectionItems();
void updateInlineSection(FxListItemSG *);
void updateCurrentSection();
void updateStickySections();
@@ -209,6 +210,8 @@ void QQuickViewSection::setCriteria(QQuickViewSection::SectionCriteria criteria)
void QQuickViewSection::setDelegate(QQmlComponent *delegate)
{
if (delegate != m_delegate) {
+ if (m_delegate)
+ m_view->releaseSectionItems();
m_delegate = delegate;
emit delegateChanged();
m_view->updateSections();
@@ -980,6 +983,24 @@ void QQuickListViewPrivate::releaseSectionItem(QQuickItem *item)
delete item;
}
+
+void QQuickListViewPrivate::releaseSectionItems()
+{
+ for (int i = 0; i < visibleItems.count(); ++i) {
+ FxListItemSG *listItem = static_cast<FxListItemSG *>(visibleItems.at(i));
+ if (listItem->section()) {
+ qreal pos = listItem->position();
+ releaseSectionItem(listItem->section());
+ listItem->setSection(0);
+ listItem->setPosition(pos);
+ }
+ }
+ for (int i = 0; i < sectionCacheSize; ++i) {
+ delete sectionCache[i];
+ sectionCache[i] = 0;
+ }
+}
+
void QQuickListViewPrivate::updateInlineSection(FxListItemSG *listItem)
{
if (!sectionCriteria || !sectionCriteria->delegate())
diff --git a/tests/auto/quick/qquicklistview/data/sectiondelegatechange.qml b/tests/auto/quick/qquicklistview/data/sectiondelegatechange.qml
new file mode 100644
index 0000000000..eee15ed2e0
--- /dev/null
+++ b/tests/auto/quick/qquicklistview/data/sectiondelegatechange.qml
@@ -0,0 +1,61 @@
+import QtQuick 2.0
+
+ListView {
+ width: 240
+ height: 320
+
+ function switchDelegates() {
+ section.delegate = section.delegate === delegate1
+ ? delegate2
+ : delegate1
+ }
+
+ Component {
+ id: delegate1
+
+ Rectangle {
+ objectName: "section1"
+ color: "lightsteelblue"
+ border.width: 1;
+ width: 240
+ height: 25
+
+ Text {
+ anchors.centerIn: parent
+ text: section
+ }
+ }
+ }
+ Component {
+ id: delegate2
+
+ Rectangle {
+ objectName: "section2"
+ color: "yellow"
+ border.width: 1;
+ width: 240
+ height: 50
+
+ Text {
+ anchors.centerIn: parent
+ text: section
+ }
+ }
+ }
+
+ section.property: "modelData"
+ section.delegate: delegate1
+
+ model: 20
+ delegate: Rectangle {
+ objectName: "item"
+ border.width: 1
+ width: 240
+ height: 25
+
+ Text {
+ anchors.centerIn: parent
+ text: modelData
+ }
+ }
+}
diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
index c6a72306f9..848ffb10ff 100644
--- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
+++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
@@ -146,6 +146,7 @@ private slots:
void sectionsDragOutsideBounds();
void sectionsDelegate_headerVisibility();
void sectionPropertyChange();
+ void sectionDelegateChange();
void cacheBuffer();
void positionViewAtIndex();
void resetModel();
@@ -2431,6 +2432,46 @@ void tst_QQuickListView::sectionPropertyChange()
delete canvas;
}
+void tst_QQuickListView::sectionDelegateChange()
+{
+ QQuickView *canvas = createView();
+
+ canvas->setSource(testFileUrl("sectiondelegatechange.qml"));
+ canvas->show();
+ qApp->processEvents();
+
+ QQuickListView *listview = qobject_cast<QQuickListView *>(canvas->rootObject());
+ QVERIFY(listview != 0);
+
+ QQuickItem *contentItem = listview->contentItem();
+ QVERIFY(contentItem != 0);
+
+ QQUICK_VERIFY_POLISH(listview);
+
+ QVERIFY(findItems<QQuickItem>(contentItem, "section1").count() > 0);
+ QCOMPARE(findItems<QQuickItem>(contentItem, "section2").count(), 0);
+
+ for (int i = 0; i < 3; ++i) {
+ QQuickItem *item = findItem<QQuickItem>(contentItem, "item", i);
+ QTRY_VERIFY(item);
+ QTRY_COMPARE(item->y(), qreal(25. + i*50.));
+ }
+
+ QMetaObject::invokeMethod(canvas->rootObject(), "switchDelegates");
+ QQUICK_VERIFY_POLISH(listview);
+
+ QCOMPARE(findItems<QQuickItem>(contentItem, "section1").count(), 0);
+ QVERIFY(findItems<QQuickItem>(contentItem, "section2").count() > 0);
+
+ for (int i = 0; i < 3; ++i) {
+ QQuickItem *item = findItem<QQuickItem>(contentItem, "item", i);
+ QVERIFY(item);
+ QTRY_COMPARE(item->y(), qreal(50. + i*75.));
+ }
+
+ delete canvas;
+}
+
void tst_QQuickListView::currentIndex_delayedItemCreation()
{
QFETCH(bool, setCurrentToZero);