5#ifndef QQMLDMLISTACCESSORDATA_P_H
6#define QQMLDMLISTACCESSORDATA_P_H
19#include <private/qqmladaptormodelenginedata_p.h>
20#include <private/qqmldelegatemodel_p_p.h>
21#include <private/qobject_p.h>
25class VDMListDelegateDataType;
30 Q_PROPERTY(QVariant modelData READ modelData WRITE setModelData NOTIFY modelDataChanged)
48 QV4::ExecutionEngine *v4 = b->engine();
49 const QQmlDelegateModelItemObject *o = thisObject->as<QQmlDelegateModelItemObject>();
51 return v4->throwTypeError(QStringLiteral(
"Not a valid DelegateModel object"));
58 QV4::ExecutionEngine *v4 = b->engine();
59 const QQmlDelegateModelItemObject *o = thisObject->as<QQmlDelegateModelItemObject>();
61 return v4->throwTypeError(QStringLiteral(
"Not a valid DelegateModel object"));
63 return v4->throwTypeError();
65 static_cast<QQmlDMListAccessorData *>(o->d()->item)->setModelData(
66 QV4::ExecutionEngine::toVariant(argv[0], QMetaType {}));
67 return QV4::Encode::undefined();
72 QV4::Scope scope(metaType->v4Engine);
73 QQmlAdaptorModelEngineData *data = QQmlAdaptorModelEngineData::get(scope.engine);
75 scope, scope.engine->memoryManager->allocate<QQmlDelegateModelItemObject>(
this));
76 QV4::ScopedObject p(scope, data->listItemProto.value());
79 return o.asReturnedValue();
82 void setValue(
const QString &role,
const QVariant &value)
override;
83 bool resolveIndex(
const QQmlAdaptorModel &model,
int idx)
override;
93 bool cachedDataClean =
false;
106 QQmlAdaptorModelEngineData::setModelDataType<QQmlDMListAccessorData>(&builder,
this);
107 metaObject.reset(builder.toMetaObject());
108 *
static_cast<QMetaObject *>(
this) = *metaObject.data();
111 void cleanup(QQmlAdaptorModel &)
const override
116 int rowCount(
const QQmlAdaptorModel &model)
const override
118 return model.list.count();
123 switch (model.list.type()) {
124 case QQmlListAccessor::Invalid:
126 case QQmlListAccessor::StringList:
127 case QQmlListAccessor::UrlList:
128 case QQmlListAccessor::Integer:
135 return std::max(1, propertyCount() - propertyOffset);
140 if (
const QMetaObject *metaObject = type.metaObject())
145 if (
const QQmlValueType *valueType = QQmlMetaType::valueType(type))
146 return valueType->staticMetaObject();
151 template<
typename String>
154 if constexpr (std::is_same_v<String, QString>)
156 else if constexpr (std::is_same_v<String, QByteArray>)
157 return QString::fromUtf8(string);
158 else if constexpr (std::is_same_v<String,
const char *>)
159 return QString::fromUtf8(string);
160 Q_UNREACHABLE_RETURN(QString());
163 template<
typename String>
166 if constexpr (std::is_same_v<String, QString>)
167 return string.toUtf8();
168 else if constexpr (std::is_same_v<String, QByteArray>)
170 else if constexpr (std::is_same_v<String,
const char *>)
171 return QByteArray::fromRawData(string, qstrlen(string));
172 Q_UNREACHABLE_RETURN(QByteArray());
175 template<
typename String>
178 const QMetaType type = row->metaType();
179 if (type == QMetaType::fromType<QVariantMap>())
180 return row->toMap().value(toQString(role));
182 if (type == QMetaType::fromType<QVariantHash>())
183 return row->toHash().value(toQString(role));
185 const QMetaType::TypeFlags typeFlags = type.flags();
186 if (typeFlags & QMetaType::PointerToQObject)
187 return row->value<QObject *>()->property(toUtf8(role));
189 if (
const QMetaObject *metaObject = metaObjectFromType(type)) {
190 const int propertyIndex = metaObject->indexOfProperty(toUtf8(role));
191 if (propertyIndex >= 0)
192 return metaObject->property(propertyIndex).readOnGadget(row->constData());
198 template<
typename String>
201 for (
int i = 0, end = propertyCount(); i < end; ++i) {
202 if (QAnyStringView(property(i).name()) == QAnyStringView(string))
211 const QMetaType type = row->metaType();
212 if (type == QMetaType::fromType<QVariantMap>()) {
213 const QVariantMap map = row->toMap();
214 for (
auto it = map.keyBegin(), end = map.keyEnd(); it != end; ++it)
215 createPropertyIfMissing(*it);
216 }
else if (type == QMetaType::fromType<QVariantHash>()) {
217 const QVariantHash map = row->toHash();
218 for (
auto it = map.keyBegin(), end = map.keyEnd(); it != end; ++it)
219 createPropertyIfMissing(*it);
220 }
else if (type.flags() & QMetaType::PointerToQObject) {
221 const QMetaObject *metaObject = row->value<QObject *>()->metaObject();
222 for (
int i = 0, end = metaObject->propertyCount(); i < end; ++i)
223 createPropertyIfMissing(metaObject->property(i).name());
224 }
else if (
const QMetaObject *metaObject = metaObjectFromType(type)) {
225 for (
int i = 0, end = metaObject->propertyCount(); i < end; ++i)
226 createPropertyIfMissing(metaObject->property(i).name());
230 template<
typename String>
231 static void setValue(QVariant *row,
const String &role,
const QVariant &value)
233 const QMetaType type = row->metaType();
234 if (type == QMetaType::fromType<QVariantMap>()) {
235 static_cast<QVariantMap *>(row->data())->insert(toQString(role), value);
236 }
else if (type == QMetaType::fromType<QVariantHash>()) {
237 static_cast<QVariantHash *>(row->data())->insert(toQString(role), value);
238 }
else if (type.flags() & QMetaType::PointerToQObject) {
239 row->value<QObject *>()->setProperty(toUtf8(role), value);
240 }
else if (
const QMetaObject *metaObject = metaObjectFromType(type)) {
241 const int propertyIndex = metaObject->indexOfProperty(toUtf8(role));
242 if (propertyIndex >= 0)
243 metaObject->property(propertyIndex).writeOnGadget(row->data(), value);
247 QVariant value(
const QQmlAdaptorModel &model,
int index,
const QString &role)
const override
249 const QVariant entry = model.list.at(index);
250 if (role == QLatin1String(
"modelData") || role.isEmpty())
253 return value(&entry, role);
257 QQmlAdaptorModel &model,
258 const QQmlRefPointer<QQmlDelegateModelItemMetaType> &metaType,
259 int index,
int row,
int column)
override
261 const QVariant value = (index >= 0 && index < model.list.count())
262 ? model.list.at(index)
267 bool notify(
const QQmlAdaptorModel &model,
const QList<QQmlDelegateModelItem *> &items,
int index,
int count,
const QVector<
int> &)
const override
269 for (
auto modelItem : items) {
270 const int modelItemIndex = modelItem->modelIndex();
271 if (modelItemIndex < index || modelItemIndex >= index + count)
274 auto listModelItem =
static_cast<QQmlDMListAccessorData *>(modelItem);
275 QVariant updatedModelData = model.list.at(listModelItem->modelIndex());
276 listModelItem->setModelData(updatedModelData);
283 int metaCall(QObject *object, QMetaObject::Call call,
int id,
void **arguments)
final;
285#if QT_VERSION >= QT_VERSION_CHECK(7
, 0
, 0
)
288 QMetaObject *toDynamicMetaObject(QObject *accessors)
final;
void setModelData(const QVariant &data)
bool resolveIndex(const QQmlAdaptorModel &model, int idx) override
~QQmlDMListAccessorData()
QVariant modelData() const
void setValue(const QString &role, const QVariant &value) override
static QV4::ReturnedValue get_modelData(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *, int)
static QV4::ReturnedValue set_modelData(const QV4::FunctionObject *b, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
QV4::ReturnedValue get() override
void emitAllSignals(QQmlDMListAccessorData *accessor) const
void createMissingProperties(const QVariant *row)
int rowCount(const QQmlAdaptorModel &model) const override
const QMetaObject * toDynamicMetaObject(QObject *accessors) const final
bool notify(const QQmlAdaptorModel &model, const QList< QQmlDelegateModelItem * > &items, int index, int count, const QVector< int > &) const override
VDMListDelegateDataType(QQmlAdaptorModel *model)
int createProperty(const char *name, const char *) final
static const QMetaObject * metaObjectFromType(QMetaType type)
QMetaObjectBuilder builder
static QString toQString(const String &string)
QQmlDelegateModelItem * createItem(QQmlAdaptorModel &model, const QQmlRefPointer< QQmlDelegateModelItemMetaType > &metaType, int index, int row, int column) override
int metaCall(QObject *object, QMetaObject::Call call, int id, void **arguments) final
static QVariant value(const QVariant *row, const String &role)
void createPropertyIfMissing(const String &string)
QVariant value(const QQmlAdaptorModel &model, int index, const QString &role) const override
static QByteArray toUtf8(const String &string)
int columnCount(const QQmlAdaptorModel &model) const override
static void setValue(QVariant *row, const String &role, const QVariant &value)
void cleanup(QQmlAdaptorModel &) const override