5#ifndef QQMLDATAMODEL_P_P_H
6#define QQMLDATAMODEL_P_P_H
9#include <private/qv4qobjectwrapper_p.h>
11#include <QtQml/qqmlcontext.h>
12#include <QtQml/qqmlincubator.h>
14#include <private/qqmladaptormodel_p.h>
15#include <private/qqmlopenmetaobject_p.h>
17#include <QtCore/qloggingcategory.h>
18#include <QtCore/qpointer.h>
39class QQmlDelegateModelAttachedMetaObject;
40class QQmlAbstractDelegateComponent;
41class QQmlTableInstanceModel;
43class Q_QMLMODELS_EXPORT QQmlDelegateModelItemMetaType final
44 :
public QQmlRefCounted<QQmlDelegateModelItemMetaType>
47 enum class ModelKind : quint8 {
53 QQmlDelegateModelItemMetaType(
54 QV4::ExecutionEngine *engine, QQmlDelegateModel *model,
const QStringList &groupNames);
55 QQmlDelegateModelItemMetaType(
56 QV4::ExecutionEngine *engine, QQmlTableInstanceModel *model);
57 ~QQmlDelegateModelItemMetaType();
59 void initializeAttachedMetaObject();
60 void initializePrototype();
62 int parseGroups(
const QStringList &groupNames)
const;
63 int parseGroups(
const QV4::Value &groupNames)
const;
65 QQmlDelegateModel *delegateModel()
const
67 return modelKind == ModelKind::DelegateModel
68 ?
static_cast<QQmlDelegateModel *>(model.get())
72 qsizetype groupCount()
const {
return groupNames.size(); }
74 void emitModelChanged()
const;
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;
84class QQmlAdaptorModel;
90 Q_PROPERTY(
int index READ modelIndex NOTIFY modelIndexChanged)
104 return --objectRef == 0 && !(groups & Compositor::PersistedFlag);
112 || ((groups & Compositor::UnresolvedFlag) && (groups & Compositor::GroupMask));
128 virtual void setModelIndex(
int idx,
int newRow,
int newColumn,
bool alwaysEmit =
false);
132 virtual void setValue(
const QString &role,
const QVariant &value) { Q_UNUSED(role); Q_UNUSED(value); }
133 virtual bool resolveIndex(
const QQmlAdaptorModel &,
int) {
return false; }
136 static QV4::
ReturnedValue get_model(
const QV4::FunctionObject *,
const QV4::Value *thisObject,
const QV4::Value *argv,
int argc);
137 static QV4::
ReturnedValue get_groups(
const QV4::FunctionObject *,
const QV4::Value *thisObject,
const QV4::Value *argv,
int argc);
138 static QV4::
ReturnedValue set_groups(
const QV4::FunctionObject *,
const QV4::Value *thisObject,
const QV4::Value *argv,
int argc);
157 QQmlData *ddata = QQmlData::get(object);
158 if (!ddata || !ddata->hasExtendedData())
161 return static_cast<QQmlDelegateModelAttached *>(
162 ddata->attachedProperties()->value(
163 QQmlPrivate::attachedPropertiesFunc<QQmlDelegateModel>()));
170 return std::exchange(d_ptr->metaObject, metaObject);
216 void drain(
int maxPoolTime, std::function<
void(QQmlDelegateModelItem *cacheItem)> releaseItem);
219 Q_ASSERT(m_reusableItemsPool.size() <= MaxSize);
220 return int(m_reusableItemsPool.size());
232 std::vector<PoolItem> m_reusableItemsPool;
235template<
typename Target>
279 QDynamicMetaObjectData *original =
nullptr;
280 int readOnlyProperty = -1;
294 QQmlDelegateModel::DelegateModelAccess access);
323 Q_DECLARE_PUBLIC(QQmlDelegateModelGroup)
336 void initPackage(
int index, QQuickPackage *package);
339 bool parseIndex(
const QV4::Value &value,
int *index, Compositor::Group *group)
const;
341 QQmlV4FunctionPtr args, Compositor::Group *group,
int *index,
int *count,
int *groups)
const;
355 Q_DECLARE_PUBLIC(QQmlDelegateModel)
361 return static_cast<QQmlDelegateModelPrivate *>(QObjectPrivate::get(m));
370 QObject *
object(Compositor::Group group,
int index, QQmlIncubator::IncubationMode incubationMode);
376 Q_EMIT q_func()->createdItem(incubationTask->index[m_compositorGroup], item); }
378 Q_EMIT q_func()->initItem(incubationTask->index[m_compositorGroup], item); }
390 void addGroups(Compositor::iterator from,
int count, Compositor::Group group,
int groupFlags);
391 void removeGroups(Compositor::iterator from,
int count, Compositor::Group group,
int groupFlags);
392 void setGroups(Compositor::iterator from,
int count, Compositor::Group group,
int groupFlags);
395 const QVector<Compositor::Insert> &inserts,
396 QVarLengthArray<QVector<QQmlChangeSet::Change>, Compositor::MaximumGroupCount> *translatedInserts,
397 QHash<
int, QList<QQmlDelegateModelItem *> > *movedItems =
nullptr);
398 void itemsInserted(
const QVector<Compositor::Insert> &inserts);
400 const QVector<Compositor::Remove> &removes,
401 QVarLengthArray<QVector<QQmlChangeSet::Change>, Compositor::MaximumGroupCount> *translatedRemoves,
402 QHash<
int, QList<QQmlDelegateModelItem *> > *movedItems =
nullptr);
403 void itemsRemoved(
const QVector<Compositor::Remove> &removes);
405 const QVector<Compositor::Remove> &removes,
const QVector<Compositor::Insert> &inserts);
406 void itemsChanged(
const QVector<Compositor::Change> &changes);
420 static void group_append(QQmlListProperty<QQmlDelegateModelGroup> *property, QQmlDelegateModelGroup *group);
422 static QQmlDelegateModelGroup *
group_at(QQmlListProperty<QQmlDelegateModelGroup> *property, qsizetype index);
462 QQmlDelegateModelGroup *
m_groups[Compositor::MaximumGroupCount];
469 Q_PROPERTY(QString filterOnGroup READ filterGroup WRITE setFilterGroup NOTIFY filterGroupChanged RESET resetFilterGroup FINAL)
489 int indexOf(QObject *item, QObject *objectContext)
const override;
494 void initPackage(
int index, QQuickPackage *package)
override;
501 QQmlDelegateModel *m_model;
502 QMultiHash<QObject *, QQuickPackage *> m_packaged;
504 QString m_filterGroup;
505 QList<QByteArray> m_watchedRoles;
506 QVector<
int> m_pendingPackageInitializations;
507 Compositor::Group m_compositorGroup;
509 bool m_modelUpdatePending =
true;
512class QMetaPropertyBuilder;
534class QQmlDelegateModelAttachedMetaObject
final
535 :
public QAbstractDynamicMetaObject,
536 public QQmlRefCounted<QQmlDelegateModelAttachedMetaObject>
540 QQmlDelegateModelItemMetaType *metaType, QMetaObject *metaObject);
547 QQmlDelegateModelItemMetaType *
const metaType;
548 QMetaObject *
const metaObject;
549 const int memberPropertyOffset;
550 const int indexPropertyOffset;
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
QQmlDelegateModelAttached(QQmlDelegateModelItem *cacheItem, QObject *parent)
void setInItems(bool inItems)
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)
~QQmlDelegateModelAttached()
QQmlDelegateModel * model() const
\qmlattachedproperty model QtQml.Models::DelegateModel::model
QStringList groups() const
\qmlattachedproperty stringlist QtQml.Models::DelegateModel::groups
int persistedItemsIndex() const
QQmlDelegateModelItem * m_cacheItem
bool inPersistedItems() const
~QQmlDelegateModelEngineData()
QV4::PersistentValue changeProto
QV4::ReturnedValue array(QV4::ExecutionEngine *engine, const QVector< QQmlChangeSet::Change > &changes)
QQmlDelegateModelEngineData(QV4::ExecutionEngine *v4)
virtual void initPackage(int, QQuickPackage *)
virtual void destroyingPackage(QQuickPackage *)
virtual ~QQmlDelegateModelGroupEmitter()
virtual void emitModelUpdated(const QQmlChangeSet &changeSet, bool reset)=0
virtual void createdPackage(int, QQuickPackage *)
QIntrusiveListNode emitterNode
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
bool isChangedConnected()
void initPackage(int index, QQuickPackage *package)
void emitModelUpdated(bool reset)
QQmlDelegateModelGroupEmitterList emitters
void destroyingPackage(QQuickPackage *package)
void emitChanges(QV4::ExecutionEngine *engine)
void disableStructuredModelData()
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)
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)
QDynamicMetaObjectData * exchangeMetaObject(QDynamicMetaObjectData *metaObject)
virtual bool resolveIndex(const QQmlAdaptorModel &, int)
bool useStructuredModelData
QQmlRefPointer< QQmlDelegateModelItemMetaType > metaType
static QQmlDelegateModelItem * dataForObject(QObject *object)
static QV4::ReturnedValue get_model(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
bool isReferenced() const
virtual void setModelIndex(int idx, int newRow, int newColumn, bool alwaysEmit=false)
virtual QQmlRefPointer< QQmlContextData > initProxy()
bool isObjectReferenced() const
QQmlRefPointer< QQmlContextData > contextData
QQmlDelegateModelAttached * attached() const
static QV4::ReturnedValue set_groups(const QV4::FunctionObject *, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
QPointer< QObject > object
Q_REVISION(2, 12) void rowChanged()
void objectDestroyed(QObject *)
QList< QQmlPartsModel * > models
QQmlDelegateModel * model
void setInitialState(QQDMIncubationTask *incubationTask, QObject *o)
void removeCacheItem(QQmlDelegateModelItem *cacheItem)
QVariant variantValue(Compositor::Group group, int index, const QString &name)
bool m_incubatorCleanupScheduled
void emitCreatedPackage(QQDMIncubationTask *incubationTask, QQuickPackage *package)
QList< QQDMIncubationTask * > m_finishedIncubating
void connectModel(QQmlAdaptorModel *model)
QList< QQmlDelegateModelItem * > m_cache
QQmlDelegateModelParts * m_parts
static qsizetype group_count(QQmlListProperty< QQmlDelegateModelGroup > *property)
QList< QByteArray > m_watchedRoles
QQmlAbstractDelegateComponent * m_delegateChooser
void itemsRemoved(const QVector< Compositor::Remove > &removes)
QPointer< QQmlContext > m_context
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)
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 connectToAbstractItemModel()
int adaptorModelCount() const
InsertionResult insert(Compositor::insert_iterator &before, const QV4::Value &object, int groups)
void itemsRemoved(const QVector< Compositor::Remove > &removes, QVarLengthArray< QVector< QQmlChangeSet::Change >, Compositor::MaximumGroupCount > *translatedRemoves, QHash< int, QList< QQmlDelegateModelItem * > > *movedItems=nullptr)
void setGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags)
void itemsInserted(const QVector< Compositor::Insert > &inserts, QVarLengthArray< QVector< QQmlChangeSet::Change >, Compositor::MaximumGroupCount > *translatedInserts, QHash< int, QList< QQmlDelegateModelItem * > > *movedItems=nullptr)
void delegateChanged(bool add=true, bool remove=true)
QQmlListCompositor m_compositor
QQmlDelegateModelGroup * m_items
void releaseIncubator(QQDMIncubationTask *incubationTask)
bool m_waitingToFetchMore
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)
void requestMoreIfNecessary()
QQmlComponent * resolveDelegate(int index)
QMetaObject::Connection m_delegateChooserChanged
QQmlDelegateModelGroup * m_groups[Compositor::MaximumGroupCount]
void itemsChanged(const QVector< Compositor::Change > &changes)
void removeGroups(Compositor::iterator from, int count, Compositor::Group group, int groupFlags)
void itemsInserted(const QVector< Compositor::Insert > &inserts)
void disconnectFromAbstractItemModel()
QQmlReusableDelegateModelItemsPool m_reusableItemsPool
void itemsMoved(const QVector< Compositor::Remove > &removes, const QVector< Compositor::Insert > &inserts)
QQmlAdaptorModel m_adaptorModel
~QQmlDelegateModelPrivate()
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)
QT_REQUIRE_CONFIG(animation)
QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(lcEventDispatcher)
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 QVector< QQmlChangeSet::Change > &changes)
QVector< QQmlChangeSet::Change > * changes
QQmlChangeSet::ChangeData change
QQmlDelegateModelItem * item
void init(QQmlDelegateModelItem *item)