diff options
Diffstat (limited to 'src/qmlmodels')
-rw-r--r-- | src/qmlmodels/qqmldelegatemodel.cpp | 86 | ||||
-rw-r--r-- | src/qmlmodels/qqmldelegatemodel_p_p.h | 25 | ||||
-rw-r--r-- | src/qmlmodels/qqmldmlistaccessordata.cpp | 3 | ||||
-rw-r--r-- | src/qmlmodels/qqmltableinstancemodel.cpp | 4 |
4 files changed, 84 insertions, 34 deletions
diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp index 51c875465e..032a7b71f9 100644 --- a/src/qmlmodels/qqmldelegatemodel.cpp +++ b/src/qmlmodels/qqmldelegatemodel.cpp @@ -16,6 +16,7 @@ #include <private/qqmlcomponent_p.h> #include <private/qqmlengine_p.h> #include <private/qqmlpropertytopropertybinding_p.h> +#include <private/qqmltableinstancemodel_p.h> #include <private/qquickpackage_p.h> #include <private/qv4functionobject_p.h> #include <private/qv4objectiterator_p.h> @@ -2250,11 +2251,34 @@ QQmlDelegateModelItemMetaType::QQmlDelegateModelItemMetaType( : model(model) , v4Engine(engine) , groupNames(groupNames) + , modelKind(ModelKind::DelegateModel) +{ +} + +QQmlDelegateModelItemMetaType::QQmlDelegateModelItemMetaType( + QV4::ExecutionEngine *engine, QQmlTableInstanceModel *model) + : model(model) + , v4Engine(engine) + , modelKind(ModelKind::TableInstanceModel) { } QQmlDelegateModelItemMetaType::~QQmlDelegateModelItemMetaType() = default; +void QQmlDelegateModelItemMetaType::emitModelChanged() const +{ + switch (modelKind) { + case ModelKind::InstanceModel: + break; + case ModelKind::DelegateModel: + emit static_cast<QQmlDelegateModel *>(model.data())->modelChanged(); + break; + case ModelKind::TableInstanceModel: + emit static_cast<QQmlTableInstanceModel *>(model.data())->modelChanged(); + break; + } +} + void QQmlDelegateModelItemMetaType::initializeAttachedMetaObject() { QMetaObjectBuilder builder; @@ -2417,10 +2441,11 @@ QV4::ReturnedValue QQmlDelegateModelItem::set_groups(const QV4::FunctionObject * if (!argc) THROW_TYPE_ERROR(); - if (!o->d()->item->metaType->model) + QQmlDelegateModel *delegateModel = o->d()->item->metaType->delegateModel(); + if (!delegateModel) RETURN_UNDEFINED(); - QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(o->d()->item->metaType->model); + QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(delegateModel); const int groupFlags = model->m_cacheMetaType->parseGroups(argv[0]); const int cacheIndex = model->m_cache.indexOf(o->d()->item); Compositor::iterator it = model->m_compositor.find(Compositor::Cache, cacheIndex); @@ -2435,16 +2460,16 @@ QV4::ReturnedValue QQmlDelegateModelItem::get_member(QQmlDelegateModelItem *this QV4::ReturnedValue QQmlDelegateModelItem::set_member(QQmlDelegateModelItem *cacheItem, uint flag, const QV4::Value &arg) { - if (!cacheItem->metaType->model) - return QV4::Encode::undefined(); - - QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(cacheItem->metaType->model); - bool member = arg.toBoolean(); uint groupFlag = (1 << flag); if (member == ((cacheItem->groups & groupFlag) != 0)) return QV4::Encode::undefined(); + QQmlDelegateModel *delegateModel = cacheItem->metaType->delegateModel(); + if (!delegateModel) + return QV4::Encode::undefined(); + + QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(delegateModel); const int cacheIndex = model->m_cache.indexOf(cacheItem); Compositor::iterator it = model->m_compositor.find(Compositor::Cache, cacheIndex); if (member) @@ -2510,8 +2535,8 @@ QQmlDelegateModelItem::~QQmlDelegateModelItem() Q_ASSERT(!object); if (incubationTask) { - if (metaType->model) - QQmlDelegateModelPrivate::get(metaType->model)->releaseIncubator(incubationTask); + if (QQmlDelegateModel *delegateModel = metaType->delegateModel()) + QQmlDelegateModelPrivate::get(delegateModel)->releaseIncubator(incubationTask); else delete incubationTask; } @@ -2523,10 +2548,9 @@ void QQmlDelegateModelItem::dispose() if (isReferenced()) return; - if (metaType->model) { - QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(metaType->model); - model->removeCacheItem(this); - } + if (QQmlDelegateModel *delegateModel = metaType->delegateModel()) + QQmlDelegateModelPrivate::get(delegateModel)->removeCacheItem(this); + delete this; } @@ -2607,9 +2631,8 @@ QQmlDelegateModelItem *QQmlDelegateModelItem::dataForObject(QObject *object) int QQmlDelegateModelItem::groupIndex(Compositor::Group group) { - if (QQmlDelegateModelPrivate * const model = metaType->model - ? QQmlDelegateModelPrivate::get(metaType->model) - : nullptr) { + if (QQmlDelegateModel *delegateModel = metaType->delegateModel()) { + QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(delegateModel); return model->m_compositor.find(Compositor::Cache, model->m_cache.indexOf(this)).index[group]; } return -1; @@ -2656,9 +2679,10 @@ int QQmlDelegateModelAttachedMetaObject::metaCall(QObject *object, QMetaObject:: } } else if (call == QMetaObject::WriteProperty) { if (_id >= memberPropertyOffset) { - if (!metaType->model) + QQmlDelegateModel *delegateModel = metaType->delegateModel(); + if (!delegateModel) return -1; - QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(metaType->model); + QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(delegateModel); Compositor::Group group = Compositor::Group(_id - memberPropertyOffset + 1); const int groupFlag = 1 << group; const bool member = attached->m_cacheItem->groups & groupFlag; @@ -2714,8 +2738,8 @@ void QQmlDelegateModelAttached::resetCurrentIndex() if (QQDMIncubationTask *incubationTask = m_cacheItem->incubationTask) { for (qsizetype i = 1, end = metaType->groupCount(); i <= end; ++i) m_currentIndex[i] = incubationTask->index[i]; - } else { - QQmlDelegateModelPrivate * const model = QQmlDelegateModelPrivate::get(m_cacheItem->metaType->model); + } else if (QQmlDelegateModel *delegateModel = metaType->delegateModel()) { + QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(delegateModel); Compositor::iterator it = model->m_compositor.find( Compositor::Cache, model->m_cache.indexOf(m_cacheItem)); for (qsizetype i = 1, end = metaType->groupCount(); i <= end; ++i) @@ -2745,9 +2769,14 @@ int QQmlDelegateModelAttached::persistedItemsIndex() const void QQmlDelegateModelAttached::setInGroup(QQmlListCompositor::Group group, bool inGroup) { - if (!(m_cacheItem && m_cacheItem->metaType && m_cacheItem->metaType->model)) + if (!m_cacheItem) + return; + + QQmlDelegateModel *delegateModel = m_cacheItem->metaType->delegateModel(); + if (!delegateModel) return; - QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(m_cacheItem->metaType->model); + + QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(delegateModel); const uint groupFlag = (1 << group); if (inGroup == bool(m_cacheItem->groups & groupFlag)) return; @@ -2791,7 +2820,7 @@ int QQmlDelegateModelAttached::itemsIndex() const QQmlDelegateModel *QQmlDelegateModelAttached::model() const { - return m_cacheItem ? m_cacheItem->metaType->model : nullptr; + return m_cacheItem ? m_cacheItem->metaType->delegateModel() : nullptr; } /*! @@ -2821,8 +2850,11 @@ void QQmlDelegateModelAttached::setGroups(const QStringList &groups) if (!m_cacheItem) return; - QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(m_cacheItem->metaType->model); + QQmlDelegateModel *delegateModel = m_cacheItem->metaType->delegateModel(); + if (!delegateModel) + return; + QQmlDelegateModelPrivate *model = QQmlDelegateModelPrivate::get(delegateModel); const int groupFlags = model->m_cacheMetaType->parseGroups(groups); const int cacheIndex = model->m_cache.indexOf(m_cacheItem); Compositor::iterator it = model->m_compositor.find(Compositor::Cache, cacheIndex); @@ -3177,10 +3209,8 @@ bool QQmlDelegateModelGroupPrivate::parseIndex(const QV4::Value &value, int *ind if (object) { QQmlDelegateModelItem * const cacheItem = object->d()->item; - if (QQmlDelegateModelPrivate *model = cacheItem->metaType->model - ? QQmlDelegateModelPrivate::get(cacheItem->metaType->model) - : nullptr) { - *index = model->m_cache.indexOf(cacheItem); + if (QQmlDelegateModel *delegateModel = cacheItem->metaType->delegateModel()) { + *index = QQmlDelegateModelPrivate::get(delegateModel)->m_cache.indexOf(cacheItem); *group = Compositor::Cache; return true; } diff --git a/src/qmlmodels/qqmldelegatemodel_p_p.h b/src/qmlmodels/qqmldelegatemodel_p_p.h index 367504d7fc..1eff54162a 100644 --- a/src/qmlmodels/qqmldelegatemodel_p_p.h +++ b/src/qmlmodels/qqmldelegatemodel_p_p.h @@ -37,12 +37,22 @@ typedef QQmlListCompositor Compositor; class QQmlDelegateModelAttachedMetaObject; class QQmlAbstractDelegateComponent; +class QQmlTableInstanceModel; class Q_QMLMODELS_EXPORT QQmlDelegateModelItemMetaType final : public QQmlRefCounted<QQmlDelegateModelItemMetaType> { public: - QQmlDelegateModelItemMetaType(QV4::ExecutionEngine *engine, QQmlDelegateModel *model, const QStringList &groupNames); + enum class ModelKind : quint8 { + InstanceModel, + DelegateModel, + TableInstanceModel, + }; + + QQmlDelegateModelItemMetaType( + QV4::ExecutionEngine *engine, QQmlDelegateModel *model, const QStringList &groupNames); + QQmlDelegateModelItemMetaType( + QV4::ExecutionEngine *engine, QQmlTableInstanceModel *model); ~QQmlDelegateModelItemMetaType(); void initializeAttachedMetaObject(); @@ -51,12 +61,23 @@ public: int parseGroups(const QStringList &groupNames) const; int parseGroups(const QV4::Value &groupNames) const; - QPointer<QQmlDelegateModel> model; + QQmlDelegateModel *delegateModel() const + { + return modelKind == ModelKind::DelegateModel + ? static_cast<QQmlDelegateModel *>(model.get()) + : nullptr; + } + qsizetype groupCount() const { return groupNames.size(); } + + void emitModelChanged() const; + + QPointer<QQmlInstanceModel> model; QV4::ExecutionEngine * const v4Engine; QQmlRefPointer<QQmlDelegateModelAttachedMetaObject> attachedMetaObject; const QStringList groupNames; QV4::PersistentValue modelItemProto; + ModelKind modelKind = ModelKind::InstanceModel; }; class QQmlAdaptorModel; diff --git a/src/qmlmodels/qqmldmlistaccessordata.cpp b/src/qmlmodels/qqmldmlistaccessordata.cpp index 99e1612f80..4eedb8b772 100644 --- a/src/qmlmodels/qqmldmlistaccessordata.cpp +++ b/src/qmlmodels/qqmldmlistaccessordata.cpp @@ -99,8 +99,7 @@ int VDMListDelegateDataType::metaCall( accessor->cachedDataClean = false; } else { model->list.set(accessor->index, data); - if (QQmlDelegateModel *delegateModel = accessor->metaType->model) - emit delegateModel->modelChanged(); + accessor->metaType->emitModelChanged(); } QMetaObject::activate(accessor, this, id - propertyOffset, nullptr); emit accessor->modelDataChanged(); diff --git a/src/qmlmodels/qqmltableinstancemodel.cpp b/src/qmlmodels/qqmltableinstancemodel.cpp index d07808ffe5..c19bcf3138 100644 --- a/src/qmlmodels/qqmltableinstancemodel.cpp +++ b/src/qmlmodels/qqmltableinstancemodel.cpp @@ -36,8 +36,8 @@ void QQmlTableInstanceModel::deleteModelItemLater(QQmlDelegateModelItem *modelIt QQmlTableInstanceModel::QQmlTableInstanceModel(QQmlContext *qmlContext, QObject *parent) : QQmlInstanceModel(*(new QObjectPrivate()), parent) , m_qmlContext(qmlContext) - , m_metaType(new QQmlDelegateModelItemMetaType(m_qmlContext->engine()->handle(), nullptr, QStringList()), - QQmlRefPointer<QQmlDelegateModelItemMetaType>::Adopt) + , m_metaType(QQml::makeRefPointer<QQmlDelegateModelItemMetaType>( + m_qmlContext->engine()->handle(), this)) { } |