Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qquickitemview_p_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QQUICKITEMVIEW_P_P_H
5#define QQUICKITEMVIEW_P_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtQuick/private/qtquickglobal_p.h>
19
20QT_REQUIRE_CONFIG(quick_itemview);
21
22#include "qquickitemview_p.h"
24#if QT_CONFIG(quick_viewtransitions)
26#endif
27#include "qquickflickable_p_p.h"
28#include <QtQmlModels/private/qqmlobjectmodel_p.h>
29#include <QtQmlModels/private/qqmldelegatemodel_p.h>
30#include <QtQmlModels/private/qqmlchangeset_p.h>
31
32
34
36{
37public:
39
42};
43
44
46{
47public:
49
50 bool hasPendingChanges() const;
51 void prepare(int currentIndex, int count);
52 void reset();
53
54 void applyChanges(const QQmlChangeSet &changeSet);
55
56 void applyBufferedChanges(const QQuickItemViewChangeSet &other);
57
62
63 bool active : 1;
66};
67
68
71#if QT_CONFIG(quick_viewtransitions)
73#endif
75{
76public:
77 Q_DECLARE_PUBLIC(QQuickItemView)
80
81 static inline QQuickItemViewPrivate *get(QQuickItemView *o) { return o->d_func(); }
82
83 struct ChangeResult {
90
92 : visiblePos(0), changedFirstItem(false),
93 sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0),
94 countChangeBeforeVisible(0), countChangeAfterVisibleItems(0) {}
95
97 : visiblePos(p), changedFirstItem(false),
98 sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0),
99 countChangeBeforeVisible(0), countChangeAfterVisibleItems(0) {}
100
102 if (&other == this)
103 return *this;
104 changedFirstItem &= other.changedFirstItem;
105 sizeChangesBeforeVisiblePos += other.sizeChangesBeforeVisiblePos;
106 sizeChangesAfterVisiblePos += other.sizeChangesAfterVisiblePos;
107 countChangeBeforeVisible += other.countChangeBeforeVisible;
108 countChangeAfterVisibleItems += other.countChangeAfterVisibleItems;
109 return *this;
110 }
111
112 void reset() {
113 changedFirstItem = false;
114 sizeChangesBeforeVisiblePos = 0.0;
115 sizeChangesAfterVisiblePos = 0.0;
116 countChangeBeforeVisible = 0;
117 countChangeAfterVisibleItems = 0;
118 }
119 };
120
121 enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 };
122
123 bool isValid() const;
124 qreal position() const;
125 qreal size() const;
126 qreal startPosition() const;
127 qreal endPosition() const;
128 qreal contentStartOffset() const;
129 int findLastVisibleIndex(int defaultValue = -1) const;
130 FxViewItem *visibleItem(int modelIndex) const;
131 FxViewItem *firstItemInView() const;
132 int findLastIndexInView() const;
133 int mapFromModel(int modelIndex) const;
134
135 virtual void init();
136 virtual void clear(bool onDestruction=false);
137 virtual void updateViewport();
138
139 void regenerate(bool orientationChanged=false);
140 void layout();
142 void refill();
143 void refill(qreal from, qreal to);
144 void mirrorChange() override;
145
146 FxViewItem *createItem(int modelIndex,QQmlIncubator::IncubationMode incubationMode = QQmlIncubator::AsynchronousIfNested);
147 virtual bool releaseItem(FxViewItem *item, QQmlInstanceModel::ReusableFlag reusableFlag);
148
149 QQuickItem *createHighlightItem() const;
150 QQuickItem *createComponentItem(QQmlComponent *component, qreal zValue, bool createDefault = false) const;
151 virtual void initializeComponentItem(QQuickItem *) const;
152
153 void updateCurrent(int modelIndex);
154 void updateTrackedItem();
155 void updateUnrequestedIndexes();
156 void updateUnrequestedPositions();
157 void updateVisibleIndex();
158 void positionViewAtIndex(int index, int mode);
159
160 qreal minExtentForAxis(const AxisData &axisData, bool forXAxis) const;
161 qreal maxExtentForAxis(const AxisData &axisData, bool forXAxis) const;
162 qreal calculatedMinExtent() const;
163 qreal calculatedMaxExtent() const;
164
165 void applyDelegateChange();
166
167 void applyPendingChanges();
168 bool applyModelChanges(ChangeResult *insertionResult, ChangeResult *removalResult);
169 bool applyRemovalChange(const QQmlChangeSet::Change &removal, ChangeResult *changeResult, int *removedCount);
170 void removeItem(FxViewItem *item, const QQmlChangeSet::Change &removal, ChangeResult *removeResult);
171 virtual void updateSizeChangesBeforeVisiblePos(FxViewItem *item, ChangeResult *removeResult);
172 void repositionFirstItem(FxViewItem *prevVisibleItemsFirst, qreal prevVisibleItemsFirstPos,
173 FxViewItem *prevFirstVisible, ChangeResult *insertionResult, ChangeResult *removalResult);
174
175#if QT_CONFIG(quick_viewtransitions)
176 void createTransitioner();
177 void prepareVisibleItemTransitions();
178 void prepareRemoveTransitions(QMultiHash<QQmlChangeSet::MoveKey, FxViewItem *> *removedItems);
179 bool prepareNonVisibleItemTransition(FxViewItem *item, const QRectF &viewBounds);
181#endif
182
183 int findMoveKeyIndex(QQmlChangeSet::MoveKey key, const QVector<QQmlChangeSet::Change> &changes) const;
184
185 void checkVisible() const;
186 void showVisibleItems() const;
187
189 if (layoutOrientation() == Qt::Vertical)
190 vData.markExtentsDirty();
191 else
192 hData.markExtentsDirty();
193 }
194
195 bool hasPendingChanges() const {
196 return currentChanges.hasPendingChanges()
197 || bufferedChanges.hasPendingChanges()
198#if QT_CONFIG(quick_viewtransitions)
199 ||runDelayedRemoveTransition
200#endif
201 ;
202 }
203
205 if (hasPendingChanges())
206 layout();
207 else
208 refill();
209 }
210
212 Q_Q(QQuickItemView);
213 forceLayout = true;
214 q->polish();
215 }
216
218 // make a copy and clear the visibleItems first to avoid destroyed
219 // items being accessed during the loop (QTBUG-61294)
220 const QList<FxViewItem *> oldVisible = visibleItems;
221 visibleItems.clear();
222 for (FxViewItem *item : oldVisible)
223 releaseItem(item, reusableFlag);
224 }
225
226 virtual QQuickItemViewAttached *getAttachedObject(const QObject *) const { return nullptr; }
227
237
239 qreal firstVisibleItemPosition = 0;
241 if (!visibleItems.isEmpty()) {
242 firstVisibleItemPosition = visibleItems.constFirst()->position();
243 }
244 }
254
256 std::unique_ptr<FxViewItem> highlight;
257 int highlightRange; // enum value
261
266
267 // Reusing delegate items cannot be on by default for backwards compatibility.
268 // Reusing an item will e.g mean that Component.onCompleted will only be called for an
269 // item when it's created and not when it's reused, which will break legacy applications.
271
272 struct MovedItem {
276 : item(i), moveKey(k) {}
277 };
278#if QT_CONFIG(quick_viewtransitions)
279 QQuickItemViewTransitioner *transitioner;
280 QVector<FxViewItem *> releasePendingTransition;
281#endif
282
285
286 bool ownModel : 1;
287 bool wrap : 1;
290 bool inLayout : 1;
292 bool forceLayout : 1;
299 bool inRequest : 1;
300#if QT_CONFIG(quick_viewtransitions)
301 bool runDelayedRemoveTransition : 1;
302#endif
304 bool isClearing : 1;
305
306protected:
308 virtual bool isContentFlowReversed() const = 0;
309
310 virtual qreal positionAt(int index) const = 0;
311 virtual qreal endPositionAt(int index) const = 0;
312 virtual qreal originPosition() const = 0;
313 virtual qreal lastPosition() const = 0;
314
315 virtual qreal headerSize() const = 0;
316 virtual qreal footerSize() const = 0;
317 virtual bool showHeaderForIndex(int index) const = 0;
318 virtual bool showFooterForIndex(int index) const = 0;
319 virtual void updateHeader() = 0;
320 virtual void updateFooter() = 0;
321 virtual bool hasStickyHeader() const { return false; }
322 virtual bool hasStickyFooter() const { return false; }
323
324 virtual void createHighlight(bool onDestruction = false) = 0;
325 virtual void updateHighlight() = 0;
326 virtual void resetHighlightPosition() = 0;
327 virtual bool movingFromHighlight() { return false; }
328
329 virtual void setPosition(qreal pos) = 0;
330 virtual void fixupPosition() = 0;
331
332 virtual bool addVisibleItems(qreal fillFrom, qreal fillTo, qreal bufferFrom, qreal bufferTo, bool doBuffer) = 0;
333 virtual bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo) = 0;
334 virtual void visibleItemsChanged() {}
335
337 virtual void repositionItemAt(FxViewItem *item, int index, qreal sizeBuffer) = 0;
339 virtual void resetFirstItemPosition(qreal pos = 0.0) = 0;
340 virtual void adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible) = 0;
341
342 virtual void layoutVisibleItems(int fromModelIndex = 0) = 0;
343 virtual void changedVisibleIndex(int newIndex) = 0;
344
346 QList<FxViewItem *> *newItems, QList<MovedItem> *movingIntoView) = 0;
347
348 virtual bool needsRefillForAddedOrRemovedIndex(int) const { return false; }
349#if QT_CONFIG(quick_viewtransitions)
350 virtual void translateAndTransitionItemsAfter(int afterIndex, const ChangeResult &insertionResult, const ChangeResult &removalResult) = 0;
351#endif
352
354 virtual void initializeCurrentItem() {}
355 virtual void updateSectionCriteria() {}
356 virtual void updateSections() {}
357
358 void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &) override;
359};
360
361
363
364#endif // QQUICKITEMVIEW_P_P_H
QQuickItemView * view
QQuickItemViewAttached * attached
virtual void animationFinished(QAbstractAnimationJob *)
\inmodule QtCore
Definition qhash.h:818
Definition qlist.h:74
bool isEmpty() const noexcept
Definition qlist.h:390
const T & constFirst() const noexcept
Definition qlist.h:630
void clear()
Definition qlist.h:417
\inmodule QtCore
Definition qhash.h:1348
\inmodule QtCore
Definition qobject.h:90
\inmodule QtCore
Definition qpointer.h:18
The QQmlChangeSet class stores an ordered list of notifications about changes to a linear data set.
The QQmlComponent class encapsulates a QML component definition.
IncubationMode
Specifies the mode the incubator operates in.
void itemGeometryChanged(QQuickItem *, QQuickGeometryChange, const QRectF &) override
virtual void mirrorChange()
QMultiHash< QQmlChangeSet::MoveKey, FxViewItem * > removedItems
virtual qreal originPosition() const =0
virtual void initializeCurrentItem()
virtual bool showHeaderForIndex(int index) const =0
virtual bool hasStickyFooter() const
virtual void fixupPosition()=0
virtual bool showFooterForIndex(int index) const =0
virtual void createHighlight(bool onDestruction=false)=0
virtual void repositionItemAt(FxViewItem *item, int index, qreal sizeBuffer)=0
virtual QQuickItemViewAttached * getAttachedObject(const QObject *) const
virtual void updateHeader()=0
virtual void resetHighlightPosition()=0
QPointer< QQmlInstanceModel > model
QList< FxViewItem * > visibleItems
virtual bool isContentFlowReversed() const =0
virtual void initializeViewItem(FxViewItem *)
virtual void updateFooter()=0
virtual void layoutVisibleItems(int fromModelIndex=0)=0
virtual void visibleItemsChanged()
virtual void updateHighlight()=0
QHash< QQuickItem *, int > unrequestedItems
virtual bool hasStickyHeader() const
virtual Qt::Orientation layoutOrientation() const =0
QQmlComponent * footerComponent
QQuickItemViewChangeSet currentChanges
virtual void repositionPackageItemAt(QQuickItem *item, int index)=0
virtual qreal endPositionAt(int index) const =0
virtual void resetFirstItemPosition(qreal pos=0.0)=0
virtual void updateSectionCriteria()
virtual qreal positionAt(int index) const =0
virtual void setPosition(qreal pos)=0
Qt::LayoutDirection layoutDirection
virtual void changedVisibleIndex(int newIndex)=0
QQuickItemView::VerticalLayoutDirection verticalLayoutDirection
virtual bool needsRefillForAddedOrRemovedIndex(int) const
static QQuickItemViewPrivate * get(QQuickItemView *o)
virtual bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo)=0
virtual bool movingFromHighlight()
void releaseVisibleItems(QQmlInstanceModel::ReusableFlag reusableFlag)
virtual qreal lastPosition() const =0
virtual qreal headerSize() const =0
virtual qreal footerSize() const =0
QQuickItemViewChangeSet bufferedChanges
QQmlComponent * headerComponent
virtual bool addVisibleItems(qreal fillFrom, qreal fillTo, qreal bufferFrom, qreal bufferTo, bool doBuffer)=0
QPauseAnimationJob bufferPause
virtual void adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible)=0
virtual FxViewItem * newViewItem(int index, QQuickItem *item)=0
virtual bool applyInsertionChange(const QQmlChangeSet::Change &insert, ChangeResult *changeResult, QList< FxViewItem * > *newItems, QList< MovedItem > *movingIntoView)=0
QQmlComponent * highlightComponent
std::unique_ptr< FxViewItem > highlight
virtual void viewItemTransitionFinished(QQuickItemViewTransitionableItem *item)=0
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:64
\inmodule QtCore\reentrant
Definition qrect.h:483
\inmodule QtCore
Definition qvariant.h:64
b clear()
cache insert(employee->id(), employee)
Combined button and popup list for selecting options.
LayoutDirection
Orientation
Definition qnamespace.h:97
@ Vertical
Definition qnamespace.h:99
GLenum mode
GLuint64 key
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLuint index
[2]
GLenum GLenum GLsizei count
GLboolean reset
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat p
[1]
static qreal component(const QPointF &point, unsigned int i)
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
#define Q_AUTOTEST_EXPORT
#define QT_REQUIRE_CONFIG(feature)
#define Q_QUICK_AUTOTEST_EXPORT
double qreal
Definition qtypes.h:92
QVBoxLayout * layout
QSharedPointer< T > other(t)
[5]
QGraphicsItem * item
ChangeResult(const QQmlNullableValue< qreal > &p)
QQmlNullableValue< qreal > visiblePos
ChangeResult & operator+=(const ChangeResult &other)
MovedItem(FxViewItem *i, QQmlChangeSet::MoveKey k)