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() << ')';
}
Exemple #2
0
 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();
}
Exemple #4
0
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() << ')';
}