on xenial help sign in
Merge sectionDelegateResizes
82a456dAlbert Astals Cid
plugins/Dash/listviewwithpageheader.cpp+22−10
@@ -286,7 +286,7 @@ void ListViewWithPageHeader::setSectionDelegate(QQmlComponent *delegate)
286
286
287 m_sectionDelegate = delegate;
287 m_sectionDelegate = delegate;
288
288
289− m_topSectionItem = getSectionItem(QString());
289+ m_topSectionItem = getSectionItem(QString(), false /*watchGeometry*/);
290 m_topSectionItem->setZ(3);
290 m_topSectionItem->setZ(3);
291 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
291 QQuickItemPrivate::get(m_topSectionItem)->setCulled(true);
292 connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
292 connect(m_topSectionItem, &QQuickItem::heightChanged, this, &ListViewWithPageHeader::stickyHeaderHeightChanged);
@@ -701,8 +701,10 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
701
701
702void ListViewWithPageHeader::releaseItem(ListItem *listItem)
702void ListViewWithPageHeader::releaseItem(ListItem *listItem)
703{
703{
704− QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(listItem->m_item);
704+ QQuickItemPrivate::get(listItem->m_item)->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
705+ if (listItem->sectionItem()) {
705− itemPrivate->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
706+ QQuickItemPrivate::get(listItem->sectionItem())->removeItemChangeListener(this, QQuickItemPrivate::Geometry);
707+ }
706 m_itemsToRelease << listItem;
708 m_itemsToRelease << listItem;
707}
709}
708
710
@@ -745,7 +747,7 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
745 return getSectionItem(section);
747 return getSectionItem(section);
746}
748}
747
749
748−QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
750+QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText, bool watchGeometry)
749{
751{
750 QQuickItem *sectionItem = nullptr;
752 QQuickItem *sectionItem = nullptr;
751
753
@@ -769,7 +771,9 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(const QString &sectionText)
769 }
771 }
770 m_sectionDelegate->completeCreate();
772 m_sectionDelegate->completeCreate();
771
773
772− // TODO attach to sectionItem so we can accomodate to it changing its height
774+ if (watchGeometry) {
775+ QQuickItemPrivate::get(sectionItem)->addItemChangeListener(this, QQuickItemPrivate::Geometry);
776+ }
773
777
774 return sectionItem;
778 return sectionItem;
775}
779}
@@ -1125,15 +1129,23 @@ void ListViewWithPageHeader::contentYAnimationRunningChanged(bool running)
1125 }
1129 }
1126}
1130}
1127
1131
1128−void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QRectF &newGeometry, const QRectF &oldGeometry)
1132+void ListViewWithPageHeader::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry)
1129{
1133{
1130 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1134 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1131 if (heightDiff != 0) {
1135 if (heightDiff != 0) {
1132− if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1136+ if (!m_visibleItems.isEmpty()) {
1133 ListItem *firstItem = m_visibleItems.first();
1137 ListItem *firstItem = m_visibleItems.first();
1138+ const auto prevFirstItemY = firstItem->y();
1139+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY()) {
1134− firstItem->setY(firstItem->y() - heightDiff);
1140+ firstItem->setY(firstItem->y() - heightDiff);
1141+ } else if (item == firstItem->sectionItem()) {
1142+ firstItem->setY(firstItem->y() + heightDiff);
1143+ }
1144+
1145+ if (firstItem->y() != prevFirstItemY) {
1135− adjustMinYExtent();
1146+ adjustMinYExtent();
1136− layout();
1147+ layout();
1148+ }
1137 }
1149 }
1138 refill();
1150 refill();
1139 adjustMinYExtent();
1151 adjustMinYExtent();
plugins/Dash/listviewwithpageheader.h+1−1
@@ -166,7 +166,7 @@ private:
166 void reallyReleaseItem(ListItem *item);
166 void reallyReleaseItem(ListItem *item);
167 void updateWatchedRoles();
167 void updateWatchedRoles();
168 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
168 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169− QQuickItem *getSectionItem(const QString &sectionText);
169+ QQuickItem *getSectionItem(const QString &sectionText, bool watchGeometry = true);
170 void updateSectionItem(int modelIndex);
170 void updateSectionItem(int modelIndex);
171 void initializeValuesForEmptyList();
171 void initializeValuesForEmptyList();
172
172
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
@@ -99,7 +99,7 @@ Rectangle {
99 Rectangle {
99 Rectangle {
100 property alias text: theText.text
100 property alias text: theText.text
101 color: "green"
101 color: "green"
102− height: 40
102+ height: section === "" ? 0 : section != "halfheight" ? 40 : 20;
103 Text { id: theText; font.pixelSize: 34 }
103 Text { id: theText; font.pixelSize: 34 }
104 anchors { left: parent.left; right: parent.right }
104 anchors { left: parent.left; right: parent.right }
105 }
105 }