5#ifndef QQMLDMABSTRACTITEMMODELDATA_P_H
6#define QQMLDMABSTRACTITEMMODELDATA_P_H
19#include <private/qqmladaptormodelenginedata_p.h>
20#include <private/qqmldelegatemodel_p_p.h>
21#include <private/qobject_p.h>
25class VDMAbstractItemModelDataType;
29 Q_PROPERTY(
bool hasModelChildren READ hasModelChildren CONSTANT)
39 int metaCall(QMetaObject::Call call,
int id,
void **arguments);
43 void setValue(
const QString &role,
const QVariant &value)
override;
44 bool resolveIndex(
const QQmlAdaptorModel &model,
int idx)
override;
47 const QV4::FunctionObject *b,
const QV4::Value *thisObject,
48 const QV4::Value *argv,
int argc);
50 const QV4::FunctionObject *b,
const QV4::Value *thisObject,
51 const QV4::Value *argv,
int argc);
54 const QV4::FunctionObject *b,
const QV4::Value *thisObject,
55 const QV4::Value *argv,
int argc);
57 const QV4::FunctionObject *b,
const QV4::Value *thisObject,
58 const QV4::Value *argv,
int argc);
63 const VDMAbstractItemModelDataType *
type()
const {
return m_type; }
69 QVariant value(
int role)
const;
70 void setValue(
int role,
const QVariant &value);
72 VDMAbstractItemModelDataType *m_type;
73 QVector<QVariant> m_cachedData;
76class VDMAbstractItemModelDataType
final
77 :
public QQmlRefCounted<VDMAbstractItemModelDataType>
78 ,
public QQmlAdaptorModel::Accessors
79 ,
public QAbstractDynamicMetaObject
90 const QVarLengthArray<QQmlGuard<QQmlDMAbstractItemModelData>> &guardedItems,
91 int index, QQmlDelegateModel::DelegateModelAccess access)
const
93 for (
const auto &item : guardedItems) {
97 if (access == QQmlDelegateModel::DelegateModelAccess::ReadWrite) {
98 QQmlDelegateModelReadOnlyMetaObject readOnly(item, index + propertyOffset);
99 QMetaObject::activate(item, index + signalOffset,
nullptr);
101 QMetaObject::activate(item, index + signalOffset,
nullptr);
107 const QQmlAdaptorModel &model,
108 const QList<QQmlDelegateModelItem *> &items,
111 const QVector<
int> &roles)
const override
113 bool changed = roles.isEmpty() && !watchedRoles.isEmpty();
114 if (!changed && !watchedRoles.isEmpty() && watchedRoleIds.isEmpty()) {
116 for (
const QByteArray &r : watchedRoles) {
117 QHash<QByteArray,
int>::const_iterator it = roleNames.find(r);
118 if (it != roleNames.end())
119 roleIds << it.value();
121 const_cast<VDMAbstractItemModelDataType *>(
this)->watchedRoleIds = roleIds;
124 QVarLengthArray<QQmlGuard<QQmlDMAbstractItemModelData>> guardedItems;
125 for (
const auto item : items) {
126 Q_ASSERT(qobject_cast<QQmlDMAbstractItemModelData *>(item) == item);
127 const int idx = item->modelIndex();
128 if (idx >= index && idx < index + count)
129 guardedItems.append(
static_cast<QQmlDMAbstractItemModelData *>(item));
132 for (
int i = 0; i < roles.size(); ++i) {
133 const int role = roles.at(i);
134 if (!changed && watchedRoleIds.contains(role))
137 int propertyId = propertyRoles.indexOf(role);
138 if (propertyId != -1)
139 notifyItems(guardedItems, propertyId, model.delegateModelAccess);
142 if (roles.isEmpty()) {
143 const int propertyRolesCount = propertyRoles.size();
144 for (
int propertyId = 0; propertyId < propertyRolesCount; ++propertyId)
145 notifyItems(guardedItems, propertyId, model.delegateModelAccess);
148 for (
const auto &item : std::as_const(guardedItems)) {
150 emit item->modelDataChanged();
158 const QList<QByteArray> &oldRoles,
159 const QList<QByteArray> &newRoles)
const override
161 VDMAbstractItemModelDataType *dataType =
const_cast<VDMAbstractItemModelDataType *>(
this);
163 dataType->watchedRoleIds.clear();
164 for (
const QByteArray &oldRole : oldRoles)
165 dataType->watchedRoles.removeOne(oldRole);
166 dataType->watchedRoles += newRoles;
172 QV4::Scoped<QQmlDelegateModelItemObject> o(scope, thisObject->as<QQmlDelegateModelItemObject>());
174 RETURN_RESULT(scope.engine->throwTypeError(QStringLiteral(
"Not a valid DelegateModel object")));
176 const QQmlAdaptorModel *
const model
177 =
static_cast<QQmlDMAbstractItemModelData *>(o->d()->item)->type()->model;
178 if (o->d()->item->modelIndex() >= 0) {
179 if (
const QAbstractItemModel *
const aim = model->aim())
180 RETURN_RESULT(QV4::Encode(aim->hasChildren(
181 aim->index(o->d()->item->modelIndex(), 0, model->rootIndex))));
183 RETURN_RESULT(QV4::Encode(
false));
189 QV4::ExecutionEngine *v4 = data->v4;
190 QV4::Scope scope(v4);
191 QV4::ScopedObject proto(scope, v4->newObject());
192 proto->defineAccessorProperty(QStringLiteral(
"index"), QQmlAdaptorModelEngineData::get_index,
nullptr);
193 proto->defineAccessorProperty(QStringLiteral(
"hasModelChildren"), get_hasModelChildren,
nullptr);
194 proto->defineAccessorProperty(QStringLiteral(
"modelData"),
195 QQmlDMAbstractItemModelData::get_modelData,
196 QQmlDMAbstractItemModelData::set_modelData);
197 QV4::ScopedProperty p(scope);
199 typedef QHash<QByteArray,
int>::const_iterator iterator;
200 for (iterator it = roleNames.constBegin(), end = roleNames.constEnd(); it != end; ++it) {
201 const qsizetype propertyId = propertyRoles.indexOf(it.value());
202 const QByteArray &propertyName = it.key();
204 QV4::ScopedString name(scope, v4->newString(QString::fromUtf8(propertyName)));
205 QV4::ScopedFunctionObject g(
207 v4->memoryManager->allocate<QV4::IndexedBuiltinFunction>(
208 v4, propertyId, QQmlDMAbstractItemModelData::get_property));
209 QV4::ScopedFunctionObject s(
211 v4->memoryManager->allocate<QV4::IndexedBuiltinFunction>(
212 v4, propertyId, QQmlDMAbstractItemModelData::set_property));
215 proto->insertMember(name, p, QV4::Attr_Accessor|QV4::Attr_NotEnumerable|QV4::Attr_NotConfigurable);
217 prototype.set(v4, proto);
227 int metaCall(QObject *object, QMetaObject::Call call,
int id,
void **arguments)
override
232 int rowCount(
const QQmlAdaptorModel &model)
const override
234 if (
const QAbstractItemModel *aim = model.aim())
235 return aim->rowCount(model.rootIndex);
241 if (
const QAbstractItemModel *aim = model.aim())
242 return aim->columnCount(model.rootIndex);
246 void cleanup(QQmlAdaptorModel &)
const override
251 QVariant value(
const QQmlAdaptorModel &model,
int index,
const QString &role)
const override
254 VDMAbstractItemModelDataType *dataType =
const_cast<VDMAbstractItemModelDataType *>(
this);
255 dataType->initializeMetaObject(model);
258 if (
const QAbstractItemModel *aim = model.aim()) {
259 const QModelIndex modelIndex
260 = aim->index(model.rowAt(index), model.columnAt(index), model.rootIndex);
262 const auto it = roleNames.find(role.toUtf8()), end = roleNames.end();
263 if (it != roleNames.end())
264 return modelIndex.data(*it);
266 if (role.isEmpty() || role == QLatin1String(
"modelData")) {
267 if (roleNames.size() == 1)
268 return modelIndex.data(roleNames.begin().value());
270 QVariantMap modelData;
271 for (
auto jt = roleNames.begin(); jt != end; ++jt)
272 modelData.insert(QString::fromUtf8(jt.key()), modelIndex.data(jt.value()));
276 if (role == QLatin1String(
"hasModelChildren"))
277 return QVariant(aim->hasChildren(modelIndex));
284 if (
const QAbstractItemModel *aim = model.aim())
285 return QVariant::fromValue(aim->parent(model.rootIndex));
291 if (
const QAbstractItemModel *aim = model.aim())
292 return QVariant::fromValue(aim->index(model.rowAt(index), model.columnAt(index),
299 if (
const QAbstractItemModel *aim = model.aim())
300 return aim->canFetchMore(model.rootIndex);
306 if (QAbstractItemModel *aim = model.aim())
307 aim->fetchMore(model.rootIndex);
311 QQmlAdaptorModel &model,
312 const QQmlRefPointer<QQmlDelegateModelItemMetaType> &metaType,
313 int index,
int row,
int column)
override
316 initializeMetaObject(model);
322 QMetaObjectBuilder builder;
323 QQmlAdaptorModelEngineData::setModelDataType<QQmlDMAbstractItemModelData>(&builder,
this);
325 const QByteArray propertyType = QByteArrayLiteral(
"QVariant");
326 const QAbstractItemModel *aim = model.aim();
327 const QHash<
int, QByteArray> names = aim ? aim->roleNames() : QHash<
int, QByteArray>();
328 for (QHash<
int, QByteArray>::const_iterator it = names.begin(), cend = names.end(); it != cend; ++it) {
329 const int propertyId = propertyRoles.size();
330 propertyRoles.append(it.key());
331 roleNames.insert(it.value(), it.key());
332 QQmlAdaptorModelEngineData::addProperty(
333 &builder, propertyId, it.value(), propertyType,
334 model.delegateModelAccess != QQmlDelegateModel::ReadOnly);
337 metaObject.reset(builder.toMetaObject());
338 *
static_cast<QMetaObject *>(
this) = *metaObject;
339 propertyCache = QQmlPropertyCache::createStandalone(
340 metaObject.data(), model.modelItemRevision);
int metaCall(QMetaObject::Call call, int id, void **arguments)
static QV4::ReturnedValue get_modelData(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
void setValue(const QString &role, const QVariant &value) override
static QV4::ReturnedValue get_property(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
QV4::ReturnedValue get() override
static QV4::ReturnedValue set_property(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
void setModelData(const QVariant &modelData)
bool resolveIndex(const QQmlAdaptorModel &model, int idx) override
static QV4::ReturnedValue set_modelData(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
bool hasModelChildren() const
QVariant modelData() const
const VDMAbstractItemModelDataType * type() const
QVariant parentModelIndex(const QQmlAdaptorModel &model) const override
void cleanup(QQmlAdaptorModel &) const override
int columnCount(const QQmlAdaptorModel &model) const override
QList< int > propertyRoles
QV4::PersistentValue prototype
bool notify(const QQmlAdaptorModel &model, const QList< QQmlDelegateModelItem * > &items, int index, int count, const QVector< int > &roles) const override
QList< QByteArray > watchedRoles
QHash< QByteArray, int > roleNames
QVariant value(const QQmlAdaptorModel &model, int index, const QString &role) const override
static QV4::ReturnedValue get_hasModelChildren(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int)
int rowCount(const QQmlAdaptorModel &model) const override
bool canFetchMore(const QQmlAdaptorModel &model) const override
int metaCall(QObject *object, QMetaObject::Call call, int id, void **arguments) override
void initializeConstructor(QQmlAdaptorModelEngineData *const data)
void objectDestroyed(QObject *) override
VDMAbstractItemModelDataType(QQmlAdaptorModel *model)
void initializeMetaObject(const QQmlAdaptorModel &model)
QList< int > watchedRoleIds
void fetchMore(QQmlAdaptorModel &model) const override
QVariant modelIndex(const QQmlAdaptorModel &model, int index) const override
void replaceWatchedRoles(QQmlAdaptorModel &, const QList< QByteArray > &oldRoles, const QList< QByteArray > &newRoles) const override
void notifyItems(const QVarLengthArray< QQmlGuard< QQmlDMAbstractItemModelData > > &guardedItems, int index, QQmlDelegateModel::DelegateModelAccess access) const
QQmlDelegateModelItem * createItem(QQmlAdaptorModel &model, const QQmlRefPointer< QQmlDelegateModelItemMetaType > &metaType, int index, int row, int column) override