on xenial help sign in
Take into account that sectionItem height can change
0ed2df3Albert Astals Cid
plugins/Dash/listviewwithpageheader.cpp+22−10
@@ -285,7 +285,7 @@ void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
285
285
286 m_sectionDelegate = delegate;
286 m_sectionDelegate = delegate;
287
287
288− m_topSectionItem = getSectionItem(QString());
288+ m_topSectionItem = getSectionItem(QString(), false /*watchGeometry*/);
289 m_topSectionItem->setZ(3);
289 m_topSectionItem->setZ(3);
290 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
290 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
291 connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
291 connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
@@ -705,8 +705,10 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
705
705
706void ListViewWithPageHeader::releaseItem(ListItem *listItem)
706void ListViewWithPageHeader::releaseItem(ListItem *listItem)
707{
707{
708− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
708+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
709+ if (listItem->sectionItem()) {
709− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
710+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
711+ }
710 m_itemsToRelease << listItem;
712 m_itemsToRelease << listItem;
711}
713}
712
714
@@ -749,7 +751,7 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
749 return getSectionItem(section);
751 return getSectionItem(section);
750}
752}
751
753
752−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
754+QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText, bool watchGeometry)
753{
755{
754 QQuickItem *sectionItem = nullptr;
756 QQuickItem *sectionItem = nullptr;
755
757
@@ -773,7 +775,9 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
773 }
775 }
774 m_sectionDelegate->completeCreate();
776 m_sectionDelegate->completeCreate();
775
777
776− // TODO attach to sectionItem so we can accomodate to it changing its height
778+ if (watchGeometry) {
779+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
780+ }
777
781
778 return sectionItem;
782 return sectionItem;
779}
783}
@@ -1131,15 +1135,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
1131 }
1135 }
1132}
1136}
1133
1137
1134−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1138+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
1135{
1139{
1136 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1140 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1137 if (heightDiff != 0) {
1141 if (heightDiff != 0) {
1138− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1142+ if (!m_visibleItems.isEmpty()) {
1139 ListItem *firstItem = m_visibleItems.first();
1143 ListItem *firstItem = m_visibleItems.first();
1144+ const auto prevFirstItemY = firstItem->y();
1145+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1140− firstItem->setY(firstItem->y() - heightDiff);
1146+ firstItem->setY(firstItem->y() - heightDiff);
1147+ } else if (item == firstItem->sectionItem()) {
1148+ firstItem->setY(firstItem->y() + heightDiff);
1149+ }
1150+
1151+ if (firstItem->y() != prevFirstItemY) {
1141− adjustMinYExtent();
1152+ adjustMinYExtent();
1142− layout();
1153+ layout();
1154+ }
1143 }
1155 }
1144 refill();
1156 refill();
1145 adjustMinYExtent();
1157 adjustMinYExtent();
plugins/Dash/listviewwithpageheader.h+1−1
@@ -167,7 +167,7 @@ private:
167 void reallyReleaseItem(ListItem *item);
167 void reallyReleaseItem(ListItem *item);
168 void updateWatchedRoles();
168 void updateWatchedRoles();
169 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
170− QQuickItem *getSectionItem(const QString &sectionText);
170+ QQuickItem *getSectionItem(const QString &sectionText, bool watchGeometry = true);
171 void updateSectionItem(int modelIndex);
171 void updateSectionItem(int modelIndex);
172 void initializeValuesForEmptyList();
172 void initializeValuesForEmptyList();
173
173
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 === "" ? 0 : 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 }