Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqmldelegatemodel_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// Qt-Security score:significant
4
5#ifndef QQMLDATAMODEL_P_P_H
6#define QQMLDATAMODEL_P_P_H
7
9#include <private/qv4qobjectwrapper_p.h>
10
11#include <QtQml/qqmlcontext.h>
12#include <QtQml/qqmlincubator.h>
13
14#include <private/qqmladaptormodel_p.h>
15#include <private/qqmlopenmetaobject_p.h>
16
17#include <QtCore/qloggingcategory.h>
18#include <QtCore/qpointer.h>
19
20//
21// W A R N I N G
22// -------------
23//
24// This file is not part of the Qt API. It exists purely as an
25// implementation detail. This header file may change from version to
26// version without notice, or even be removed.
27//
28// We mean it.
29//
30
32
34
36
38
39class QQmlDelegateModelAttachedMetaObject;
40class QQmlAbstractDelegateComponent;
41class QQmlTableInstanceModel;
42
43class Q_QMLMODELS_EXPORT QQmlDelegateModelItemMetaType final
44 : public QQmlRefCounted<QQmlDelegateModelItemMetaType>
45{
46public:
47 enum class ModelKind : quint8 {
48 InstanceModel,
49 DelegateModel,
50 TableInstanceModel,
51 };
52
53 QQmlDelegateModelItemMetaType(
54 QV4::ExecutionEngine *engine, QQmlDelegateModel *model, const QStringList &groupNames);
55 QQmlDelegateModelItemMetaType(
56 QV4::ExecutionEngine *engine, QQmlTableInstanceModel *model);
57 ~QQmlDelegateModelItemMetaType();
58
59 void initializeAttachedMetaObject();
60 void initializePrototype();
61
62 int parseGroups(const QStringList &groupNames) const;
63 int parseGroups(const QV4::Value &groupNames) const;
64
65 QQmlDelegateModel *delegateModel() const
66 {
67 return modelKind == ModelKind::DelegateModel
68 ? static_cast<QQmlDelegateModel *>(model.get())
69 : nullptr;
70 }
71
72 qsizetype groupCount() const { return groupNames.size(); }
73
74 void emitModelChanged() const;
75
76 QPointer<QQmlInstanceModel> model;
77 QV4::ExecutionEngine * const v4Engine;
78 QQmlRefPointer<QQmlDelegateModelAttachedMetaObject> attachedMetaObject;
79 const QStringList groupNames;
80 QV4::PersistentValue modelItemProto;
81 ModelKind modelKind = ModelKind::InstanceModel;
82};
83
84class QQmlAdaptorModel;
86
87class Q_QMLMODELS_EXPORT QQmlDelegateModelItem : public QObject
88{
89 Q_OBJECT
90 Q_PROPERTY(int index READ modelIndex NOTIFY modelIndexChanged)
91 Q_PROPERTY(int row READ modelRow NOTIFY rowChanged REVISION(2, 12))
92 Q_PROPERTY(int column READ modelColumn NOTIFY columnChanged REVISION(2, 12))
93 Q_PROPERTY(QObject *model READ modelObject CONSTANT)
94public:
95 struct ObjectReference
96 {
97 Q_DISABLE_COPY_MOVE(ObjectReference)
98
99 ObjectReference(QQmlDelegateModelItem *item) : item(item)
100 {
101 ++item->m_objectStrongRef;
102 }
103
104 ~ObjectReference()
105 {
106 Q_ASSERT(item->m_objectStrongRef > 0);
107 --item->m_objectStrongRef;
108 }
109 private:
110 QQmlDelegateModelItem *item = nullptr;
111 };
112
113 struct ObjectSpanReference
114 {
115 Q_DISABLE_COPY_MOVE(ObjectSpanReference)
116
117 ObjectSpanReference(QSpan<QQmlDelegateModelItem *const> span) : items(std::move(span))
118 {
119 for (QQmlDelegateModelItem *item : items)
120 ++item->m_objectStrongRef;
121 }
122
123 ~ObjectSpanReference()
124 {
125 for (QQmlDelegateModelItem *item : items) {
126 Q_ASSERT(item->m_objectStrongRef > 0);
127 --item->m_objectStrongRef;
128 }
129 }
130
131 private:
132 const QSpan<QQmlDelegateModelItem *const> items;
133 };
134
135 struct ScriptReference
136 {
137 Q_DISABLE_COPY_MOVE(ScriptReference)
138
139 ScriptReference(QQmlDelegateModelItem *item) : item(item) { item->referenceSript(); }
140 ~ScriptReference() { item->releaseScript(); }
141
142 QQmlDelegateModelItem *data() const { return item; }
143 private:
144 QQmlDelegateModelItem *item = nullptr;
145 };
146
147 QQmlDelegateModelItem(const QQmlRefPointer<QQmlDelegateModelItemMetaType> &metaType,
148 QQmlAdaptorModel::Accessors *accessor, int modelIndex,
149 int row, int column);
150 ~QQmlDelegateModelItem();
151
152 [[nodiscard]] QObject *referenceObjectWeak()
153 {
154 Q_ASSERT(m_object);
155 ++m_objectWeakRef;
156 return m_object;
157 }
158
159 bool releaseObjectWeak()
160 {
161 if (m_objectWeakRef > 0)
162 --m_objectWeakRef;
163 return !isObjectReferenced();
164 }
165 void clearObjectWeakReferences()
166 {
167 m_objectWeakRef = 0;
168 }
169
170 bool isObjectReferenced() const
171 {
172 return m_objectWeakRef != 0
173 || m_objectStrongRef != 0
174 || (m_groups & Compositor::PersistedFlag);
175 }
176 void childContextObjectDestroyed(QObject *childContextObject);
177
178 bool isScriptReferenced() const {
179 return m_scriptRef
180 || m_incubationTask
181 || ((m_groups & Compositor::UnresolvedFlag) && (m_groups & Compositor::GroupMask));
182 }
183
184 void dispose();
185
186 QObject *modelObject() { return this; }
187
188 void destroyObject();
189 void destroyObjectLater();
190
191 static QQmlDelegateModelItem *dataForObject(QObject *object);
192
193 int groupIndex(Compositor::Group group);
194
195 int modelRow() const { return m_row; }
196 int modelColumn() const { return m_column; }
197 int modelIndex() const { return m_index; }
198 bool hasValidModelIndex() const { return m_index >= 0; }
199 virtual void setModelIndex(int idx, int newRow, int newColumn, bool alwaysEmit = false);
200 void setPersistentModelIndex(const QPersistentModelIndex &index) { m_persistentIndex = index; }
201 QPersistentModelIndex persistentModelIndex() const { return m_persistentIndex; }
202
203 bool usesStructuredModelData() const { return m_useStructuredModelData; }
204
205 virtual QV4::ReturnedValue get() { return QV4::QObjectWrapper::wrap(m_metaType->v4Engine, this); }
206
207 virtual void setValue(const QString &role, const QVariant &value) { Q_UNUSED(role); Q_UNUSED(value); }
208 virtual bool resolveIndex(const QQmlAdaptorModel &, int) { return false; }
209 virtual QQmlRefPointer<QQmlContextData> initProxy() { return m_contextData; }
210
211 static QV4::ReturnedValue get_model(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc);
212 static QV4::ReturnedValue get_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc);
213 static QV4::ReturnedValue set_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc);
214 static QV4::ReturnedValue get_member(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &);
215 static QV4::ReturnedValue set_member(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &arg);
216 static QV4::ReturnedValue get_index(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &arg);
217
218
219 QQmlDelegateModelAttached *attached() const
220 {
221 if (!m_object)
222 return nullptr;
223
224 QQmlData *ddata = QQmlData::get(m_object);
225 if (!ddata || !ddata->hasExtendedData())
226 return nullptr;
227
228 return static_cast<QQmlDelegateModelAttached *>(
229 ddata->attachedProperties()->value(
230 QQmlPrivate::attachedPropertiesFunc<QQmlDelegateModel>()));
231 }
232
233 void disableStructuredModelData() { m_useStructuredModelData = false; }
234
235 QDynamicMetaObjectData *exchangeMetaObject(QDynamicMetaObjectData *metaObject)
236 {
237 return std::exchange(d_ptr->metaObject, metaObject);
238 }
239
240 QQDMIncubationTask *incubationTask() const { return m_incubationTask; }
241 void clearIncubationTask() { m_incubationTask = nullptr; }
242 void setIncubationTask(QQDMIncubationTask *incubationTask)
243 {
244 Q_ASSERT(!m_incubationTask);
245 Q_ASSERT(incubationTask);
246 m_incubationTask = incubationTask;
247 }
248
249 quint16 objectStrongRef() const { return m_objectStrongRef; }
250 quint16 objectWeakRef() const { return m_objectWeakRef; }
251 quint16 scriptRef() const { return m_scriptRef; }
252
253 QObject *object() const { return m_object; }
254 void setObject(QObject *object) {
255 Q_ASSERT(!m_object);
256 Q_ASSERT(object);
257 m_object = object;
258 }
259
260 QQmlComponent *delegate() const { return m_delegate; }
261 void setDelegate(QQmlComponent *delegate) { m_delegate = delegate; }
262
263 const QQmlRefPointer<QQmlContextData> &contextData() const { return m_contextData; }
264 void setContextData(const QQmlRefPointer<QQmlContextData> &contextData)
265 {
266 m_contextData = contextData;
267 }
268
269 int groups() const { return m_groups; }
270 void setGroups(int groups) { m_groups = groups; }
271 void addGroups(int groups) { m_groups |= groups; }
272 void removeGroups(int groups) { m_groups &= ~groups; }
273 void clearGroups() { m_groups = 0; }
274
275 const QQmlRefPointer<QQmlDelegateModelItemMetaType> &metaType() const { return m_metaType; }
276
277Q_SIGNALS:
278 void modelIndexChanged();
279 Q_REVISION(2, 12) void rowChanged();
280 Q_REVISION(2, 12) void columnChanged();
281
282private:
283 void objectDestroyed(QObject *);
284
285 void referenceSript() { ++m_scriptRef; }
286 bool releaseScript()
287 {
288 Q_ASSERT(m_scriptRef > 0);
289 return --m_scriptRef == 0;
290 }
291
292 QQmlRefPointer<QQmlDelegateModelItemMetaType> m_metaType;
293 QQmlRefPointer<QQmlContextData> m_contextData;
294 QPointer<QObject> m_object;
295 QQDMIncubationTask *m_incubationTask = nullptr;
296 QQmlComponent *m_delegate = nullptr;
297 int m_groups = 0;
298 int m_index = -1;
299 int m_row = -1;
300 int m_column = -1;
301
302 // A strong reference to the object prevents the deletion of the object. We use them as
303 // temporary guards with ObjectReference or ObjectSpanReference to make sure the objects we're
304 // currently manipulating don't disappear.
305 quint16 m_objectStrongRef = 0;
306
307 // A weak reference to the object is added when handing the object out to the view via object().
308 // It is dropped when the view calls release(). Weak references are advisory. We try not to
309 // delete an object while weak references are still in place. However, during destruction, the
310 // weak refernces may be ignored. Views are expected to use QPointer or similar guards in
311 // addition.
312 quint16 m_objectWeakRef = 0;
313
314 // A script reference is a strong reference to the QQmlDelegateModelItem itself. We don't delete
315 // the QQmlDelegateModelItem while script references are still in place. We can use them as
316 // temporary guards to hold on to an item while working on it, or we can attach them to
317 // Heap::QQmlDelegateModelItemObject in order to extend the life time of a QQmlDelegateModelItem
318 // to the life time of its heap object.
319 // The latter case is particular in that it contradicts our usual mechanism of only holding weak
320 // references to QObjects in e.g. QV4::QObjectWrapper. The trick here is that the actual
321 // QQmlDelegateModelItem is never exposed to the user, so that the user has no chance of
322 // manually deleting it.
323 // TODO: This is brittle.
324 quint16 m_scriptRef = 0;
325
326 bool m_useStructuredModelData = true;
327 QPersistentModelIndex m_persistentIndex;
328};
329
330namespace QV4 {
331namespace Heap {
333 inline void init(QQmlDelegateModelItem *item);
334 void destroy();
335
336 alignas(alignof(QQmlDelegateModelItem::ScriptReference))
338
339 QQmlDelegateModelItem *item() const {
340 return reinterpret_cast<const QQmlDelegateModelItem::ScriptReference *>(&ref)->data();
341 }
342};
343
344}
345}
346
348{
349 V4_OBJECT2(QQmlDelegateModelItemObject, QV4::Object)
351};
352
353void QV4::Heap::QQmlDelegateModelItemObject::init(QQmlDelegateModelItem *modelItem)
354{
355 Object::init();
356 new (ref) QQmlDelegateModelItem::ScriptReference(modelItem);
357}
358
360{
361public:
362 bool insertItem(QQmlDelegateModelItem *modelItem);
363 QQmlDelegateModelItem *takeItem(const QQmlComponent *delegate, int newIndexHint);
364 void reuseItem(QQmlDelegateModelItem *item, int newModelIndex);
365 void drain(int maxPoolTime, std::function<void(QQmlDelegateModelItem *cacheItem)> releaseItem);
366 int size()
367 {
368 Q_ASSERT(m_reusableItemsPool.size() <= MaxSize);
369 return int(m_reusableItemsPool.size());
370 }
371
372private:
373 struct PoolItem
374 {
375 QQmlDelegateModelItem *item = nullptr;
376 int poolTime = 0;
377 };
378
379 static constexpr size_t MaxSize = size_t(std::numeric_limits<int>::max());
380
381 std::vector<PoolItem> m_reusableItemsPool;
382};
383
384template<typename Target>
386{
388
389public:
397
403
405 {
406 if (target)
408 }
409
414
416 {
417 if (!target)
418 return 0;
419
421 return 0;
422
423 return original->metaCall(o, call, id, argv);
424 }
425
426private:
427 Target target = {};
428 QDynamicMetaObjectData *original = nullptr;
429 int readOnlyProperty = -1;
430};
431
434{
435public:
438 , incubating(nullptr)
439 , vdm(l) {}
440
442 QQmlDelegateModelItem *modelItemToIncubate, QObject* object,
443 QQmlDelegateModel::DelegateModelAccess access);
444 void statusChanged(Status) override;
445 void setInitialState(QObject *) override;
446
447 QQmlDelegateModelItem *incubating = nullptr;
450 QPointer<QObject> proxiedObject = nullptr; // the proxied object might disapear, so we use a QPointer instead of a raw one
452};
453
454
456{
457public:
459 virtual void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) = 0;
460 virtual void createdPackage(int, QQuickPackage *);
461 virtual void initPackage(int, QQuickPackage *);
462 virtual void destroyingPackage(QQuickPackage *);
463
465};
466
468
470{
471public:
472 Q_DECLARE_PUBLIC(QQmlDelegateModelGroup)
473
475
478
480 bool isChangedConnected();
481 void emitChanges(QV4::ExecutionEngine *engine);
482 void emitModelUpdated(bool reset);
483
484 void createdPackage(int index, QQuickPackage *package);
485 void initPackage(int index, QQuickPackage *package);
486 void destroyingPackage(QQuickPackage *package);
487
488 bool parseIndex(const QV4::Value &value, int *index, Compositor::Group *group) const;
489 bool parseGroupArgs(
490 QQmlV4FunctionPtr args, Compositor::Group *group, int *index, int *count, int *groups) const;
491
495 QQmlChangeSet changeSet;
498};
499
501
503{
504 Q_DECLARE_PUBLIC(QQmlDelegateModel)
505public:
508
509 static QQmlDelegateModelPrivate *get(QQmlDelegateModel *m) {
510 return static_cast<QQmlDelegateModelPrivate *>(QObjectPrivate::get(m));
511 }
512
513 void init();
514 void connectModel(QQmlAdaptorModel *model);
517
519 QObject *object(Compositor::Group group, int index, QQmlIncubator::IncubationMode incubationMode);
521 QVariant variantValue(Compositor::Group group, int index, const QString &name);
522 void emitCreatedPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package);
523 void emitInitPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package);
524 void emitCreatedItem(QQDMIncubationTask *incubationTask, QObject *item) {
525 Q_EMIT q_func()->createdItem(incubationTask->index[m_compositorGroup], item); }
526 void emitInitItem(QQDMIncubationTask *incubationTask, QObject *item) {
527 Q_EMIT q_func()->initItem(incubationTask->index[m_compositorGroup], item); }
528 void emitDestroyingPackage(QQuickPackage *package);
529 void emitDestroyingItem(QObject *item) { Q_EMIT q_func()->destroyingItem(item); }
530 void addCacheItem(QQmlDelegateModelItem *item, Compositor::iterator it);
531 void removeCacheItem(QQmlDelegateModelItem *cacheItem);
532 void destroyCacheItem(QQmlDelegateModelItem *cacheItem);
533 void updateFilterGroup();
534
535 void reuseItem(QQmlDelegateModelItem *item, int newModelIndex, int newGroups);
536 void drainReusableItemsPool(int maxPoolTime);
537 QQmlComponent *resolveDelegate(int index);
538
539 void addGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags);
540 void removeGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags);
541 void setGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags);
542
543 void itemsInserted(
544 const QList<Compositor::Insert> &inserts,
545 QVarLengthArray<QList<QQmlChangeSet::Change>, Compositor::MaximumGroupCount> *translatedInserts,
546 QHash<int, QList<QQmlDelegateModelItem *> > *movedItems = nullptr);
547 void itemsInserted(const QList<Compositor::Insert> &inserts);
548 void itemsRemoved(
549 const QList<Compositor::Remove> &removes,
550 QVarLengthArray<QList<QQmlChangeSet::Change>, Compositor::MaximumGroupCount> *translatedRemoves,
551 QHash<int, QList<QQmlDelegateModelItem *> > *movedItems = nullptr);
552 void itemsRemoved(const QList<Compositor::Remove> &removes);
553 void itemsMoved(
554 const QList<Compositor::Remove> &removes, const QList<Compositor::Insert> &inserts);
555 void itemsChanged(const QList<Compositor::Change> &changes);
556 void emitChanges();
557 void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) override;
558 void delegateChanged(bool add = true, bool remove = true);
559
565 InsertionResult insert(Compositor::insert_iterator &before, const QV4::Value &object, int groups);
566
567 int adaptorModelCount() const;
568
569 static void group_append(QQmlListProperty<QQmlDelegateModelGroup> *property, QQmlDelegateModelGroup *group);
570 static qsizetype group_count(QQmlListProperty<QQmlDelegateModelGroup> *property);
571 static QQmlDelegateModelGroup *group_at(QQmlListProperty<QQmlDelegateModelGroup> *property, qsizetype index);
572
573 void releaseIncubator(QQDMIncubationTask *incubationTask);
574 void incubatorStatusChanged(QQDMIncubationTask *incubationTask, QQmlIncubator::Status status);
575 void setInitialState(QQDMIncubationTask *incubationTask, QObject *o);
576
577 QQmlAdaptorModel m_adaptorModel;
580 QQmlAbstractDelegateComponent *m_delegateChooser;
586
591
593
596
598 bool m_complete : 1;
600 bool m_reset : 1;
604
605 union {
606 struct {
607 QQmlDelegateModelGroup *m_cacheItems;
608 QQmlDelegateModelGroup *m_items;
609 QQmlDelegateModelGroup *m_persistedItems;
610 };
611 QQmlDelegateModelGroup *m_groups[Compositor::MaximumGroupCount];
612 };
613};
614
616{
617 Q_OBJECT
618 Q_PROPERTY(QString filterOnGroup READ filterGroup WRITE setFilterGroup NOTIFY filterGroupChanged RESET resetFilterGroup FINAL)
619public:
622
623 QString filterGroup() const;
624 void setFilterGroup(const QString &group);
625 void resetFilterGroup();
626 void updateFilterGroup();
627 void updateFilterGroup(Compositor::Group group, const QQmlChangeSet &changeSet);
628
629 int count() const override;
630 bool isValid() const override;
631 QObject *object(int index, QQmlIncubator::IncubationMode incubationMode = QQmlIncubator::AsynchronousIfNested) override;
632 ReleaseFlags release(QObject *item, ReusableFlag reusable = NotReusable) override;
633 QVariant variantValue(int index, const QString &role) override;
634 QList<QByteArray> watchedRoles() const { return m_watchedRoles; }
635 void setWatchedRoles(const QList<QByteArray> &roles) override;
636 QQmlIncubator::Status incubationStatus(int index) override;
637
638 int indexOf(QObject *item, QObject *objectContext) const override;
639
640 void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) override;
641
642 void createdPackage(int index, QQuickPackage *package) override;
643 void initPackage(int index, QQuickPackage *package) override;
644 void destroyingPackage(QQuickPackage *package) override;
645
648
649private:
650 QQmlDelegateModel *m_model;
651 QMultiHash<QObject *, QQuickPackage *> m_packaged;
652 QString m_part;
653 QString m_filterGroup;
654 QList<QByteArray> m_watchedRoles;
655 QList<int> m_pendingPackageInitializations; // vector holds model indices
656 Compositor::Group m_compositorGroup;
657 bool m_inheritGroup;
658 bool m_modelUpdatePending = true;
659};
660
661class QMetaPropertyBuilder;
662
664{
665public:
668
669 void propertyCreated(int, QMetaPropertyBuilder &) override;
670 QVariant initialValue(int) override;
671};
672
682
683class QQmlDelegateModelAttachedMetaObject final
684 : public QAbstractDynamicMetaObject,
685 public QQmlRefCounted<QQmlDelegateModelAttachedMetaObject>
686{
687public:
689 QQmlDelegateModelItemMetaType *metaType, QMetaObject *metaObject);
691
692 void objectDestroyed(QObject *) override;
693 int metaCall(QObject *, QMetaObject::Call, int _id, void **) override;
694
695private:
696 QQmlDelegateModelItemMetaType * const metaType;
697 QMetaObject * const metaObject;
698 const int memberPropertyOffset;
699 const int indexPropertyOffset;
700};
701
702QT_END_NAMESPACE
703
704#endif
void initializeRequiredProperties(QQmlDelegateModelItem *modelItemToIncubate, QObject *object, QQmlDelegateModel::DelegateModelAccess access)
QPointer< QObject > proxiedObject
QQmlRefPointer< QQmlContextData > proxyContext
void statusChanged(Status) override
Called when the status of the incubator changes.
void setInitialState(QObject *) override
Called after the object is first created, but before complex property bindings are evaluated and,...
int index[QQmlListCompositor::MaximumGroupCount]
QQmlDelegateModelItem * incubating
QQDMIncubationTask(QQmlDelegateModelPrivate *l, IncubationMode mode)
QQmlDelegateModelPrivate * vdm
QQmlDelegateModelAttachedMetaObject(QQmlDelegateModelItemMetaType *metaType, QMetaObject *metaObject)
int metaCall(QObject *, QMetaObject::Call, int _id, void **) override
QQmlDelegateModelAttached(QQmlDelegateModelItem *cacheItem, QObject *parent)
void setGroups(const QStringList &groups)
bool isUnresolved() const
\qmlattachedproperty bool QtQml.Models::DelegateModel::isUnresolved
void emitChanges()
\qmlattachedproperty bool QtQml.Models::DelegateModel::inItems
void setInPersistedItems(bool inPersisted)
QQmlDelegateModel * model() const
\qmlattachedproperty model QtQml.Models::DelegateModel::model
QStringList groups() const
\qmlattachedproperty list<string> QtQml.Models::DelegateModel::groups
QQmlDelegateModelItem * m_cacheItem
QV4::ReturnedValue array(QV4::ExecutionEngine *engine, const QList< QQmlChangeSet::Change > &changes)
QQmlDelegateModelEngineData(QV4::ExecutionEngine *v4)
virtual void initPackage(int, QQuickPackage *)
virtual void destroyingPackage(QQuickPackage *)
virtual void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset)=0
virtual void createdPackage(int, QQuickPackage *)
bool parseIndex(const QV4::Value &value, int *index, Compositor::Group *group) const
void createdPackage(int index, QQuickPackage *package)
QPointer< QQmlDelegateModel > model
bool parseGroupArgs(QQmlV4FunctionPtr args, Compositor::Group *group, int *index, int *count, int *groups) const
void initPackage(int index, QQuickPackage *package)
QQmlDelegateModelGroupEmitterList emitters
void destroyingPackage(QQuickPackage *package)
void emitChanges(QV4::ExecutionEngine *engine)
void propertyCreated(int, QMetaPropertyBuilder &) override
QList< QQmlPartsModel * > models
void setInitialState(QQDMIncubationTask *incubationTask, QObject *o)
void removeCacheItem(QQmlDelegateModelItem *cacheItem)
QVariant variantValue(Compositor::Group group, int index, const QString &name)
void emitCreatedPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package)
QList< QQDMIncubationTask * > m_finishedIncubating
void connectModel(QQmlAdaptorModel *model)
QList< QQmlDelegateModelItem * > m_cache
void itemsMoved(const QList< Compositor::Remove > &removes, const QList< Compositor::Insert > &inserts)
QQmlDelegateModelParts * m_parts
static qsizetype group_count(QQmlListProperty< QQmlDelegateModelGroup > *property)
QList< QByteArray > m_watchedRoles
QQmlAbstractDelegateComponent * m_delegateChooser
QPointer< QQmlContext > m_context
void itemsInserted(const QList< Compositor::Insert > &inserts)
void emitCreatedItem(QQDMIncubationTask *incubationTask, QObject *item)
void emitInitItem(QQDMIncubationTask *incubationTask, QObject *item)
static void group_append(QQmlListProperty< QQmlDelegateModelGroup > *property, QQmlDelegateModelGroup *group)
QQmlStrongJSQObjectReference< QQmlComponent > m_delegate
void emitDestroyingItem(QObject *item)
void addCacheItem(QQmlDelegateModelItem *item, Compositor::iterator it)
QQmlRefPointer< QQmlDelegateModelItemMetaType > m_cacheMetaType
void reuseItem(QQmlDelegateModelItem *item, int newModelIndex, int newGroups)
void drainReusableItemsPool(int maxPoolTime)
QQmlDelegateModelGroup * m_persistedItems
static QQmlDelegateModelGroup * group_at(QQmlListProperty< QQmlDelegateModelGroup > *property, qsizetype index)
void itemsRemoved(const QList< Compositor::Remove > &removes, QVarLengthArray< QList< QQmlChangeSet::Change >, Compositor::MaximumGroupCount > *translatedRemoves, QHash< int, QList< QQmlDelegateModelItem * > > *movedItems=nullptr)
QQmlDelegateModelGroupEmitterList m_pendingParts
void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) override
QQmlDelegateModelGroup * m_cacheItems
QObject * object(Compositor::Group group, int index, QQmlIncubator::IncubationMode incubationMode)
void destroyCacheItem(QQmlDelegateModelItem *cacheItem)
void itemsRemoved(const QList< Compositor::Remove > &removes)
InsertionResult insert(Compositor::insert_iterator &before, const QV4::Value &object, int groups)
void setGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags)
void delegateChanged(bool add=true, bool remove=true)
QQmlDelegateModelGroup * m_items
void releaseIncubator(QQDMIncubationTask *incubationTask)
void itemsInserted(const QList< Compositor::Insert > &inserts, QVarLengthArray< QList< QQmlChangeSet::Change >, Compositor::MaximumGroupCount > *translatedInserts, QHash< int, QList< QQmlDelegateModelItem * > > *movedItems=nullptr)
void incubatorStatusChanged(QQDMIncubationTask *incubationTask, QQmlIncubator::Status status)
void emitInitPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package)
void addGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags)
void emitDestroyingPackage(QQuickPackage *package)
QQmlComponent * resolveDelegate(int index)
QMetaObject::Connection m_delegateChooserChanged
QQmlDelegateModelGroup * m_groups[Compositor::MaximumGroupCount]
void removeGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags)
void itemsChanged(const QList< Compositor::Change > &changes)
QQmlReusableDelegateModelItemsPool m_reusableItemsPool
QQmlListCompositor::Group m_compositorGroup
static QQmlDelegateModelPrivate * get(QQmlDelegateModel *m)
void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) override
QVariant variantValue(int index, const QString &role) override
int count() const override
QObject * object(int index, QQmlIncubator::IncubationMode incubationMode=QQmlIncubator::AsynchronousIfNested) override
QList< QByteArray > watchedRoles() const
void updateFilterGroup(Compositor::Group group, const QQmlChangeSet &changeSet)
void setFilterGroup(const QString &group)
QQmlIncubator::Status incubationStatus(int index) override
int indexOf(QObject *item, QObject *objectContext) const override
void destroyingPackage(QQuickPackage *package) override
void setWatchedRoles(const QList< QByteArray > &roles) override
ReleaseFlags release(QObject *item, ReusableFlag reusable=NotReusable) override
void createdPackage(int index, QQuickPackage *package) override
void initPackage(int index, QQuickPackage *package) override
QString filterGroup() const
bool isValid() const override
bool insertItem(QQmlDelegateModelItem *modelItem)
void reuseItem(QQmlDelegateModelItem *item, int newModelIndex)
void drain(int maxPoolTime, std::function< void(QQmlDelegateModelItem *cacheItem)> releaseItem)
QQmlDelegateModelItem * takeItem(const QQmlComponent *delegate, int newIndexHint)
Combined button and popup list for selecting options.
Definition qjsvalue.h:24
QT_REQUIRE_CONFIG(animation)
QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(lcQIORing)
QT_REQUIRE_CONFIG(qml_delegate_model)
static bool isDoneIncubating(QQmlIncubator::Status status)
DEFINE_OBJECT_VTABLE(QQmlDelegateModelGroupChange)
DEFINE_OBJECT_VTABLE(QV4::DelegateModelGroupFunction)
DEFINE_OBJECT_VTABLE(QQmlDelegateModelItemObject)
static void incrementIndexes(QQmlDelegateModelItem *cacheItem, int count, const int *deltas)
DEFINE_OBJECT_VTABLE(QQmlDelegateModelGroupChangeArray)
QQmlDelegateModelGroupEmitterList::iterator GroupEmitterListIt
QIntrusiveList< QQmlDelegateModelGroupEmitter, &QQmlDelegateModelGroupEmitter::emitterNode > QQmlDelegateModelGroupEmitterList
QT_BEGIN_NAMESPACE typedef QQmlListCompositor Compositor
void init(ExecutionEngine *engine, uint flag, QV4::ReturnedValue(*code)(QQmlDelegateModelItem *item, uint flag, const QV4::Value &arg))
QV4::ReturnedValue(* code)(QQmlDelegateModelItem *item, uint flag, const QV4::Value &arg)
void init(const QList< QQmlChangeSet::Change > &changes)
void init(QQmlDelegateModelItem *item)
std::byte ref[sizeof(QQmlDelegateModelItem::ScriptReference)]