32void QQmlInstantiatorPrivate::clear()
34 Q_Q(QQmlInstantiator);
38 if (objects.isEmpty())
41 for (
int i=0; i < objects.size(); i++) {
42 QObject *object = objects[i];
43 emit q->objectRemoved(i, object);
44 instanceModel->release(object);
45 if (object && object->parent() == q)
46 object->setParent(
nullptr);
50 emit q->objectChanged();
62void QQmlInstantiatorPrivate::regenerate()
64 Q_Q(QQmlInstantiator);
65 if (!componentComplete)
68 int prevCount = q->count();
72 if (!active || !instanceModel || !instanceModel->count() || !instanceModel->isValid()) {
78 for (
int i = 0; i < instanceModel->count(); i++) {
79 QObject *object = modelObject(i, async);
82 _q_createdItem(i, object);
84 if (q->count() != prevCount)
88void QQmlInstantiatorPrivate::_q_createdItem(
int idx, QObject* item)
90 Q_Q(QQmlInstantiator);
91 if (objects.contains(item))
93 if (requestedIndex != idx)
94 (
void)instanceModel->object(idx);
97 if (objects.size() < idx + 1) {
98 int modelCount = instanceModel->count();
99 if (objects.capacity() < modelCount)
100 objects.reserve(modelCount);
101 objects.resize(idx + 1);
103 if (QObject *o = objects.at(idx))
104 instanceModel->release(o);
105 objects.replace(idx, item);
106 if (objects.size() == 1)
108 q->objectAdded(idx, item);
111void QQmlInstantiatorPrivate::_q_modelUpdated(
const QQmlChangeSet &changeSet,
bool reset)
113 Q_Q(QQmlInstantiator);
115 if (!componentComplete || effectiveReset || !active)
120 if (changeSet.difference() != 0)
126 QHash<
int, QVector<QPointer<QObject> > > moved;
127 const QVector<QQmlChangeSet::Change> &removes = changeSet.removes();
128 for (
const QQmlChangeSet::Change &remove : removes) {
129 int index = qMin(remove.index, objects.size());
130 int count = qMin(remove.index + remove.count, objects.size()) - index;
131 if (remove.isMove()) {
132 moved.insert(remove.moveId, objects.mid(index, count));
134 objects.begin() + index,
135 objects.begin() + index + count);
136 }
else while (count--) {
137 QObject *obj = objects.at(index);
138 objects.remove(index);
139 q->objectRemoved(index, obj);
141 instanceModel->release(obj);
144 difference -= remove.count;
147 const QVector<QQmlChangeSet::Change> &inserts = changeSet.inserts();
148 for (
const QQmlChangeSet::Change &insert : inserts) {
149 int index = qMin(insert.index, objects.size());
150 if (insert.isMove()) {
151 QVector<QPointer<QObject> > movedObjects = moved.value(insert.moveId);
152 objects = objects.mid(0, index) + movedObjects + objects.mid(index);
154 if (insert.index <= objects.size())
155 objects.insert(insert.index, insert.count,
nullptr);
156 for (
int i = 0; i < insert.count; ++i) {
157 int modelIndex = index + i;
158 QObject* obj = modelObject(modelIndex, async);
160 _q_createdItem(modelIndex, obj);
163 difference += insert.count;
174 QQmlDelegateModel* delegateModel =
new QQmlDelegateModel(qmlContext(q), q);
360void QQmlInstantiator::setModel(
const QVariant &v)
362 Q_D(QQmlInstantiator);
368 if (!d->componentComplete)
371 QQmlInstanceModel *prevModel = d->instanceModel;
372 QObject *object = qvariant_cast<QObject*>(v);
373 QQmlInstanceModel *vim =
nullptr;
374 if (object && (vim = qobject_cast<QQmlInstanceModel *>(object))) {
375#if QT_CONFIG(qml_delegate_model)
377 delete d->instanceModel;
382 d->instanceModel = vim;
383#if QT_CONFIG(qml_delegate_model)
384 }
else if (v != QVariant(0)){
388 if (QQmlDelegateModel *dataModel = qobject_cast<QQmlDelegateModel *>(d->instanceModel)) {
389 d->effectiveReset =
true;
390 dataModel->setModel(v);
391 d->effectiveReset =
false;
396 if (d->instanceModel != prevModel) {
398 disconnect(prevModel, SIGNAL(modelUpdated(QQmlChangeSet,
bool)),
399 this, SLOT(_q_modelUpdated(QQmlChangeSet,
bool)));
400 disconnect(prevModel, SIGNAL(createdItem(
int,QObject*)),
this, SLOT(_q_createdItem(
int,QObject*)));
404 if (d->instanceModel) {
405 connect(d->instanceModel, SIGNAL(modelUpdated(QQmlChangeSet,
bool)),
406 this, SLOT(_q_modelUpdated(QQmlChangeSet,
bool)));
407 connect(d->instanceModel, SIGNAL(createdItem(
int,QObject*)),
this, SLOT(_q_createdItem(
int,QObject*)));