9QQmlDMAbstractItemModelData::QQmlDMAbstractItemModelData(
10 const QQmlRefPointer<QQmlDelegateModelItemMetaType> &metaType,
11 VDMAbstractItemModelDataType *dataType,
int index,
int row,
int column)
12 : QQmlDelegateModelItem(metaType, dataType, index, row, column)
16 m_cachedData.resize(m_type->propertyRoles.size());
18 QObjectPrivate::get(
this)->metaObject = m_type;
23int QQmlDMAbstractItemModelData::metaCall(QMetaObject::Call call,
int id,
void **arguments)
25 if (call == QMetaObject::ReadProperty && id >= m_type->propertyOffset) {
26 const int propertyIndex = id - m_type->propertyOffset;
28 if (!m_cachedData.isEmpty())
29 *
static_cast<QVariant *>(arguments[0]) = m_cachedData.at(propertyIndex);
30 }
else if (*m_type->model) {
31 *
static_cast<QVariant *>(arguments[0]) = value(m_type->propertyRoles.at(propertyIndex));
34 }
else if (call == QMetaObject::WriteProperty && id >= m_type->propertyOffset) {
35 const int propertyIndex = id - m_type->propertyOffset;
36 const QMetaObject *meta = metaObject();
38 if (m_cachedData.size() > 1) {
39 m_cachedData[propertyIndex] = *
static_cast<QVariant *>(arguments[0]);
40 QMetaObject::activate(
this, meta, propertyIndex,
nullptr);
41 }
else if (m_cachedData.size() == 1) {
42 m_cachedData[0] = *
static_cast<QVariant *>(arguments[0]);
43 QMetaObject::activate(
this, meta, 0,
nullptr);
46 emit modelDataChanged();
47 }
else if (*m_type->model) {
48 setValue(m_type->propertyRoles.at(propertyIndex),
49 *
static_cast<QVariant *>(arguments[0]));
53 return qt_metacall(call, id, arguments);
57void QQmlDMAbstractItemModelData::setValue(
const QString &role,
const QVariant &value)
61 if (m_type->propertyRoles.size() == 1
62 && (role.isEmpty() || role == QLatin1String(
"modelData"))) {
64 m_cachedData[0] = value;
68 const auto it = m_type->roleNames.constFind(role.toUtf8());
69 if (it != m_type->roleNames.cend()) {
70 for (
int i = 0; i < m_type->propertyRoles.size(); ++i) {
71 if (m_type->propertyRoles.at(i) == *it) {
72 m_cachedData[i] = value;
79bool QQmlDMAbstractItemModelData::resolveIndex(
const QQmlAdaptorModel &adaptorModel,
int idx)
84 setModelIndex(idx, adaptorModel.rowAt(idx), adaptorModel.columnAt(idx));
85 const QMetaObject *meta = metaObject();
86 const int propertyCount = m_type->propertyRoles.size();
87 for (
int i = 0; i < propertyCount; ++i)
88 QMetaObject::activate(
this, meta, i,
nullptr);
89 emit modelDataChanged();
96QV4::ReturnedValue QQmlDMAbstractItemModelData::get_property(
const QV4::FunctionObject *b,
const QV4::Value *thisObject,
const QV4::Value *,
int)
99 QV4::Scoped<QQmlDelegateModelItemObject> o(scope, thisObject->as<QQmlDelegateModelItemObject>());
101 return scope.engine->throwTypeError(QStringLiteral(
"Not a valid DelegateModel object"));
103 const qsizetype propertyId =
static_cast<
const QV4::IndexedBuiltinFunction *>(b)->d()->index;
105 QQmlDMAbstractItemModelData *modelData =
static_cast<QQmlDMAbstractItemModelData *>(o->d()->item);
106 if (o->d()->item->modelIndex() == -1) {
107 if (!modelData->m_cachedData.isEmpty())
108 return scope.engine->fromVariant(modelData->m_cachedData.at(propertyId));
109 }
else if (*modelData->m_type->model) {
110 return scope.engine->fromVariant(
111 modelData->value(modelData->m_type->propertyRoles.at(propertyId)));
113 return QV4::Encode::undefined();
116QV4::ReturnedValue QQmlDMAbstractItemModelData::set_property(
const QV4::FunctionObject *b,
const QV4::Value *thisObject,
const QV4::Value *argv,
int argc)
119 QV4::Scoped<QQmlDelegateModelItemObject> o(scope, thisObject->as<QQmlDelegateModelItemObject>());
121 return scope.engine->throwTypeError(QStringLiteral(
"Not a valid DelegateModel object"));
123 return scope.engine->throwTypeError();
125 const qsizetype propertyId =
static_cast<
const QV4::IndexedBuiltinFunction *>(b)->d()->index;
127 if (o->d()->item->modelIndex() == -1) {
128 QQmlDMAbstractItemModelData *modelData =
static_cast<QQmlDMAbstractItemModelData *>(o->d()->item);
129 if (!modelData->m_cachedData.isEmpty()) {
130 if (modelData->m_cachedData.size() > 1) {
131 modelData->m_cachedData[propertyId]
132 = QV4::ExecutionEngine::toVariant(argv[0], QMetaType {});
133 QMetaObject::activate(o->d()->item, o->d()->item->metaObject(), propertyId,
nullptr);
134 }
else if (modelData->m_cachedData.size() == 1) {
135 modelData->m_cachedData[0] = QV4::ExecutionEngine::toVariant(argv[0], QMetaType {});
136 QMetaObject::activate(o->d()->item, o->d()->item->metaObject(), 0,
nullptr);
138 emit modelData->modelDataChanged();
141 return QV4::Encode::undefined();
144QV4::ReturnedValue QQmlDMAbstractItemModelData::get_modelData(
145 const QV4::FunctionObject *b,
const QV4::Value *thisObject,
146 const QV4::Value *argv,
int argc)
152 QV4::Scoped<QQmlDelegateModelItemObject> o(
153 scope, thisObject->as<QQmlDelegateModelItemObject>());
155 return scope.engine->throwTypeError(QStringLiteral(
"Not a valid DelegateModel object"));
157 return scope.engine->fromVariant(
158 static_cast<QQmlDMAbstractItemModelData *>(o->d()->item)->modelData());
161QV4::ReturnedValue QQmlDMAbstractItemModelData::set_modelData(
162 const QV4::FunctionObject *b,
const QV4::Value *thisObject,
163 const QV4::Value *argv,
int argc)
166 QV4::Scoped<QQmlDelegateModelItemObject> o(scope, thisObject->as<QQmlDelegateModelItemObject>());
168 return scope.engine->throwTypeError(QStringLiteral(
"Not a valid DelegateModel object"));
170 return scope.engine->throwTypeError();
172 static_cast<QQmlDMAbstractItemModelData *>(o->d()->item)->setModelData(
173 QV4::ExecutionEngine::toVariant(argv[0], QMetaType()));
175 return QV4::Encode::undefined();
192void QQmlDMAbstractItemModelData::setModelData(
const QVariant &modelData)
194 if (m_type->propertyRoles.size() != 1) {
195 qWarning() <<
"Cannot overwrite model object";
201 if (m_cachedData.isEmpty())
202 m_cachedData.append(modelData);
204 m_cachedData[0] = modelData;
206 setValue(m_type->propertyRoles[0], modelData);
209 QMetaObject::activate(
this, metaObject(), 0,
nullptr);
210 emit modelDataChanged();
232 aim->setData(aim->index(row, column, m_type->model->rootIndex), value, role);
235QV4::ReturnedValue QQmlDMAbstractItemModelData::get()
237 QV4::Scope scope(metaType->v4Engine);
238 if (m_type->prototype.isUndefined()) {
239 QQmlAdaptorModelEngineData *
const data = QQmlAdaptorModelEngineData::get(scope.engine);
240 m_type->initializeConstructor(data);
242 QV4::ScopedObject proto(scope, m_type->prototype.value());
243 QV4::ScopedObject o(scope, proto->engine()->memoryManager->allocate<QQmlDelegateModelItemObject>(
this));
244 o->setPrototypeOf(proto);
246 return o.asReturnedValue();