Ensure section header/footer are cleaned up.
authorMartin Jones <martin.jones@nokia.com>
Fri, 16 Mar 2012 07:01:11 +0000 (17:01 +1000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 19 Mar 2012 09:49:05 +0000 (10:49 +0100)
If the model is cleared or replaced with an empty one,
the section headers should be released.

Change-Id: Ia2f070c312593743b2c5332a6c69facaf222ee6d
Reviewed-by: Bea Lam <bea.lam@nokia.com>
src/quick/items/qquicklistview.cpp
tests/auto/quick/qquicklistview/tst_qquicklistview.cpp

index 2590d46..9d9e3ae 100644 (file)
@@ -524,7 +524,9 @@ void QQuickListViewPrivate::clear()
         sectionCache[i] = 0;
     }
     visiblePos = 0;
+    releaseSectionItem(currentSectionItem);
     currentSectionItem = 0;
+    releaseSectionItem(nextSectionItem);
     nextSectionItem = 0;
     lastVisibleSection = QString();
     QQuickItemViewPrivate::clear();
@@ -933,6 +935,8 @@ QQuickItem * QQuickListViewPrivate::getSectionItem(const QString &section)
 
 void QQuickListViewPrivate::releaseSectionItem(QQuickItem *item)
 {
+    if (!item)
+        return;
     int i = 0;
     do {
         if (!sectionCache[i]) {
@@ -970,7 +974,7 @@ void QQuickListViewPrivate::updateInlineSection(FxListItemSG *listItem)
 
 void QQuickListViewPrivate::updateStickySections()
 {
-    if (!sectionCriteria || visibleItems.isEmpty()
+    if (!sectionCriteria
             || (!sectionCriteria->labelPositioning() && !currentSectionItem && !nextSectionItem))
         return;
 
@@ -1006,7 +1010,7 @@ void QQuickListViewPrivate::updateStickySections()
     }
 
     // Current section header
-    if (sectionCriteria->labelPositioning() & QQuickViewSection::CurrentLabelAtStart) {
+    if (sectionCriteria->labelPositioning() & QQuickViewSection::CurrentLabelAtStart && isValid() && visibleItems.count()) {
         if (!currentSectionItem) {
             currentSectionItem = getSectionItem(currentSection);
         } else if (currentStickySection != currentSection) {
@@ -1039,7 +1043,7 @@ void QQuickListViewPrivate::updateStickySections()
     }
 
     // Next section footer
-    if (sectionCriteria->labelPositioning() & QQuickViewSection::NextLabelAtEnd) {
+    if (sectionCriteria->labelPositioning() & QQuickViewSection::NextLabelAtEnd && isValid() && visibleItems.count()) {
         if (!nextSectionItem) {
             nextSectionItem = getSectionItem(nextSection);
         } else if (nextStickySection != nextSection) {
@@ -1077,7 +1081,7 @@ void QQuickListViewPrivate::updateSections()
 
     QQuickItemViewPrivate::updateSections();
 
-    if (sectionCriteria && !visibleItems.isEmpty()) {
+    if (sectionCriteria && !visibleItems.isEmpty() && isValid()) {
         QString prevSection;
         if (visibleIndex > 0)
             prevSection = sectionAt(visibleIndex-1);
index 14707ca..335fc3c 100644 (file)
@@ -2182,6 +2182,23 @@ void tst_QQuickListView::sectionsPositioning()
     QTRY_VERIFY(item = findVisibleChild(contentItem, "sect_aaa")); // inline label restored
     QCOMPARE(item->y(), 0.);
 
+    // if an empty model is set the header/footer should be cleaned up
+    canvas->rootObject()->setProperty("sectionPositioning", QVariant(int(QQuickViewSection::InlineLabels | QQuickViewSection::CurrentLabelAtStart | QQuickViewSection::NextLabelAtEnd)));
+    QTRY_VERIFY(findVisibleChild(contentItem, "sect_aaa")); // section header
+    QTRY_VERIFY(findVisibleChild(contentItem, "sect_new")); // section footer
+    QmlListModel model1;
+    ctxt->setContextProperty("testModel", &model1);
+    QTRY_VERIFY(!findVisibleChild(contentItem, "sect_aaa")); // section header
+    QTRY_VERIFY(!findVisibleChild(contentItem, "sect_new")); // section footer
+
+    // clear model - header/footer should be cleaned up
+    ctxt->setContextProperty("testModel", &model);
+    QTRY_VERIFY(findVisibleChild(contentItem, "sect_aaa")); // section header
+    QTRY_VERIFY(findVisibleChild(contentItem, "sect_new")); // section footer
+    model.clear();
+    QTRY_VERIFY(!findVisibleChild(contentItem, "sect_aaa")); // section header
+    QTRY_VERIFY(!findVisibleChild(contentItem, "sect_new")); // section footer
+
     delete canvas;
 }