17 #ifndef LISTVIEWWITHPAGEHEADER_H
18 #define LISTVIEWWITHPAGEHEADER_H
20 #include <private/qquickitemchangelistener_p.h>
21 #include <private/qquickflickable_p.h>
23 class QAbstractItemModel;
24 class QQuickNumberAnimation;
26 class QQmlDelegateModel;
49 Q_PROPERTY(QAbstractItemModel *model READ model WRITE setModel NOTIFY modelChanged)
50 Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
51 Q_PROPERTY(QQuickItem *pageHeader READ header WRITE setHeader NOTIFY headerChanged)
52 Q_PROPERTY(QQmlComponent *sectionDelegate READ sectionDelegate WRITE setSectionDelegate NOTIFY sectionDelegateChanged)
53 Q_PROPERTY(QString sectionProperty READ sectionProperty WRITE setSectionProperty NOTIFY sectionPropertyChanged)
54 Q_PROPERTY(
bool forceNoClip READ forceNoClip WRITE setForceNoClip NOTIFY forceNoClipChanged)
55 Q_PROPERTY(
int stickyHeaderHeight READ stickyHeaderHeight NOTIFY stickyHeaderHeightChanged)
57 friend class ListViewWithPageHeaderTest;
58 friend class ListViewWithPageHeaderTestSection;
59 friend class ListViewWithPageHeaderTestExternalModel;
65 QAbstractItemModel *model()
const;
66 void setModel(QAbstractItemModel *model);
68 QQmlComponent *delegate()
const;
69 void setDelegate(QQmlComponent *delegate);
71 QQuickItem *header()
const;
72 void setHeader(QQuickItem *header);
74 QQmlComponent *sectionDelegate()
const;
75 void setSectionDelegate(QQmlComponent *delegate);
77 QString sectionProperty()
const;
78 void setSectionProperty(
const QString &property);
80 bool forceNoClip()
const;
81 void setForceNoClip(
bool noClip);
83 int stickyHeaderHeight()
const;
85 Q_INVOKABLE
void positionAtBeginning();
86 Q_INVOKABLE
void showHeader();
87 Q_INVOKABLE QQuickItem *item(
int modelIndex)
const;
92 Q_INVOKABLE
bool maximizeVisibleArea(
int modelIndex);
93 Q_INVOKABLE
bool maximizeVisibleArea(
int modelIndex,
int itemHeight);
97 void delegateChanged();
99 void sectionDelegateChanged();
100 void sectionPropertyChanged();
101 void forceNoClipChanged();
102 void stickyHeaderHeightChanged();
105 void componentComplete()
override;
106 void viewportMoved(Qt::Orientations orient)
override;
107 qreal minYExtent()
const override;
108 void itemGeometryChanged(QQuickItem *item,
const QRectF &newGeometry,
const QRectF &oldGeometry)
override;
109 void itemImplicitHeightChanged(QQuickItem *item)
override;
110 void updatePolish()
override;
113 void itemCreated(
int modelIndex, QObject *
object);
114 void onContentHeightChanged();
115 void onContentWidthChanged();
116 void onHeightChanged();
117 void onModelUpdated(
const QQmlChangeSet &changeSet,
bool reset);
118 void onShowHeaderAnimationFinished();
124 qreal height()
const;
127 void setY(qreal newY);
130 void setCulled(
bool culled);
132 QQuickItem *sectionItem()
const {
return m_sectionItem; }
133 void setSectionItem(QQuickItem *sectionItem);
137 QQuickItem *m_sectionItem;
140 bool maximizeVisibleArea(ListItem *listItem,
int listItemHeight);
142 void createDelegateModel();
146 bool addVisibleItems(qreal fillFrom, qreal fillTo,
bool asynchronous);
147 bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo);
148 ListItem *createItem(
int modelIndex,
bool asynchronous);
150 void adjustHeader(qreal diff);
151 void adjustMinYExtent();
152 void updateClipItem();
153 void headerHeightChanged(qreal newHeaderHeight, qreal oldHeaderHeight, qreal oldHeaderY);
154 ListItem *itemAtIndex(
int modelIndex)
const;
155 void releaseItem(ListItem *item);
156 void reallyReleaseItem(ListItem *item);
157 void updateWatchedRoles();
158 QQuickItem *getSectionItem(
int modelIndex,
bool alreadyInserted);
159 QQuickItem *getSectionItem(
const QString §ionText);
161 QQmlDelegateModel *m_delegateModel;
164 int m_asyncRequestedIndex;
167 bool m_delegateValidated;
170 QList<ListItem *> m_visibleItems;
171 int m_firstVisibleIndex;
175 QQuickItem *m_clipItem;
179 bool m_contentHeightDirty;
181 QQuickItem *m_headerItem;
182 qreal m_previousContentY;
183 qreal m_previousHeaderImplicitHeight;
184 qreal m_headerItemShownHeight;
186 enum ContentYAnimationType { ContentYAnimationShowHeader, ContentYAnimationMaximizeVisibleArea };
187 ContentYAnimationType contentYAnimationType;
188 QQuickNumberAnimation *m_contentYAnimation;
190 QQmlComponent *m_sectionDelegate;
191 QString m_sectionProperty;
192 QQuickItem *m_topSectionItem;
196 bool m_inContentHeightKeepHeaderShown;
200 QList<ListItem *> m_itemsToRelease;