Commit f079f789 authored by Martin Jones's avatar Martin Jones Committed by Qt by Nokia

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: default avatarBea Lam <bea.lam@nokia.com>
parent cbe346a9
......@@ -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);
......
......@@ -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;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment