Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
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#include <QtCore/qpointer.h>
33
35
44
45
47{
48public:
50
51 bool hasPendingChanges() const;
52 void prepare(int currentIndex, int count);
53 void reset();
54
55 void applyChanges(const QQmlChangeSet &changeSet);
56
57 void applyBufferedChanges(const QQuickItemViewChangeSet &other);
58
62 QMultiHash<QQmlChangeSet::MoveKey, FxViewItem *> removedItems;
63
64 bool active : 1;
67};
68
69
72#if QT_CONFIG(quick_viewtransitions)
74#endif
76{
77public:
78 Q_DECLARE_PUBLIC(QQuickItemView)
81
82 static inline QQuickItemViewPrivate *get(QQuickItemView *o) { return o->d_func(); }
83
84 struct ChangeResult {
85 QQmlNullableValue<qreal> visiblePos;
91
93 : visiblePos(0), changedFirstItem(false),
94 sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0),
95 countChangeBeforeVisible(0), countChangeAfterVisibleItems(0) {}
96
97 ChangeResult(const QQmlNullableValue<qreal> &p)
98 : visiblePos(p), changedFirstItem(false),
99 sizeChangesBeforeVisiblePos(0), sizeChangesAfterVisiblePos(0),
100 countChangeBeforeVisible(0), countChangeAfterVisibleItems(0) {}
101
103 if (&other == this)
104 return *this;
105 changedFirstItem &= other.changedFirstItem;
106 sizeChangesBeforeVisiblePos += other.sizeChangesBeforeVisiblePos;
107 sizeChangesAfterVisiblePos += other.sizeChangesAfterVisiblePos;
108 countChangeBeforeVisible += other.countChangeBeforeVisible;
109 countChangeAfterVisibleItems += other.countChangeAfterVisibleItems;
110 return *this;
111 }
112
113 void reset() {
114 changedFirstItem = false;
115 sizeChangesBeforeVisiblePos = 0.0;
116 sizeChangesAfterVisiblePos = 0.0;
117 countChangeBeforeVisible = 0;
118 countChangeAfterVisibleItems = 0;
119 }
120 };
121
122 enum BufferMode { NoBuffer = 0x00, BufferBefore = 0x01, BufferAfter = 0x02 };
123
124 bool isValid() const;
125 qreal position() const;
126 qreal size() const;
127 qreal startPosition() const;
128 qreal endPosition() const;
129 qreal contentStartOffset() const;
130 int findLastVisibleIndex(int defaultValue = -1) const;
131 FxViewItem *visibleItem(int modelIndex) const;
132 FxViewItem *firstItemInView() const;
133 int findLastIndexInView() const;
134 int mapFromModel(int modelIndex) const;
135
136 virtual void init();
137 virtual void clear(bool onDestruction=false);
138 virtual void updateViewport();
139
140 void regenerate(bool orientationChanged=false);
141 void layout();
143 void refill();
144 void refill(qreal from, qreal to);
145 void mirrorChange() override;
146
147 FxViewItem *createItem(int modelIndex,QQmlIncubator::IncubationMode incubationMode = QQmlIncubator::AsynchronousIfNested);
148 virtual bool releaseItem(FxViewItem *item, QQmlInstanceModel::ReusableFlag reusableFlag);
149
150 QQuickItem *createHighlightItem() const;
151 QQuickItem *createComponentItem(QQmlComponent *component, qreal zValue, bool createDefault = false) const;
152 virtual void initializeComponentItem(QQuickItem *) const;
153
154 void updateCurrent(int modelIndex);
155 void updateTrackedItem();
156 void updateUnrequestedIndexes();
157 void updateUnrequestedPositions();
158 void updateVisibleIndex();
159 void positionViewAtIndex(int index, int mode);
160
161 qreal minExtentForAxis(const AxisData &axisData, bool forXAxis) const;
162 qreal maxExtentForAxis(const AxisData &axisData, bool forXAxis) const;
163 qreal calculatedMinExtent() const;
164 qreal calculatedMaxExtent() const;
165
166 void applyDelegateChange();
167
168 void applyPendingChanges();
169 bool applyModelChanges(ChangeResult *insertionResult, ChangeResult *removalResult);
170 bool applyRemovalChange(const QQmlChangeSet::Change &removal, ChangeResult *changeResult, int *removedCount);
171 void removeItem(FxViewItem *item, const QQmlChangeSet::Change &removal, ChangeResult *removeResult);
172 virtual void updateSizeChangesBeforeVisiblePos(FxViewItem *item, ChangeResult *removeResult);
173 void repositionFirstItem(FxViewItem *prevVisibleItemsFirst, qreal prevVisibleItemsFirstPos,
174 FxViewItem *prevFirstVisible, ChangeResult *insertionResult, ChangeResult *removalResult);
175
176#if QT_CONFIG(quick_viewtransitions)
177 void createTransitioner();
178 void prepareVisibleItemTransitions();
179 void prepareRemoveTransitions(QMultiHash<QQmlChangeSet::MoveKey, FxViewItem *> *removedItems);
180 bool prepareNonVisibleItemTransition(FxViewItem *item, const QRectF &viewBounds);
182#endif
183
184 int findMoveKeyIndex(QQmlChangeSet::MoveKey key, const QVector<QQmlChangeSet::Change> &changes) const;
185
186 void checkVisible() const;
187 void showVisibleItems() const;
188
190 if (layoutOrientation() == Qt::Vertical)
191 vData.markExtentsDirty();
192 else
193 hData.markExtentsDirty();
194 }
195
196 bool hasPendingChanges() const {
197 return currentChanges.hasPendingChanges()
198 || bufferedChanges.hasPendingChanges()
199#if QT_CONFIG(quick_viewtransitions)
200 ||runDelayedRemoveTransition
201#endif
202 ;
203 }
204
206 if (hasPendingChanges())
207 layout();
208 else
209 refill();
210 }
211
213 Q_Q(QQuickItemView);
214 forceLayout = true;
215 q->polish();
216 }
217
219 // make a copy and clear the visibleItems first to avoid destroyed
220 // items being accessed during the loop (QTBUG-61294)
221 const QList<FxViewItem *> oldVisible = visibleItems;
222 visibleItems.clear();
223 for (FxViewItem *item : oldVisible)
224 releaseItem(item, reusableFlag);
225 }
226
227 virtual QQuickItemViewAttached *getAttachedObject(const QObject *) const { return nullptr; }
228
229 QPointer<QQmlInstanceModel> model;
238
239 QList<FxViewItem *> visibleItems;
240 qreal firstVisibleItemPosition = 0;
242 if (!visibleItems.isEmpty()) {
243 firstVisibleItemPosition = visibleItems.constFirst()->position();
244 }
245 }
250 QHash<QQuickItem*,int> unrequestedItems;
255
257 std::unique_ptr<FxViewItem> highlight;
258 int highlightRange; // enum value
262
267
268 // Reusing delegate items cannot be on by default for backwards compatibility.
269 // Reusing an item will e.g mean that Component.onCompleted will only be called for an
270 // item when it's created and not when it's reused, which will break legacy applications.
272
279#if QT_CONFIG(quick_viewtransitions)
280 QQuickItemViewTransitioner *transitioner;
281 QVector<FxViewItem *> releasePendingTransition;
282#endif
283
286
287 bool ownModel : 1;
288 bool wrap : 1;
291 bool inLayout : 1;
293 bool forceLayout : 1;
300 bool inRequest : 1;
301#if QT_CONFIG(quick_viewtransitions)
302 bool runDelayedRemoveTransition : 1;
303#endif
305 bool isClearing : 1;
306
307protected:
309 virtual bool isContentFlowReversed() const = 0;
310
311 virtual qreal positionAt(int index) const = 0;
312 virtual qreal endPositionAt(int index) const = 0;
313 virtual qreal originPosition() const = 0;
314 virtual qreal lastPosition() const = 0;
315
316 virtual qreal headerSize() const = 0;
317 virtual qreal footerSize() const = 0;
318 virtual bool showHeaderForIndex(int index) const = 0;
319 virtual bool showFooterForIndex(int index) const = 0;
320 virtual void updateHeader() = 0;
321 virtual void updateFooter() = 0;
322 virtual bool hasStickyHeader() const { return false; }
323 virtual bool hasStickyFooter() const { return false; }
324
325 virtual void createHighlight(bool onDestruction = false) = 0;
326 virtual void updateHighlight() = 0;
327 virtual void resetHighlightPosition() = 0;
328 virtual bool movingFromHighlight() { return false; }
329
330 virtual void setPosition(qreal pos) = 0;
331 virtual void fixupPosition() = 0;
332
333 virtual bool addVisibleItems(qreal fillFrom, qreal fillTo, qreal bufferFrom, qreal bufferTo, bool doBuffer) = 0;
334 virtual bool removeNonVisibleItems(qreal bufferFrom, qreal bufferTo) = 0;
335 virtual void visibleItemsChanged() {}
336
338 virtual void repositionItemAt(FxViewItem *item, int index, qreal sizeBuffer) = 0;
340 virtual void resetFirstItemPosition(qreal pos = 0.0) = 0;
341 virtual void adjustFirstItem(qreal forwards, qreal backwards, int changeBeforeVisible) = 0;
342
343 virtual void layoutVisibleItems(int fromModelIndex = 0) = 0;
344 virtual void changedVisibleIndex(int newIndex) = 0;
345
347 QList<FxViewItem *> *newItems, QList<MovedItem> *movingIntoView) = 0;
348
349 virtual bool needsRefillForAddedOrRemovedIndex(int) const { return false; }
350#if QT_CONFIG(quick_viewtransitions)
351 virtual void translateAndTransitionItemsAfter(int afterIndex, const ChangeResult &insertionResult, const ChangeResult &removalResult) = 0;
352#endif
353
355 virtual void initializeCurrentItem() {}
356 virtual void updateSectionCriteria() {}
357 virtual void updateSections() {}
358
359 void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &) override;
360};
361
362
364
365#endif // QQUICKITEMVIEW_P_P_H
QQuickItemView * view
QQuickItemViewAttached * attached
virtual void animationFinished(QAbstractAnimationJob *)
\inmodule QtCore
Definition qobject.h:103
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:63
\inmodule QtCore\reentrant
Definition qrect.h:484
\inmodule QtCore
Definition qvariant.h:65
b clear()
cache insert(employee->id(), employee)
Combined button and popup list for selecting options.
LayoutDirection
Orientation
Definition qnamespace.h:98
@ Vertical
Definition qnamespace.h:100
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:187
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)