QDebug operator <<(QDebug debug, const QQmlChangeSet &set) { debug.nospace() << "QQmlChangeSet("; foreach (const QQmlChangeSet::Change &remove, set.removes()) debug << remove; foreach (const QQmlChangeSet::Change &insert, set.inserts()) debug << insert; foreach (const QQmlChangeSet::Change &change, set.changes()) debug << change; return debug.nospace() << ')'; }
void itemAppended() { Q_Q(QQmlObjectModel); QQmlObjectModelAttached *attached = QQmlObjectModelAttached::properties(children.last().item); attached->setIndex(children.count()-1); QQmlChangeSet changeSet; changeSet.insert(children.count() - 1, 1); emit q->modelUpdated(changeSet, false); emit q->countChanged(); }
void Quick3DNodeInstantiatorPrivate::_q_modelUpdated(const QQmlChangeSet &changeSet, bool reset) { Q_Q(Quick3DNodeInstantiator); if (!m_componentComplete || m_effectiveReset) return; if (reset) { regenerate(); if (changeSet.difference() != 0) emit q->countChanged(); return; } int difference = 0; QHash<int, QVector<QPointer<QObject> > > moved; const auto removes = changeSet.removes(); for (const QQmlChangeSet::Change &remove : removes) { int index = qMin(remove.index, m_objects.count()); int count = qMin(remove.index + remove.count, m_objects.count()) - index; if (remove.isMove()) { moved.insert(remove.moveId, m_objects.mid(index, count)); m_objects.erase( m_objects.begin() + index, m_objects.begin() + index + count); } else { while (count--) { QObject *obj = m_objects.at(index); m_objects.remove(index); emit q->objectRemoved(index, obj); if (obj) m_instanceModel->release(obj); } } difference -= remove.count; } const auto inserts = changeSet.inserts(); for (const QQmlChangeSet::Change &insert : inserts) { int index = qMin(insert.index, m_objects.count()); if (insert.isMove()) { QVector<QPointer<QObject> > movedObjects = moved.value(insert.moveId); m_objects = m_objects.mid(0, index) + movedObjects + m_objects.mid(index); } else for (int i = 0; i < insert.count; ++i) { int modelIndex = index + i; QObject *obj = m_instanceModel->object(modelIndex, m_async ? QQmlIncubator::Asynchronous : QQmlIncubator::AsynchronousIfNested); if (obj) _q_createdItem(modelIndex, obj); } difference += insert.count; } if (difference != 0) emit q->countChanged(); }
QDebug operator <<(QDebug debug, const QQmlChangeSet &set) { debug.nospace() << "QQmlChangeSet("; const QVector<QQmlChangeSet::Change> &removes = set.removes(); for (const QQmlChangeSet::Change &remove : removes) debug << remove; const QVector<QQmlChangeSet::Change> &inserts = set.inserts(); for (const QQmlChangeSet::Change &insert : inserts) debug << insert; const QVector<QQmlChangeSet::Change> &changes = set.changes(); for (const QQmlChangeSet::Change &change : changes) debug << change; return debug.nospace() << ')'; }