30void QQmlListAccessor::setList(
const QVariant &v)
36 QMetaType variantsType = d.metaType();
37 if (variantsType == QMetaType::fromType<QJSValue>()) {
38 d = d.value<QJSValue>().toVariant();
39 variantsType = d.metaType();
47 if (variantsType == QMetaType::fromType<QStringList>()) {
52 if (variantsType == QMetaType::fromType<QList<QUrl>>()) {
57 if (variantsType == QMetaType::fromType<QVariantList>()) {
62 if (variantsType == QMetaType::fromType<QList<QObject *>>()) {
67 if (variantsType.flags() & QMetaType::IsQmlList) {
68 d = QVariant::fromValue(QQmlListReference(d));
69 m_type = ListProperty;
73 if (variantsType == QMetaType::fromType<QQmlListReference>()) {
74 m_type = ListProperty;
78 if (variantsType.flags() & QMetaType::PointerToQObject) {
83 if (
int i = 0; [&](){
bool ok =
false; i = v.toInt(&ok);
return ok;}()) {
92 const int upperLimit = 100 * 1000 * 1000;
95 qWarning(
"Model size of %d is less than 0", i);
100 if (i > upperLimit) {
101 qWarning(
"Model size of %d is bigger than the upper limit %d", i, upperLimit);
111 const QQmlType type = QQmlMetaType::qmlListType(variantsType);
112 if (type.isSequentialContainer()) {
113 m_metaSequence = type.listMetaSequence();
114 m_type = m_metaSequence.valueMetaType().flags().testFlag(QMetaType::PointerToQObject)
120 QSequentialIterable iterable;
121 if (QMetaType::convert(
122 variantsType, d.constData(),
123 QMetaType::fromType<QSequentialIterable>(), &iterable)) {
124 const QMetaSequence sequence = iterable.metaContainer();
126 if (sequence.hasSize() && sequence.canGetValueAtIndex()) {
128 m_metaSequence = sequence;
129 m_type = sequence.valueMetaType().flags().testFlag(QMetaType::PointerToQObject)
135 if (sequence.hasConstIterator() && sequence.canGetValueAtConstIterator()) {
138 QVariantList variantList;
139 for (
auto it = iterable.constBegin(), end = iterable.constEnd(); it != end; ++it)
140 variantList.push_back(*it);
141 d = std::move(variantList);
142 m_type = VariantList;
151qsizetype QQmlListAccessor::count()
const
155 Q_ASSERT(d.metaType() == QMetaType::fromType<QStringList>());
156 return reinterpret_cast<
const QStringList *>(d.constData())->size();
158 Q_ASSERT(d.metaType() == QMetaType::fromType<QList<QUrl>>());
159 return reinterpret_cast<
const QList<QUrl> *>(d.constData())->size();
161 Q_ASSERT(d.metaType() == QMetaType::fromType<QVariantList>());
162 return reinterpret_cast<
const QVariantList *>(d.constData())->size();
164 Q_ASSERT(d.metaType() == QMetaType::fromType<QList<QObject *>>());
165 return reinterpret_cast<
const QList<QObject *> *>(d.constData())->size();
167 Q_ASSERT(d.metaType() == QMetaType::fromType<QQmlListReference>());
168 return reinterpret_cast<
const QQmlListReference *>(d.constData())->count();
171 Q_ASSERT(m_metaSequence != QMetaSequence());
172 return m_metaSequence.size(d.constData());
176 return *
reinterpret_cast<
const int *>(d.constData());
180 Q_UNREACHABLE_RETURN(0);
183QVariant QQmlListAccessor::at(qsizetype idx)
const
185 Q_ASSERT(idx >= 0 && idx < count());
188 Q_ASSERT(d.metaType() == QMetaType::fromType<QStringList>());
189 return QVariant::fromValue(
reinterpret_cast<
const QStringList *>(d.constData())->at(idx));
191 Q_ASSERT(d.metaType() == QMetaType::fromType<QList<QUrl>>());
192 return QVariant::fromValue(
reinterpret_cast<
const QList<QUrl> *>(d.constData())->at(idx));
194 Q_ASSERT(d.metaType() == QMetaType::fromType<QVariantList>());
195 return reinterpret_cast<
const QVariantList *>(d.constData())->at(idx);
197 Q_ASSERT(d.metaType() == QMetaType::fromType<QList<QObject *>>());
198 return QVariant::fromValue(
reinterpret_cast<
const QList<QObject *> *>(d.constData())->at(idx));
200 Q_ASSERT(d.metaType() == QMetaType::fromType<QQmlListReference>());
201 return QVariant::fromValue(
reinterpret_cast<
const QQmlListReference *>(d.constData())->at(idx));
203 case ObjectSequence: {
204 Q_ASSERT(m_metaSequence != QMetaSequence());
206 const QMetaType valueMetaType = m_metaSequence.valueMetaType();
207 if (valueMetaType == QMetaType::fromType<QVariant>()) {
208 m_metaSequence.valueAtIndex(d.constData(), idx, &result);
210 result = QVariant(valueMetaType);
211 m_metaSequence.valueAtIndex(d.constData(), idx, result.data());
218 return QVariant(idx);
222 Q_UNREACHABLE_RETURN(QVariant());
225void QQmlListAccessor::set(qsizetype idx,
const QVariant &value)
227 Q_ASSERT(idx >= 0 && idx < count());
230 Q_ASSERT(d.metaType() == QMetaType::fromType<QStringList>());
231 (*
static_cast<QStringList *>(d.data()))[idx] = value.toString();
234 Q_ASSERT(d.metaType() == QMetaType::fromType<QList<QUrl>>());
235 (*
static_cast<QList<QUrl> *>(d.data()))[idx] = value.value<QUrl>();
238 Q_ASSERT(d.metaType() == QMetaType::fromType<QVariantList>());
239 (*
static_cast<QVariantList *>(d.data()))[idx] = value;
242 Q_ASSERT(d.metaType() == QMetaType::fromType<QList<QObject *>>());
243 (*
static_cast<QList<QObject *> *>(d.data()))[idx] = value.value<QObject *>();
246 Q_ASSERT(d.metaType() == QMetaType::fromType<QQmlListReference>());
247 static_cast<QQmlListReference *>(d.data())->replace(idx, value.value<QObject *>());
250 case ObjectSequence: {
251 Q_ASSERT(m_metaSequence != QMetaSequence());
252 const QMetaType valueMetaType = m_metaSequence.valueMetaType();
253 if (valueMetaType == QMetaType::fromType<QVariant>()) {
254 m_metaSequence.setValueAtIndex(d.data(), idx, &value);
255 }
else if (valueMetaType == value.metaType()) {
256 m_metaSequence.setValueAtIndex(d.data(), idx, value.constData());
258 QVariant converted = value;
259 converted.convert(valueMetaType);
260 m_metaSequence.setValueAtIndex(d.data(), idx, converted.constData());