Qt 6.x
The Qt SDK
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
4#ifndef QQMLDATAMODEL_P_P_H
5#define QQMLDATAMODEL_P_P_H
6
8#include <private/qv4qobjectwrapper_p.h>
9
10#include <QtQml/qqmlcontext.h>
11#include <QtQml/qqmlincubator.h>
12
13#include <private/qqmladaptormodel_p.h>
14#include <private/qqmlopenmetaobject_p.h>
15
16#include <QtCore/qloggingcategory.h>
17
18//
19// W A R N I N G
20// -------------
21//
22// This file is not part of the Qt API. It exists purely as an
23// implementation detail. This header file may change from version to
24// version without notice, or even be removed.
25//
26// We mean it.
27//
28
29QT_REQUIRE_CONFIG(qml_delegate_model);
30
32
33Q_DECLARE_LOGGING_CATEGORY(lcItemViewDelegateRecycling)
34
36
39
40class Q_QMLMODELS_PRIVATE_EXPORT QQmlDelegateModelItemMetaType final
42{
43public:
46
47 void initializeMetaObject();
48 void initializePrototype();
49
50 int parseGroups(const QStringList &groupNames) const;
51 int parseGroups(const QV4::Value &groupNames) const;
52
54 const int groupCount;
58 QV4::PersistentValue modelItemProto;
59};
60
63
65{
68 Q_PROPERTY(int row READ modelRow NOTIFY rowChanged REVISION(2, 12) FINAL)
69 Q_PROPERTY(int column READ modelColumn NOTIFY columnChanged REVISION(2, 12) FINAL)
70 Q_PROPERTY(QObject *model READ modelObject CONSTANT FINAL)
71public:
73 QQmlAdaptorModel::Accessors *accessor, int modelIndex,
74 int row, int column);
76
79 {
81 return --objectRef == 0 && !(groups & Compositor::PersistedFlag);
82 }
83 bool isObjectReferenced() const { return objectRef != 0 || (groups & Compositor::PersistedFlag); }
84 void childContextObjectDestroyed(QObject *childContextObject);
85
86 bool isReferenced() const {
87 return scriptRef
89 || ((groups & Compositor::UnresolvedFlag) && (groups & Compositor::GroupMask));
90 }
91
92 void Dispose();
93
94 QObject *modelObject() { return this; }
95
96 void destroyObject();
97
99
100 int groupIndex(Compositor::Group group);
101
102 int modelRow() const { return row; }
103 int modelColumn() const { return column; }
104 int modelIndex() const { return index; }
105 virtual void setModelIndex(int idx, int newRow, int newColumn, bool alwaysEmit = false);
106
108
109 virtual void setValue(const QString &role, const QVariant &value) { Q_UNUSED(role); Q_UNUSED(value); }
110 virtual bool resolveIndex(const QQmlAdaptorModel &, int) { return false; }
111
112 static QV4::ReturnedValue get_model(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc);
113 static QV4::ReturnedValue get_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc);
114 static QV4::ReturnedValue set_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc);
115 static QV4::ReturnedValue get_member(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &);
118
130 int index;
131
134 Q_REVISION(2, 12) void rowChanged();
135 Q_REVISION(2, 12) void columnChanged();
136
137protected:
139 int row;
141};
142
143namespace QV4 {
144namespace Heap {
146 inline void init(QQmlDelegateModelItem *item);
147 void destroy();
149};
150
151}
152}
153
155{
158};
159
161{
162 Object::init();
163 this->item = item;
164}
165
167{
168public:
169 void insertItem(QQmlDelegateModelItem *modelItem);
170 QQmlDelegateModelItem *takeItem(const QQmlComponent *delegate, int newIndexHint);
171 void reuseItem(QQmlDelegateModelItem *item, int newModelIndex);
172 void drain(int maxPoolTime, std::function<void(QQmlDelegateModelItem *cacheItem)> releaseItem);
173 int size() { return m_reusableItemsPool.size(); }
174
175private:
176 QList<QQmlDelegateModelItem *> m_reusableItemsPool;
177};
178
181{
182public:
185 , incubating(nullptr)
186 , vdm(l) {}
187
188 void initializeRequiredProperties(QQmlDelegateModelItem *modelItemToIncubate, QObject* object);
189 void statusChanged(Status) override;
190 void setInitialState(QObject *) override;
191
192 QQmlDelegateModelItem *incubating = nullptr;
195 QPointer<QObject> proxiedObject = nullptr; // the proxied object might disapear, so we use a QPointer instead of a raw one
197};
198
199
201{
202public:
204 virtual void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) = 0;
205 virtual void createdPackage(int, QQuickPackage *) {}
206 virtual void initPackage(int, QQuickPackage *) {}
208
210};
211
213
215{
216public:
217 Q_DECLARE_PUBLIC(QQmlDelegateModelGroup)
218
220
223
224 void setModel(QQmlDelegateModel *model, Compositor::Group group);
225 bool isChangedConnected();
226 void emitChanges(QV4::ExecutionEngine *engine);
227 void emitModelUpdated(bool reset);
228
229 void createdPackage(int index, QQuickPackage *package);
230 void initPackage(int index, QQuickPackage *package);
231 void destroyingPackage(QQuickPackage *package);
232
233 bool parseIndex(const QV4::Value &value, int *index, Compositor::Group *group) const;
234 bool parseGroupArgs(
235 QQmlV4Function *args, Compositor::Group *group, int *index, int *count, int *groups) const;
236
237 Compositor::Group group;
243};
244
246
248{
249 Q_DECLARE_PUBLIC(QQmlDelegateModel)
250public:
253
255 return static_cast<QQmlDelegateModelPrivate *>(QObjectPrivate::get(m));
256 }
257
258 void init();
260 void connectToAbstractItemModel();
261 void disconnectFromAbstractItemModel();
262
263 void requestMoreIfNecessary();
264 QObject *object(Compositor::Group group, int index, QQmlIncubator::IncubationMode incubationMode);
265 QQmlDelegateModel::ReleaseFlags release(QObject *object, QQmlInstanceModel::ReusableFlag reusable = QQmlInstanceModel::NotReusable);
266 QVariant variantValue(Compositor::Group group, int index, const QString &name);
267 void emitCreatedPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package);
268 void emitInitPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package);
270 Q_EMIT q_func()->createdItem(incubationTask->index[m_compositorGroup], item); }
271 void emitInitItem(QQDMIncubationTask *incubationTask, QObject *item) {
272 Q_EMIT q_func()->initItem(incubationTask->index[m_compositorGroup], item); }
273 void emitDestroyingPackage(QQuickPackage *package);
274 void emitDestroyingItem(QObject *item) { Q_EMIT q_func()->destroyingItem(item); }
275 void addCacheItem(QQmlDelegateModelItem *item, Compositor::iterator it);
276 void removeCacheItem(QQmlDelegateModelItem *cacheItem);
277 void destroyCacheItem(QQmlDelegateModelItem *cacheItem);
278 void updateFilterGroup();
279
280 void reuseItem(QQmlDelegateModelItem *item, int newModelIndex, int newGroups);
281 void drainReusableItemsPool(int maxPoolTime);
282 QQmlComponent *resolveDelegate(int index);
283
284 void addGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags);
285 void removeGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags);
286 void setGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags);
287
288 void itemsInserted(
289 const QVector<Compositor::Insert> &inserts,
290 QVarLengthArray<QVector<QQmlChangeSet::Change>, Compositor::MaximumGroupCount> *translatedInserts,
291 QHash<int, QList<QQmlDelegateModelItem *> > *movedItems = nullptr);
292 void itemsInserted(const QVector<Compositor::Insert> &inserts);
293 void itemsRemoved(
294 const QVector<Compositor::Remove> &removes,
295 QVarLengthArray<QVector<QQmlChangeSet::Change>, Compositor::MaximumGroupCount> *translatedRemoves,
296 QHash<int, QList<QQmlDelegateModelItem *> > *movedItems = nullptr);
297 void itemsRemoved(const QVector<Compositor::Remove> &removes);
298 void itemsMoved(
299 const QVector<Compositor::Remove> &removes, const QVector<Compositor::Insert> &inserts);
300 void itemsChanged(const QVector<Compositor::Change> &changes);
301 void emitChanges();
302 void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) override;
303 void delegateChanged(bool add = true, bool remove = true);
304
305 bool insert(Compositor::insert_iterator &before, const QV4::Value &object, int groups);
306
307 int adaptorModelCount() const;
308
312
313 void releaseIncubator(QQDMIncubationTask *incubationTask);
314 void incubatorStatusChanged(QQDMIncubationTask *incubationTask, QQmlIncubator::Status status);
315 void setInitialState(QQDMIncubationTask *incubationTask, QObject *o);
316
326
331
333
336
338 bool m_complete : 1;
340 bool m_reset : 1;
344
345 union {
346 struct {
349 QQmlDelegateModelGroup *m_persistedItems;
350 };
351 QQmlDelegateModelGroup *m_groups[Compositor::MaximumGroupCount];
352 };
353};
354
356{
358 Q_PROPERTY(QString filterOnGroup READ filterGroup WRITE setFilterGroup NOTIFY filterGroupChanged RESET resetFilterGroup FINAL)
359public:
360 QQmlPartsModel(QQmlDelegateModel *model, const QString &part, QObject *parent = nullptr);
362
363 QString filterGroup() const;
364 void setFilterGroup(const QString &group);
365 void resetFilterGroup();
366 void updateFilterGroup();
367 void updateFilterGroup(Compositor::Group group, const QQmlChangeSet &changeSet);
368
369 int count() const override;
370 bool isValid() const override;
372 ReleaseFlags release(QObject *item, ReusableFlag reusable = NotReusable) override;
373 QVariant variantValue(int index, const QString &role) override;
374 QList<QByteArray> watchedRoles() const { return m_watchedRoles; }
375 void setWatchedRoles(const QList<QByteArray> &roles) override;
376 QQmlIncubator::Status incubationStatus(int index) override;
377
378 int indexOf(QObject *item, QObject *objectContext) const override;
379
380 void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) override;
381
382 void createdPackage(int index, QQuickPackage *package) override;
383 void initPackage(int index, QQuickPackage *package) override;
384 void destroyingPackage(QQuickPackage *package) override;
385
388
389private:
390 QQmlDelegateModel *m_model;
392 QString m_part;
393 QString m_filterGroup;
394 QList<QByteArray> m_watchedRoles;
395 QVector<int> m_pendingPackageInitializations; // vector holds model indices
396 Compositor::Group m_compositorGroup;
397 bool m_inheritGroup;
398 bool m_modelUpdatePending = true;
399};
400
402
404{
405public:
408
409 void propertyCreated(int, QMetaPropertyBuilder &) override;
410 QVariant initialValue(int) override;
411};
412
414{
416public:
418
421};
422
425 public QQmlRefCounted<QQmlDelegateModelAttachedMetaObject>
426{
427public:
431
432 void objectDestroyed(QObject *) override;
433 int metaCall(QObject *, QMetaObject::Call, int _id, void **) override;
434
435private:
436 QQmlDelegateModelItemMetaType * const metaType;
437 QMetaObject * const metaObject;
438 const int memberPropertyOffset;
439 const int indexPropertyOffset;
440};
441
443
444#endif
[qjs-as-container]
\inmodule QtCore
Definition qhash.h:818
The QIntrusiveList class is a template class that provides a list of objects using static storage.
Definition qlist.h:74
\inmodule QtCore Represents a handle to a signal-slot (or signal-functor) connection.
\inmodule QtCore
Definition qhash.h:1348
static QObjectPrivate * get(QObject *o)
Definition qobject_p.h:153
\inmodule QtCore
Definition qobject.h:90
\inmodule QtCore
Definition qpointer.h:18
QQmlRefPointer< QQmlContextData > proxyContext
int index[QQmlListCompositor::MaximumGroupCount]
QQDMIncubationTask(QQmlDelegateModelPrivate *l, IncubationMode mode)
The QQmlChangeSet class stores an ordered list of notifications about changes to a linear data set.
The QQmlComponent class encapsulates a QML component definition.
The QQmlContext class defines a context within a QML engine.
Definition qqmlcontext.h:25
virtual void destroyingPackage(QQuickPackage *)
virtual void initPackage(int, QQuickPackage *)
virtual void createdPackage(int, QQuickPackage *)
virtual void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset)=0
QPointer< QQmlDelegateModel > model
static QQmlDelegateModelGroupPrivate * get(QQmlDelegateModelGroup *group)
QQmlDelegateModelGroupEmitterList emitters
QV4::ExecutionEngine *const v4Engine
QPointer< QQmlDelegateModel > model
QQmlDelegateModelAttachedMetaObject * metaObject
QQDMIncubationTask * incubationTask
static QV4::ReturnedValue set_member(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &arg)
void childContextObjectDestroyed(QObject *childContextObject)
virtual void setValue(const QString &role, const QVariant &value)
QPointer< QQmlDelegateModelAttached > attached
virtual QV4::ReturnedValue get()
static QV4::ReturnedValue get_member(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &)
static QV4::ReturnedValue get_index(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &arg)
static QV4::ReturnedValue get_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
int groupIndex(Compositor::Group group)
virtual bool resolveIndex(const QQmlAdaptorModel &, int)
QV4::ExecutionEngine * v4
static QQmlDelegateModelItem * dataForObject(QObject *object)
static QV4::ReturnedValue get_model(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
virtual void setModelIndex(int idx, int newRow, int newColumn, bool alwaysEmit=false)
QQmlRefPointer< QQmlContextData > contextData
static QV4::ReturnedValue set_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
Q_REVISION(2, 12) void rowChanged()
void objectDestroyed(QObject *)
QQmlRefPointer< QQmlDelegateModelItemMetaType > const metaType
QList< QQmlPartsModel * > models
QList< QQDMIncubationTask * > m_finishedIncubating
QQmlDelegateModelItemMetaType * m_cacheMetaType
void connectModel(QQmlAdaptorModel *model)
QList< QQmlDelegateModelItem * > m_cache
QQmlDelegateModelParts * m_parts
QList< QByteArray > m_watchedRoles
QQmlAbstractDelegateComponent * m_delegateChooser
QPointer< QQmlContext > m_context
void emitCreatedItem(QQDMIncubationTask *incubationTask, QObject *item)
void emitInitItem(QQDMIncubationTask *incubationTask, QObject *item)
QQmlStrongJSQObjectReference< QQmlComponent > m_delegate
void emitDestroyingItem(QObject *item)
QQmlDelegateModelGroupEmitterList m_pendingParts
QQmlDelegateModelGroup * m_cacheItems
QQmlDelegateModelGroup * m_items
QMetaObject::Connection m_delegateChooserChanged
QQmlReusableDelegateModelItemsPool m_reusableItemsPool
QQmlListCompositor::Group m_compositorGroup
static QQmlDelegateModelPrivate * get(QQmlDelegateModel *m)
The QQmlIncubator class allows QML objects to be created asynchronously.
IncubationMode
Specifies the mode the incubator operates in.
Status
Specifies the status of the QQmlIncubator.
The QQmlListCompositor class provides a lookup table for filtered, or re-ordered list indexes.
The QQmlListProperty class allows applications to expose list-like properties of QObject-derived clas...
Definition qqmllist.h:24
void filterGroupChanged()
QList< QByteArray > watchedRoles() const
void reuseItem(QQmlDelegateModelItem *item, int newModelIndex)
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
\inmodule QtCore
Definition qvariant.h:64
void statusChanged(QDeclarativeComponent::Status status)
[1]
Definition qlogging.cpp:9
cache insert(employee->id(), employee)
QSet< QString >::iterator it
Combined button and popup list for selecting options.
\qmltype Particle \inqmlmodule QtQuick.Particles
quint64 ReturnedValue
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define Q_DECLARE_LOGGING_CATEGORY(name)
GLenum mode
const GLfloat * m
GLsizei GLuint * groups
GLuint index
[2]
GLenum GLenum GLsizei count
GLuint object
[3]
GLboolean GLuint group
GLuint name
GLenum GLenum GLsizei void GLsizei void * column
GLboolean reset
GLenum GLenum GLsizei void * row
static void add(QPainterPath &path, const QWingedEdge &list, int edge, QPathEdge::Traversal traversal)
QIntrusiveList< QQmlDelegateModelGroupEmitter, &QQmlDelegateModelGroupEmitter::emitterNode > QQmlDelegateModelGroupEmitterList
QT_BEGIN_NAMESPACE typedef QQmlListCompositor Compositor
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
SSL_CTX int(*) void arg)
#define QT_REQUIRE_CONFIG(feature)
static QT_BEGIN_NAMESPACE void init(QTextBoundaryFinder::BoundaryType type, QStringView str, QCharAttributes *attributes)
#define Q_PROPERTY(...)
#define Q_OBJECT
#define Q_EMIT
#define Q_SIGNALS
#define Q_UNUSED(x)
ptrdiff_t qsizetype
Definition qtypes.h:70
unsigned int uint
Definition qtypes.h:29
#define V4_NEEDS_DESTROY
#define V4_OBJECT2(DataClass, superClass)
const char property[13]
Definition qwizard.cpp:101
view setModel(model)
[17] //! [18]
QSqlQueryModel * model
[16]
settings remove("monkey")
obj metaObject() -> className()
QObject::connect nullptr
sem release()
list indexOf("B")
QGraphicsItem * item
QJSValueList args
QJSEngine engine
[0]
\inmodule QtCore
void init(QQmlDelegateModelItem *item)
static ReturnedValue wrap(ExecutionEngine *engine, QObject *object)
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent