24void QQmlInstantiatorPrivate::clear()
26 Q_Q(QQmlInstantiator);
30 if (objects.isEmpty())
33 for (
int i=0; i < objects.size(); i++) {
34 QObject *object = objects[i];
35 emit q->objectRemoved(i, object);
36 model->release(object);
37 if (object && object->parent() == q)
38 object->setParent(
nullptr);
42 emit q->objectChanged();
54void QQmlInstantiatorPrivate::regenerate()
56 Q_Q(QQmlInstantiator);
57 if (!componentComplete)
60 int prevCount = q->count();
64 if (!active || !model || !model->count() || !model->isValid()) {
70 for (
int i = 0; i < model->count(); i++) {
71 QObject *object = modelObject(i, async);
74 _q_createdItem(i, object);
76 if (q->count() != prevCount)
80void QQmlInstantiatorPrivate::_q_createdItem(
int idx, QObject* item)
82 Q_Q(QQmlInstantiator);
83 if (objects.contains(item))
85 if (requestedIndex != idx)
86 (
void)model->object(idx);
89 if (objects.size() < idx + 1) {
90 int modelCount = model->count();
91 if (objects.capacity() < modelCount)
92 objects.reserve(modelCount);
93 objects.resize(idx + 1);
95 if (QObject *o = objects.at(idx))
97 objects.replace(idx, item);
98 if (objects.size() == 1)
100 q->objectAdded(idx, item);
103void QQmlInstantiatorPrivate::_q_modelUpdated(
const QQmlChangeSet &changeSet,
bool reset)
105 Q_Q(QQmlInstantiator);
107 if (!componentComplete || !active)
112 if (changeSet.difference() != 0)
118 QHash<
int, QVector<QPointer<QObject> > > moved;
119 const QVector<QQmlChangeSet::Change> &removes = changeSet.removes();
120 for (
const QQmlChangeSet::Change &remove : removes) {
121 int index = qMin(remove.index, objects.size());
122 int count = qMin(remove.index + remove.count, objects.size()) - index;
123 if (remove.isMove()) {
124 moved.insert(remove.moveId, objects.mid(index, count));
126 objects.begin() + index,
127 objects.begin() + index + count);
128 }
else while (count--) {
129 QObject *obj = objects.at(index);
130 objects.remove(index);
131 q->objectRemoved(index, obj);
136 difference -= remove.count;
139 const QVector<QQmlChangeSet::Change> &inserts = changeSet.inserts();
140 for (
const QQmlChangeSet::Change &insert : inserts) {
141 int index = qMin(insert.index, objects.size());
142 if (insert.isMove()) {
143 QVector<QPointer<QObject> > movedObjects = moved.value(insert.moveId);
144 objects = objects.mid(0, index) + movedObjects + objects.mid(index);
146 if (insert.index <= objects.size())
147 objects.insert(insert.index, insert.count,
nullptr);
148 for (
int i = 0; i < insert.count; ++i) {
149 int modelIndex = index + i;
150 QObject* obj = modelObject(modelIndex, async);
152 _q_createdItem(modelIndex, obj);
155 difference += insert.count;
342void QQmlInstantiator::setModel(
const QVariant &m)
344 Q_D(QQmlInstantiator);
346 if (model.userType() == qMetaTypeId<QJSValue>())
347 model = model.value<QJSValue>().toVariant();
349 QQmlDelegateModelPointer oldModel(d->model);
351 if (oldModel.delegateModel()->model() == model)
353 }
else if (QVariant::fromValue(d->model) == model) {
359 d->disconnectModel(
this, &oldModel);
362 QObject *object = qvariant_cast<QObject *>(model);
364 QQmlDelegateModelPointer newModel(qobject_cast<QQmlInstanceModel *>(object));
367 delete oldModel.instanceModel();
370 d->model = newModel.instanceModel();
371 }
else if (d->ownModel) {
373 Q_ASSERT(oldModel.delegateModel());
375 d->model = newModel.instanceModel();
376 newModel.delegateModel()->setModel(model);
378 QQmlDelegateModel *own = QQmlDelegateModel::createForView(
this, d);
379 own->setDelegate(d->delegate);
380 own->setDelegateModelAccess(d->delegateModelAccess);
381 own->setModel(model);
385 d->connectModel(
this, &newModel);
402void QQmlInstantiator::setDelegateModelAccess(
403 QQmlDelegateModel::DelegateModelAccess delegateModelAccess)
405 Q_D(QQmlInstantiator);
406 if (delegateModelAccess == d->delegateModelAccess)
409 d->delegateModelAccess = delegateModelAccess;
410 emit delegateModelAccessChanged();
415 if (QQmlDelegateModel *dModel = qobject_cast<QQmlDelegateModel*>(d->model))
416 dModel->setDelegateModelAccess(delegateModelAccess);
417 if (d->componentComplete)