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
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#include <QtCore/qpointer.h>
18
19//
20// W A R N I N G
21// -------------
22//
23// This file is not part of the Qt API. It exists purely as an
24// implementation detail. This header file may change from version to
25// version without notice, or even be removed.
26//
27// We mean it.
28//
29
30QT_REQUIRE_CONFIG(qml_delegate_model);
31
33
34Q_DECLARE_LOGGING_CATEGORY(lcItemViewDelegateRecycling)
35
37
40
41class Q_QMLMODELS_EXPORT QQmlDelegateModelItemMetaType final
43{
44public:
47
48 void initializeMetaObject();
49 void initializePrototype();
50
51 int parseGroups(const QStringList &groupNames) const;
52 int parseGroups(const QV4::Value &groupNames) const;
53
54 QPointer<QQmlDelegateModel> model;
55 const int groupCount;
60};
61
64
66{
69 Q_PROPERTY(int row READ modelRow NOTIFY rowChanged REVISION(2, 12))
70 Q_PROPERTY(int column READ modelColumn NOTIFY columnChanged REVISION(2, 12))
72public:
74 QQmlAdaptorModel::Accessors *accessor, int modelIndex,
75 int row, int column);
77
80 {
82 return --objectRef == 0 && !(groups & Compositor::PersistedFlag);
83 }
84 bool isObjectReferenced() const { return objectRef != 0 || (groups & Compositor::PersistedFlag); }
85 void childContextObjectDestroyed(QObject *childContextObject);
86
87 bool isReferenced() const {
88 return scriptRef
90 || ((groups & Compositor::UnresolvedFlag) && (groups & Compositor::GroupMask));
91 }
92
93 void Dispose();
94
95 QObject *modelObject() { return this; }
96
97 void destroyObject();
98
100
101 int groupIndex(Compositor::Group group);
102
103 int modelRow() const { return row; }
104 int modelColumn() const { return column; }
105 int modelIndex() const { return index; }
106 virtual void setModelIndex(int idx, int newRow, int newColumn, bool alwaysEmit = false);
107
109
110 virtual void setValue(const QString &role, const QVariant &value) { Q_UNUSED(role); Q_UNUSED(value); }
111 virtual bool resolveIndex(const QQmlAdaptorModel &, int) { return false; }
112
113 static QV4::ReturnedValue get_model(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc);
114 static QV4::ReturnedValue get_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc);
115 static QV4::ReturnedValue set_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc);
116 static QV4::ReturnedValue get_member(QQmlDelegateModelItem *thisItem, uint flag, const QV4::Value &);
119
121 QQmlRefPointer<QQmlDelegateModelItemMetaType> const metaType;
122 QQmlRefPointer<QQmlContextData> contextData;
123 QPointer<QObject> object;
124 QPointer<QQmlDelegateModelAttached> attached;
131 int index;
132
135 Q_REVISION(2, 12) void rowChanged();
136 Q_REVISION(2, 12) void columnChanged();
137
138protected:
140 int row;
141 int column;
142};
143
144namespace QV4 {
145namespace Heap {
147 inline void init(QQmlDelegateModelItem *item);
148 void destroy();
150};
151
152}
153}
154
160
162{
163 Object::init();
164 this->item = item;
165}
166
168{
169public:
170 void insertItem(QQmlDelegateModelItem *modelItem);
171 QQmlDelegateModelItem *takeItem(const QQmlComponent *delegate, int newIndexHint);
172 void reuseItem(QQmlDelegateModelItem *item, int newModelIndex);
173 void drain(int maxPoolTime, std::function<void(QQmlDelegateModelItem *cacheItem)> releaseItem);
174 int size() { return m_reusableItemsPool.size(); }
175
176private:
177 QList<QQmlDelegateModelItem *> m_reusableItemsPool;
178};
179
182{
183public:
188
189 void initializeRequiredProperties(QQmlDelegateModelItem *modelItemToIncubate, QObject* object);
190 void statusChanged(Status) override;
191 void setInitialState(QObject *) override;
192
193 QQmlDelegateModelItem *incubating = nullptr;
195 QQmlRefPointer<QQmlContextData> proxyContext;
196 QPointer<QObject> proxiedObject = nullptr; // the proxied object might disapear, so we use a QPointer instead of a raw one
198};
199
200
202{
203public:
205 virtual void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) = 0;
206 virtual void createdPackage(int, QQuickPackage *) {}
207 virtual void initPackage(int, QQuickPackage *) {}
209
211};
212
213typedef QIntrusiveList<QQmlDelegateModelGroupEmitter, &QQmlDelegateModelGroupEmitter::emitterNode> QQmlDelegateModelGroupEmitterList;
214
216{
217public:
218 Q_DECLARE_PUBLIC(QQmlDelegateModelGroup)
219
221
224
225 void setModel(QQmlDelegateModel *model, Compositor::Group group);
226 bool isChangedConnected();
227 void emitChanges(QV4::ExecutionEngine *engine);
228 void emitModelUpdated(bool reset);
229
230 void createdPackage(int index, QQuickPackage *package);
231 void initPackage(int index, QQuickPackage *package);
232 void destroyingPackage(QQuickPackage *package);
233
234 bool parseIndex(const QV4::Value &value, int *index, Compositor::Group *group) const;
235 bool parseGroupArgs(
236 QQmlV4FunctionPtr args, Compositor::Group *group, int *index, int *count, int *groups) const;
237
238 Compositor::Group group;
239 QPointer<QQmlDelegateModel> model;
244};
245
247
249{
250 Q_DECLARE_PUBLIC(QQmlDelegateModel)
251public:
254
258
259 void init();
261 void connectToAbstractItemModel();
262 void disconnectFromAbstractItemModel();
263
264 void requestMoreIfNecessary();
265 QObject *object(Compositor::Group group, int index, QQmlIncubator::IncubationMode incubationMode);
266 QQmlDelegateModel::ReleaseFlags release(QObject *object, QQmlInstanceModel::ReusableFlag reusable = QQmlInstanceModel::NotReusable);
267 QVariant variantValue(Compositor::Group group, int index, const QString &name);
268 void emitCreatedPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package);
269 void emitInitPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package);
271 Q_EMIT q_func()->createdItem(incubationTask->index[m_compositorGroup], item); }
272 void emitInitItem(QQDMIncubationTask *incubationTask, QObject *item) {
273 Q_EMIT q_func()->initItem(incubationTask->index[m_compositorGroup], item); }
274 void emitDestroyingPackage(QQuickPackage *package);
275 void emitDestroyingItem(QObject *item) { Q_EMIT q_func()->destroyingItem(item); }
276 void addCacheItem(QQmlDelegateModelItem *item, Compositor::iterator it);
277 void removeCacheItem(QQmlDelegateModelItem *cacheItem);
278 void destroyCacheItem(QQmlDelegateModelItem *cacheItem);
279 void updateFilterGroup();
280
281 void reuseItem(QQmlDelegateModelItem *item, int newModelIndex, int newGroups);
282 void drainReusableItemsPool(int maxPoolTime);
283 QQmlComponent *resolveDelegate(int index);
284
285 void addGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags);
286 void removeGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags);
287 void setGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags);
288
289 void itemsInserted(
290 const QVector<Compositor::Insert> &inserts,
291 QVarLengthArray<QVector<QQmlChangeSet::Change>, Compositor::MaximumGroupCount> *translatedInserts,
292 QHash<int, QList<QQmlDelegateModelItem *> > *movedItems = nullptr);
293 void itemsInserted(const QVector<Compositor::Insert> &inserts);
294 void itemsRemoved(
295 const QVector<Compositor::Remove> &removes,
296 QVarLengthArray<QVector<QQmlChangeSet::Change>, Compositor::MaximumGroupCount> *translatedRemoves,
297 QHash<int, QList<QQmlDelegateModelItem *> > *movedItems = nullptr);
298 void itemsRemoved(const QVector<Compositor::Remove> &removes);
299 void itemsMoved(
300 const QVector<Compositor::Remove> &removes, const QVector<Compositor::Insert> &inserts);
301 void itemsChanged(const QVector<Compositor::Change> &changes);
302 void emitChanges();
303 void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) override;
304 void delegateChanged(bool add = true, bool remove = true);
305
306 enum class InsertionResult {
307 Success,
308 Error,
309 Retry
310 };
311 InsertionResult insert(Compositor::insert_iterator &before, const QV4::Value &object, int groups);
312
313 int adaptorModelCount() const;
314
315 static void group_append(QQmlListProperty<QQmlDelegateModelGroup> *property, QQmlDelegateModelGroup *group);
316 static qsizetype group_count(QQmlListProperty<QQmlDelegateModelGroup> *property);
317 static QQmlDelegateModelGroup *group_at(QQmlListProperty<QQmlDelegateModelGroup> *property, qsizetype index);
318
319 void releaseIncubator(QQDMIncubationTask *incubationTask);
320 void incubatorStatusChanged(QQDMIncubationTask *incubationTask, QQmlIncubator::Status status);
321 void setInitialState(QQDMIncubationTask *incubationTask, QObject *o);
322
325 QQmlStrongJSQObjectReference<QQmlComponent> m_delegate;
329 QPointer<QQmlContext> m_context;
332
333 QList<QQmlDelegateModelItem *> m_cache;
335 QList<QQDMIncubationTask *> m_finishedIncubating;
336 QList<QByteArray> m_watchedRoles;
337
339
342
344 bool m_complete : 1;
346 bool m_reset : 1;
350
351 union {
352 struct {
356 };
357 QQmlDelegateModelGroup *m_groups[Compositor::MaximumGroupCount];
358 };
359};
360
362{
364 Q_PROPERTY(QString filterOnGroup READ filterGroup WRITE setFilterGroup NOTIFY filterGroupChanged RESET resetFilterGroup FINAL)
365public:
366 QQmlPartsModel(QQmlDelegateModel *model, const QString &part, QObject *parent = nullptr);
368
369 QString filterGroup() const;
370 void setFilterGroup(const QString &group);
371 void resetFilterGroup();
372 void updateFilterGroup();
373 void updateFilterGroup(Compositor::Group group, const QQmlChangeSet &changeSet);
374
375 int count() const override;
376 bool isValid() const override;
378 ReleaseFlags release(QObject *item, ReusableFlag reusable = NotReusable) override;
379 QVariant variantValue(int index, const QString &role) override;
380 QList<QByteArray> watchedRoles() const { return m_watchedRoles; }
381 void setWatchedRoles(const QList<QByteArray> &roles) override;
382 QQmlIncubator::Status incubationStatus(int index) override;
383
384 int indexOf(QObject *item, QObject *objectContext) const override;
385
386 void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset) override;
387
388 void createdPackage(int index, QQuickPackage *package) override;
389 void initPackage(int index, QQuickPackage *package) override;
390 void destroyingPackage(QQuickPackage *package) override;
391
394
395private:
396 QQmlDelegateModel *m_model;
397 QMultiHash<QObject *, QQuickPackage *> m_packaged;
398 QString m_part;
399 QString m_filterGroup;
400 QList<QByteArray> m_watchedRoles;
401 QVector<int> m_pendingPackageInitializations; // vector holds model indices
402 Compositor::Group m_compositorGroup;
403 bool m_inheritGroup;
404 bool m_modelUpdatePending = true;
405};
406
408
410{
411public:
414
415 void propertyCreated(int, QMetaPropertyBuilder &) override;
416 QVariant initialValue(int) override;
417};
418
420{
422public:
424
426 QList<QQmlPartsModel *> models;
427};
428
431 public QQmlRefCounted<QQmlDelegateModelAttachedMetaObject>
432{
433public:
437
438 void objectDestroyed(QObject *) override;
439 int metaCall(QObject *, QMetaObject::Call, int _id, void **) override;
440
441private:
442 QQmlDelegateModelItemMetaType * const metaType;
443 QMetaObject * const metaObject;
444 const int memberPropertyOffset;
445 const int indexPropertyOffset;
446};
447
449
450#endif
[qjs-as-container]
\inmodule QtCore
Definition qhash.h:820
\inmodule QtCore Represents a handle to a signal-slot (or signal-functor) connection.
static QObjectPrivate * get(QObject *o)
Definition qobject_p.h:150
\inmodule QtCore
Definition qobject.h:103
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)
QQmlDelegateModelGroup * m_persistedItems
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.
void filterGroupChanged()
QList< QByteArray > watchedRoles() const
void reuseItem(QQmlDelegateModelItem *item, int newModelIndex)
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtCore
Definition qvariant.h:65
void statusChanged(QQmlComponent::Status status)
[1]
Definition qlogging.cpp:11
cache insert(employee->id(), employee)
QSet< QString >::iterator it
Combined button and popup list for selecting options.
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
@ Success
Definition main.cpp:3325
#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_REVISION(...)
#define Q_EMIT
#define Q_SIGNALS
#define Q_UNUSED(x)
ptrdiff_t qsizetype
Definition qtypes.h:165
unsigned int uint
Definition qtypes.h:34
#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)