on xenial help sign in
Take into account that sectionItem height can change
commita51563c9e2ecc318d79bb58c2b2cb81e37ddb41b authorAlbert Astals Cid <albert.astals@canonical.com> dateMon 29 Feb 2016, 11:47 (11 years ago) parentcab5d9c
3 files changed+34−9
plugins/Dash/listviewwithpageheader.cpp+18−8 tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+15 tests/plugins/Dash/listviewwithpageheadertestsection.qml+1−1
plugins/Dash/listviewwithpageheader.cpp+18−8
@@ -700,8 +700,10 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
700700
701701void ListViewWithPageHeader::releaseItem(ListItem *listItem)
702702{
703− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
704− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
703+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
704+ if (listItem->sectionItem()) {
705+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
706+ }
705707 m_itemsToRelease << listItem;
706708}
707709
@@ -768,7 +770,7 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
768770 }
769771 m_sectionDelegate->completeCreate();
770772
771− // TODO attach to sectionItem so we can accomodate to it changing its height
773+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
772774
773775 return sectionItem;
774776}
@@ -1126,15 +1128,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
11261128 }
11271129}
11281130
1129−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1131+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
11301132{
11311133 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
11321134 if (heightDiff != 0) {
1133− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1135+ if (!m_visibleItems.isEmpty()) {
11341136 ListItem *firstItem = m_visibleItems.first();
1135− firstItem->setY(firstItem->y() - heightDiff);
1136− adjustMinYExtent();
1137− layout();
1137+ const auto prevFirstItemY = firstItem->y();
1138+ if (item == firstItem->sectionItem()) {
1139+ firstItem->setY(firstItem->y() + heightDiff);
1140+ } else if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1141+ firstItem->setY(firstItem->y() - heightDiff);
1142+ }
1143+
1144+ if (firstItem->y() != prevFirstItemY) {
1145+ adjustMinYExtent();
1146+ layout();
1147+ }
11381148 }
11391149 refill();
11401150 adjustMinYExtent();
tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+15
@@ -2180,6 +2180,21 @@ private Q_SLOTS:
21802180 verifyItem(2, 480., 390., false, "Agressive", false);
21812181 }
21822182
2183+ void firstItemSectionHeightChange()
2184+ {
2185+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 1), Q_ARG(QVariant, 5));
2186+ model->setProperty(0, "type", "halfheight");
2187+ verifyItem(0, 50., 170., false, "halfheight", false);
2188+ }
2189+
2190+ void secondItemSectionHeightChange()
2191+ {
2192+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 2), Q_ARG(QVariant, 4));
2193+ model->setProperty(1, "type", "halfheight");
2194+ verifyItem(0, 50., 190., false, "Agressive", false);
2195+ verifyItem(1, 240., 220., false, "halfheight", false);
2196+ }
2197+
21832198private:
21842199 QQuickView *view;
21852200 ListViewWithPageHeader *lvwph;
tests/plugins/Dash/listviewwithpageheadertestsection.qml+1−1
@@ -98,7 +98,7 @@ Rectangle {
9898 sectionDelegate: Component {
9999 Rectangle {
100100 color: "green"
101− height: 40
101+ height: section != "halfheight" ? 40 : 20;
102102 Text { text: section; font.pixelSize: 34 }
103103 anchors { left: parent.left; right: parent.right }
104104 }