From f079f789c593996b0023afd6318d60d18ac66578 Mon Sep 17 00:00:00 2001 From: Martin Jones Date: Fri, 16 Mar 2012 17:01:11 +1000 Subject: [PATCH] Ensure section header/footer are cleaned up. If the model is cleared or replaced with an empty one, the section headers should be released. Change-Id: Ia2f070c312593743b2c5332a6c69facaf222ee6d Reviewed-by: Bea Lam --- src/quick/items/qquicklistview.cpp | 12 ++++++++---- .../quick/qquicklistview/tst_qquicklistview.cpp | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp index 2590d4691f..9d9e3ae186 100644 --- a/src/quick/items/qquicklistview.cpp +++ b/src/quick/items/qquicklistview.cpp @@ -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 §ion) 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); diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp index 14707cab1d..335fc3c6e2 100644 --- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp +++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp @@ -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; }