1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the QtQuick module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:LGPL$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU Lesser General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU Lesser
19** General Public License version 3 as published by the Free Software
20** Foundation and appearing in the file LICENSE.LGPL3 included in the
21** packaging of this file. Please review the following information to
22** ensure the GNU Lesser General Public License version 3 requirements
23** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
24**
25** GNU General Public License Usage
26** Alternatively, this file may be used under the terms of the GNU
27** General Public License version 2.0 or (at your option) the GNU General
28** Public license version 3 or any later version approved by the KDE Free
29** Qt Foundation. The licenses are as published by the Free Software
30** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
31** included in the packaging of this file. Please review the following
32** information to ensure the GNU General Public License requirements will
33** be met: https://www.gnu.org/licenses/gpl-2.0.html and
34** https://www.gnu.org/licenses/gpl-3.0.html.
35**
36** $QT_END_LICENSE$
37**
38****************************************************************************/
39
40#ifndef QQUICKITEMVIEW_P_H
41#define QQUICKITEMVIEW_P_H
42
43//
44// W A R N I N G
45// -------------
46//
47// This file is not part of the Qt API. It exists purely as an
48// implementation detail. This header file may change from version to
49// version without notice, or even be removed.
50//
51// We mean it.
52//
53
54#include <QtQuick/private/qtquickglobal_p.h>
55
56QT_REQUIRE_CONFIG(quick_itemview);
57
58#include "qquickflickable_p.h"
59#include <qpointer.h>
60#include <QtCore/QLoggingCategory>
61
62QT_BEGIN_NAMESPACE
63
64Q_DECLARE_LOGGING_CATEGORY(lcItemViewDelegateLifecycle)
65
66class QQmlChangeSet;
67
68class QQuickItemViewPrivate;
69
70class Q_QUICK_PRIVATE_EXPORT QQuickItemView : public QQuickFlickable
71{
72 Q_OBJECT
73
74 Q_PROPERTY(QVariant model READ model WRITE setModel NOTIFY modelChanged)
75 Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged)
76 Q_PROPERTY(int count READ count NOTIFY countChanged)
77
78 Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged)
79 Q_PROPERTY(QQuickItem *currentItem READ currentItem NOTIFY currentItemChanged)
80
81 Q_PROPERTY(bool keyNavigationWraps READ isWrapEnabled WRITE setWrapEnabled NOTIFY keyNavigationWrapsChanged)
82 Q_PROPERTY(bool keyNavigationEnabled READ isKeyNavigationEnabled WRITE setKeyNavigationEnabled NOTIFY keyNavigationEnabledChanged REVISION 7)
83 Q_PROPERTY(int cacheBuffer READ cacheBuffer WRITE setCacheBuffer NOTIFY cacheBufferChanged)
84 Q_PROPERTY(int displayMarginBeginning READ displayMarginBeginning WRITE setDisplayMarginBeginning NOTIFY displayMarginBeginningChanged REVISION 3)
85 Q_PROPERTY(int displayMarginEnd READ displayMarginEnd WRITE setDisplayMarginEnd NOTIFY displayMarginEndChanged REVISION 3)
86
87 Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
88 Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged)
89 Q_PROPERTY(VerticalLayoutDirection verticalLayoutDirection READ verticalLayoutDirection WRITE setVerticalLayoutDirection NOTIFY verticalLayoutDirectionChanged)
90
91 Q_PROPERTY(QQmlComponent *header READ header WRITE setHeader NOTIFY headerChanged)
92 Q_PROPERTY(QQuickItem *headerItem READ headerItem NOTIFY headerItemChanged)
93 Q_PROPERTY(QQmlComponent *footer READ footer WRITE setFooter NOTIFY footerChanged)
94 Q_PROPERTY(QQuickItem *footerItem READ footerItem NOTIFY footerItemChanged)
95
96 Q_PROPERTY(QQuickTransition *populate READ populateTransition WRITE setPopulateTransition NOTIFY populateTransitionChanged)
97 Q_PROPERTY(QQuickTransition *add READ addTransition WRITE setAddTransition NOTIFY addTransitionChanged)
98 Q_PROPERTY(QQuickTransition *addDisplaced READ addDisplacedTransition WRITE setAddDisplacedTransition NOTIFY addDisplacedTransitionChanged)
99 Q_PROPERTY(QQuickTransition *move READ moveTransition WRITE setMoveTransition NOTIFY moveTransitionChanged)
100 Q_PROPERTY(QQuickTransition *moveDisplaced READ moveDisplacedTransition WRITE setMoveDisplacedTransition NOTIFY moveDisplacedTransitionChanged)
101 Q_PROPERTY(QQuickTransition *remove READ removeTransition WRITE setRemoveTransition NOTIFY removeTransitionChanged)
102 Q_PROPERTY(QQuickTransition *removeDisplaced READ removeDisplacedTransition WRITE setRemoveDisplacedTransition NOTIFY removeDisplacedTransitionChanged)
103 Q_PROPERTY(QQuickTransition *displaced READ displacedTransition WRITE setDisplacedTransition NOTIFY displacedTransitionChanged)
104
105 Q_PROPERTY(QQmlComponent *highlight READ highlight WRITE setHighlight NOTIFY highlightChanged)
106 Q_PROPERTY(QQuickItem *highlightItem READ highlightItem NOTIFY highlightItemChanged)
107 Q_PROPERTY(bool highlightFollowsCurrentItem READ highlightFollowsCurrentItem WRITE setHighlightFollowsCurrentItem NOTIFY highlightFollowsCurrentItemChanged)
108 Q_PROPERTY(HighlightRangeMode highlightRangeMode READ highlightRangeMode WRITE setHighlightRangeMode NOTIFY highlightRangeModeChanged)
109 Q_PROPERTY(qreal preferredHighlightBegin READ preferredHighlightBegin WRITE setPreferredHighlightBegin NOTIFY preferredHighlightBeginChanged RESET resetPreferredHighlightBegin)
110 Q_PROPERTY(qreal preferredHighlightEnd READ preferredHighlightEnd WRITE setPreferredHighlightEnd NOTIFY preferredHighlightEndChanged RESET resetPreferredHighlightEnd)
111 Q_PROPERTY(int highlightMoveDuration READ highlightMoveDuration WRITE setHighlightMoveDuration NOTIFY highlightMoveDurationChanged)
112
113 Q_PROPERTY(bool reuseItems READ reuseItems WRITE setReuseItems NOTIFY reuseItemsChanged REVISION 15)
114
115 QML_NAMED_ELEMENT(ItemView)
116 QML_UNCREATABLE("ItemView is an abstract base class.")
117 QML_ADDED_IN_MINOR_VERSION(1)
118
119public:
120 // this holds all layout enum values so they can be referred to by other enums
121 // to ensure consistent values - e.g. QML references to GridView.TopToBottom flow
122 // and GridView.TopToBottom vertical layout direction should have same value
123 enum LayoutDirection {
124 LeftToRight = Qt::LeftToRight,
125 RightToLeft = Qt::RightToLeft,
126 VerticalTopToBottom,
127 VerticalBottomToTop
128 };
129 Q_ENUM(LayoutDirection)
130
131 enum VerticalLayoutDirection {
132 TopToBottom = VerticalTopToBottom,
133 BottomToTop = VerticalBottomToTop
134 };
135 Q_ENUM(VerticalLayoutDirection)
136
137 QQuickItemView(QQuickFlickablePrivate &dd, QQuickItem *parent = nullptr);
138 ~QQuickItemView();
139
140 QVariant model() const;
141 void setModel(const QVariant &);
142
143 QQmlComponent *delegate() const;
144 void setDelegate(QQmlComponent *);
145
146 int count() const;
147
148 int currentIndex() const;
149 void setCurrentIndex(int idx);
150
151 QQuickItem *currentItem() const;
152
153 bool isWrapEnabled() const;
154 void setWrapEnabled(bool);
155
156 bool isKeyNavigationEnabled() const;
157 void setKeyNavigationEnabled(bool);
158
159 int cacheBuffer() const;
160 void setCacheBuffer(int);
161
162 int displayMarginBeginning() const;
163 void setDisplayMarginBeginning(int);
164
165 int displayMarginEnd() const;
166 void setDisplayMarginEnd(int);
167
168 Qt::LayoutDirection layoutDirection() const;
169 void setLayoutDirection(Qt::LayoutDirection);
170 Qt::LayoutDirection effectiveLayoutDirection() const;
171
172 VerticalLayoutDirection verticalLayoutDirection() const;
173 void setVerticalLayoutDirection(VerticalLayoutDirection layoutDirection);
174
175 QQmlComponent *footer() const;
176 void setFooter(QQmlComponent *);
177 QQuickItem *footerItem() const;
178
179 QQmlComponent *header() const;
180 void setHeader(QQmlComponent *);
181 QQuickItem *headerItem() const;
182
183 QQuickTransition *populateTransition() const;
184 void setPopulateTransition(QQuickTransition *transition);
185
186 QQuickTransition *addTransition() const;
187 void setAddTransition(QQuickTransition *transition);
188
189 QQuickTransition *addDisplacedTransition() const;
190 void setAddDisplacedTransition(QQuickTransition *transition);
191
192 QQuickTransition *moveTransition() const;
193 void setMoveTransition(QQuickTransition *transition);
194
195 QQuickTransition *moveDisplacedTransition() const;
196 void setMoveDisplacedTransition(QQuickTransition *transition);
197
198 QQuickTransition *removeTransition() const;
199 void setRemoveTransition(QQuickTransition *transition);
200
201 QQuickTransition *removeDisplacedTransition() const;
202 void setRemoveDisplacedTransition(QQuickTransition *transition);
203
204 QQuickTransition *displacedTransition() const;
205 void setDisplacedTransition(QQuickTransition *transition);
206
207 QQmlComponent *highlight() const;
208 void setHighlight(QQmlComponent *);
209
210 QQuickItem *highlightItem() const;
211
212 bool highlightFollowsCurrentItem() const;
213 virtual void setHighlightFollowsCurrentItem(bool);
214
215 enum HighlightRangeMode { NoHighlightRange, ApplyRange, StrictlyEnforceRange };
216 Q_ENUM(HighlightRangeMode)
217 HighlightRangeMode highlightRangeMode() const;
218 void setHighlightRangeMode(HighlightRangeMode mode);
219
220 qreal preferredHighlightBegin() const;
221 void setPreferredHighlightBegin(qreal);
222 void resetPreferredHighlightBegin();
223
224 qreal preferredHighlightEnd() const;
225 void setPreferredHighlightEnd(qreal);
226 void resetPreferredHighlightEnd();
227
228 int highlightMoveDuration() const;
229 virtual void setHighlightMoveDuration(int);
230
231 bool reuseItems() const;
232 void setReuseItems(bool reuse);
233
234 enum PositionMode { Beginning, Center, End, Visible, Contain, SnapPosition };
235 Q_ENUM(PositionMode)
236
237 Q_INVOKABLE void positionViewAtIndex(int index, int mode);
238 Q_INVOKABLE int indexAt(qreal x, qreal y) const;
239 Q_INVOKABLE QQuickItem *itemAt(qreal x, qreal y) const;
240 Q_REVISION(13) Q_INVOKABLE QQuickItem *itemAtIndex(int index) const;
241 Q_INVOKABLE void positionViewAtBeginning();
242 Q_INVOKABLE void positionViewAtEnd();
243 Q_REVISION(1) Q_INVOKABLE void forceLayout();
244
245 void setContentX(qreal pos) override;
246 void setContentY(qreal pos) override;
247 qreal originX() const override;
248 qreal originY() const override;
249
250Q_SIGNALS:
251 void modelChanged();
252 void delegateChanged();
253 void countChanged();
254 void currentIndexChanged();
255 void currentItemChanged();
256
257 void keyNavigationWrapsChanged();
258 Q_REVISION(7) void keyNavigationEnabledChanged();
259 void cacheBufferChanged();
260 void displayMarginBeginningChanged();
261 void displayMarginEndChanged();
262
263 void layoutDirectionChanged();
264 void effectiveLayoutDirectionChanged();
265 void verticalLayoutDirectionChanged();
266
267 void headerChanged();
268 void footerChanged();
269 void headerItemChanged();
270 void footerItemChanged();
271
272 void populateTransitionChanged();
273 void addTransitionChanged();
274 void addDisplacedTransitionChanged();
275 void moveTransitionChanged();
276 void moveDisplacedTransitionChanged();
277 void removeTransitionChanged();
278 void removeDisplacedTransitionChanged();
279 void displacedTransitionChanged();
280
281 void highlightChanged();
282 void highlightItemChanged();
283 void highlightFollowsCurrentItemChanged();
284 void highlightRangeModeChanged();
285 void preferredHighlightBeginChanged();
286 void preferredHighlightEndChanged();
287 void highlightMoveDurationChanged();
288
289 Q_REVISION(15) void reuseItemsChanged();
290
291protected:
292 void updatePolish() override;
293 void componentComplete() override;
294 void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
295 qreal minYExtent() const override;
296 qreal maxYExtent() const override;
297 qreal minXExtent() const override;
298 qreal maxXExtent() const override;
299
300protected Q_SLOTS:
301 void destroyRemoved();
302 void createdItem(int index, QObject *item);
303 virtual void initItem(int index, QObject *item);
304 void modelUpdated(const QQmlChangeSet &changeSet, bool reset);
305 void destroyingItem(QObject *item);
306 Q_REVISION(15) void onItemPooled(int modelIndex, QObject *object);
307 Q_REVISION(15) void onItemReused(int modelIndex, QObject *object);
308 void animStopped();
309 void trackedPositionChanged();
310
311private:
312 Q_DECLARE_PRIVATE(QQuickItemView)
313};
314
315
316class Q_QUICK_PRIVATE_EXPORT QQuickItemViewAttached : public QObject
317{
318 Q_OBJECT
319
320 Q_PROPERTY(QQuickItemView *view READ view NOTIFY viewChanged)
321 Q_PROPERTY(bool isCurrentItem READ isCurrentItem NOTIFY currentItemChanged)
322 Q_PROPERTY(bool delayRemove READ delayRemove WRITE setDelayRemove NOTIFY delayRemoveChanged)
323
324 Q_PROPERTY(QString section READ section NOTIFY sectionChanged)
325 Q_PROPERTY(QString previousSection READ prevSection NOTIFY prevSectionChanged)
326 Q_PROPERTY(QString nextSection READ nextSection NOTIFY nextSectionChanged)
327
328public:
329 QQuickItemViewAttached(QObject *parent)
330 : QObject(parent), m_isCurrent(false), m_delayRemove(false) {}
331 ~QQuickItemViewAttached() {}
332
333 QQuickItemView *view() const { return m_view; }
334 void setView(QQuickItemView *view) {
335 if (view != m_view) {
336 m_view = view;
337 Q_EMIT viewChanged();
338 }
339 }
340
341 bool isCurrentItem() const { return m_isCurrent; }
342 void setIsCurrentItem(bool c) {
343 if (m_isCurrent != c) {
344 m_isCurrent = c;
345 Q_EMIT currentItemChanged();
346 }
347 }
348
349 bool delayRemove() const { return m_delayRemove; }
350 void setDelayRemove(bool delay) {
351 if (m_delayRemove != delay) {
352 m_delayRemove = delay;
353 Q_EMIT delayRemoveChanged();
354 }
355 }
356
357 QString section() const { return m_section; }
358 void setSection(const QString &sect) {
359 if (m_section != sect) {
360 m_section = sect;
361 Q_EMIT sectionChanged();
362 }
363 }
364
365 QString prevSection() const { return m_prevSection; }
366 void setPrevSection(const QString &sect) {
367 if (m_prevSection != sect) {
368 m_prevSection = sect;
369 Q_EMIT prevSectionChanged();
370 }
371 }
372
373 QString nextSection() const { return m_nextSection; }
374 void setNextSection(const QString &sect) {
375 if (m_nextSection != sect) {
376 m_nextSection = sect;
377 Q_EMIT nextSectionChanged();
378 }
379 }
380
381 void setSections(const QString &prev, const QString &sect, const QString &next) {
382 bool prevChanged = prev != m_prevSection;
383 bool sectChanged = sect != m_section;
384 bool nextChanged = next != m_nextSection;
385 m_prevSection = prev;
386 m_section = sect;
387 m_nextSection = next;
388 if (prevChanged)
389 Q_EMIT prevSectionChanged();
390 if (sectChanged)
391 Q_EMIT sectionChanged();
392 if (nextChanged)
393 Q_EMIT nextSectionChanged();
394 }
395
396 void emitAdd() { Q_EMIT add(); }
397 void emitRemove() { Q_EMIT remove(); }
398
399Q_SIGNALS:
400 void viewChanged();
401 void currentItemChanged();
402 void delayRemoveChanged();
403
404 void add();
405 void remove();
406
407 void sectionChanged();
408 void prevSectionChanged();
409 void nextSectionChanged();
410
411 void pooled();
412 void reused();
413
414public:
415 QPointer<QQuickItemView> m_view;
416 bool m_isCurrent : 1;
417 bool m_delayRemove : 1;
418
419 // current only used by list view
420 mutable QString m_section;
421 QString m_prevSection;
422 QString m_nextSection;
423};
424
425
426QT_END_NAMESPACE
427
428#endif // QQUICKITEMVIEW_P_H
429
430

source code of qtdeclarative/src/quick/items/qquickitemview_p.h