on xenial help sign in
Take into account that sectionItem height can change
a51563cAlbert Astals Cid
plugins/Dash/listviewwithpageheader.cpp+18−8
@@ -700,8 +700,10 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
700
700
701void ListViewWithPageHeader::releaseItem(ListItem *listItem)
701void ListViewWithPageHeader::releaseItem(ListItem *listItem)
702{
702{
703− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
703+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
704+ if (listItem->sectionItem()) {
704− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
705+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
706+ }
705 m_itemsToRelease << listItem;
707 m_itemsToRelease << listItem;
706}
708}
707
709
@@ -768,7 +770,7 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
768 }
770 }
769 m_sectionDelegate->completeCreate();
771 m_sectionDelegate->completeCreate();
770
772
771− // TODO attach to sectionItem so we can accomodate to it changing its height
773+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
772
774
773 return sectionItem;
775 return sectionItem;
774}
776}
@@ -1126,15 +1128,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
1126 }
1128 }
1127}
1129}
1128
1130
1129−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1131+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
1130{
1132{
1131 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1133 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1132 if (heightDiff != 0) {
1134 if (heightDiff != 0) {
1133− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1135+ if (!m_visibleItems.isEmpty()) {
1134 ListItem *firstItem = m_visibleItems.first();
1136 ListItem *firstItem = m_visibleItems.first();
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()) {
1135− firstItem->setY(firstItem->y() - heightDiff);
1141+ firstItem->setY(firstItem->y() - heightDiff);
1142+ }
1143+
1144+ if (firstItem->y() != prevFirstItemY) {
1136− adjustMinYExtent();
1145+ adjustMinYExtent();
1137− layout();
1146+ layout();
1147+ }
1138 }
1148 }
1139 refill();
1149 refill();
1140 adjustMinYExtent();
1150 adjustMinYExtent();
tests/plugins/Dash/listviewwithpageheadersectiontest.cpp+15
@@ -2180,6 +2180,21 @@ private Q_SLOTS:
2180 verifyItem(2, 480., 390., false, "Agressive", false);
2180 verifyItem(2, 480., 390., false, "Agressive", false);
2181 }
2181 }
2182
2182
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+
2183private:
2198private:
2184 QQuickView *view;
2199 QQuickView *view;
2185 ListViewWithPageHeader *lvwph;
2200 ListViewWithPageHeader *lvwph;
tests/plugins/Dash/listviewwithpageheadertestsection.qml+1−1
@@ -98,7 +98,7 @@ Rectangle {
98 sectionDelegate: Component {
98 sectionDelegate: Component {
99 Rectangle {
99 Rectangle {
100 color: "green"
100 color: "green"
101− height: 40
101+ height: section != "halfheight" ? 40 : 20;
102 Text { text: section; font.pixelSize: 34 }
102 Text { text: section; font.pixelSize: 34 }
103 anchors { left: parent.left; right: parent.right }
103 anchors { left: parent.left; right: parent.right }
104 }
104 }