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;
27 if (!hasValidModelIndex()) {
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();
37 if (!hasValidModelIndex()) {
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)
81 if (hasValidModelIndex())
86 setModelIndex(idx, adaptorModel.rowAt(idx), adaptorModel.columnAt(idx));
87 const QMetaObject *meta = metaObject();
88 const int propertyCount = m_type->propertyRoles.size();
89 for (
int i = 0; i < propertyCount; ++i)
90 QMetaObject::activate(
this, meta, i,
nullptr);
91 emit modelDataChanged();
95QV4::ReturnedValue QQmlDMAbstractItemModelData::get_property(
const QV4::FunctionObject *b,
const QV4::Value *thisObject,
const QV4::Value *,
int)
98 QV4::Scoped<QQmlDelegateModelItemObject> o(scope, thisObject->as<QQmlDelegateModelItemObject>());
100 return scope.engine->throwTypeError(QStringLiteral(
"Not a valid DelegateModel object"));
102 const qsizetype propertyId =
static_cast<
const QV4::IndexedBuiltinFunction *>(b)->d()->index;
104 QQmlDelegateModelItem *item = o->d()->item();
105 QQmlDMAbstractItemModelData *modelData =
static_cast<QQmlDMAbstractItemModelData *>(item);
106 if (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 QQmlDelegateModelItem *item = o->d()->item();
128 if (item->modelIndex() == -1) {
129 QQmlDMAbstractItemModelData *modelData =
static_cast<QQmlDMAbstractItemModelData *>(item);
130 if (!modelData->m_cachedData.isEmpty()) {
131 if (modelData->m_cachedData.size() > 1) {
132 modelData->m_cachedData[propertyId]
133 = QV4::ExecutionEngine::toVariant(argv[0], QMetaType {});
134 QMetaObject::activate(item, item->metaObject(), propertyId,
nullptr);
135 }
else if (modelData->m_cachedData.size() == 1) {
136 modelData->m_cachedData[0] = QV4::ExecutionEngine::toVariant(argv[0], QMetaType {});
137 QMetaObject::activate(item, item->metaObject(), 0,
nullptr);
139 emit modelData->modelDataChanged();
142 return QV4::Encode::undefined();
145QV4::ReturnedValue QQmlDMAbstractItemModelData::get_modelData(
146 const QV4::FunctionObject *b,
const QV4::Value *thisObject,
147 const QV4::Value *argv,
int argc)
153 QV4::Scoped<QQmlDelegateModelItemObject> o(
154 scope, thisObject->as<QQmlDelegateModelItemObject>());
156 return scope.engine->throwTypeError(QStringLiteral(
"Not a valid DelegateModel object"));
158 return scope.engine->fromVariant(
159 static_cast<QQmlDMAbstractItemModelData *>(o->d()->item())->modelData());
162QV4::ReturnedValue QQmlDMAbstractItemModelData::set_modelData(
163 const QV4::FunctionObject *b,
const QV4::Value *thisObject,
164 const QV4::Value *argv,
int argc)
167 QV4::Scoped<QQmlDelegateModelItemObject> o(scope, thisObject->as<QQmlDelegateModelItemObject>());
169 return scope.engine->throwTypeError(QStringLiteral(
"Not a valid DelegateModel object"));
171 return scope.engine->throwTypeError();
173 static_cast<QQmlDMAbstractItemModelData *>(o->d()->item())->setModelData(
174 QV4::ExecutionEngine::toVariant(argv[0], QMetaType()));
176 return QV4::Encode::undefined();
179QVariant QQmlDMAbstractItemModelData::modelData()
const
181 if (m_type->propertyRoles.size() == 1) {
183 return hasValidModelIndex()
184 ? value(m_type->propertyRoles[0])
185 : m_cachedData.isEmpty() ? QVariant() : m_cachedData[0];
188 return usesStructuredModelData()
189 ? QVariant::fromValue(
this)
193void QQmlDMAbstractItemModelData::setModelData(
const QVariant &modelData)
195 if (m_type->propertyRoles.size() != 1) {
196 qWarning() <<
"Cannot overwrite model object";
201 if (hasValidModelIndex()) {
202 setValue(m_type->propertyRoles[0], modelData);
204 if (m_cachedData.isEmpty())
205 m_cachedData.append(modelData);
207 m_cachedData[0] = modelData;
210 QMetaObject::activate(
this, metaObject(), 0,
nullptr);
211 emit modelDataChanged();
235 aim->setData(aim->index(modelRow(), modelColumn(), m_type->model->rootIndex), value, role);
238QV4::ReturnedValue QQmlDMAbstractItemModelData::get()
240 QV4::Scope scope(metaType()->v4Engine);
241 if (m_type->prototype.isUndefined()) {
242 QQmlAdaptorModelEngineData *
const data = QQmlAdaptorModelEngineData::get(scope.engine);
243 m_type->initializeConstructor(data);
245 QV4::ScopedObject proto(scope, m_type->prototype.value());
246 QV4::ScopedObject o(scope, proto->engine()->memoryManager->allocate<QQmlDelegateModelItemObject>(
this));
247 o->setPrototypeOf(proto);
248 return o.asReturnedValue();