diff options
author | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-03-11 14:39:40 +0100 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@theqtcompany.com> | 2015-03-17 11:16:58 +0000 |
commit | 6dc0ba50bab2fa72978a7b5ee63dae9d66e8ad40 (patch) | |
tree | 5bfe1b61dda17c50f42852e13a263ff9f75e7199 /src/quick/items/qquickrepeater.cpp | |
parent | 84155a8e1a6250d3e4b0949a42464eee5dfef537 (diff) |
Repeater: Don't rely on the createFrom variable
since this breaks for asynchronous models, because item creation order
is not guaranteed. We always have the index
for what item to create, so we do not need it either.
Change-Id: Ib8ce25ac342f5cce4784c56e6a91cf70136566b3
Task-number: QTBUG-38879
Task-number: QTBUG-39001
Task-number: QTBUG-44250
Reviewed-by: Ulf Hermann <ulf.hermann@theqtcompany.com>
Diffstat (limited to 'src/quick/items/qquickrepeater.cpp')
-rw-r--r-- | src/quick/items/qquickrepeater.cpp | 92 |
1 files changed, 44 insertions, 48 deletions
diff --git a/src/quick/items/qquickrepeater.cpp b/src/quick/items/qquickrepeater.cpp index c5fea34e0b..0168d73c8f 100644 --- a/src/quick/items/qquickrepeater.cpp +++ b/src/quick/items/qquickrepeater.cpp @@ -44,7 +44,11 @@ QT_BEGIN_NAMESPACE QQuickRepeaterPrivate::QQuickRepeaterPrivate() - : model(0), ownModel(false), inRequest(false), dataSourceIsObject(false), delegateValidated(false), itemCount(0), createFrom(-1) + : model(0) + , ownModel(false) + , dataSourceIsObject(false) + , delegateValidated(false) + , itemCount(0) { } @@ -378,57 +382,51 @@ void QQuickRepeater::regenerate() d->itemCount = count(); d->deletables.resize(d->itemCount); - d->createFrom = 0; - d->createItems(); + d->requestItems(); } -void QQuickRepeaterPrivate::createItems() +void QQuickRepeaterPrivate::requestItems() { - Q_Q(QQuickRepeater); - if (createFrom == -1) - return; - inRequest = true; - for (int ii = createFrom; ii < itemCount; ++ii) { - if (!deletables.at(ii)) { - QObject *object = model->object(ii, false); - QQuickItem *item = qmlobject_cast<QQuickItem*>(object); - if (!item) { - if (object) { - model->release(object); - if (!delegateValidated) { - delegateValidated = true; - QObject* delegate = q->delegate(); - qmlInfo(delegate ? delegate : q) << QQuickRepeater::tr("Delegate must be of Item type"); - } + for (int i = 0; i < itemCount; i++) { + QObject *object = model->object(i, false); + if (object) + model->release(object); + } +} + +void QQuickRepeater::createdItem(int index, QObject *) +{ + Q_D(QQuickRepeater); + if (!d->deletables.at(index)) { + QObject *object = d->model->object(index, false); + QQuickItem *item = qmlobject_cast<QQuickItem*>(object); + if (!item) { + if (object) { + d->model->release(object); + if (!d->delegateValidated) { + d->delegateValidated = true; + QObject* delegate = this->delegate(); + qmlInfo(delegate ? delegate : this) << QQuickRepeater::tr("Delegate must be of Item type"); } - createFrom = ii; - break; } - deletables[ii] = item; - item->setParentItem(q->parentItem()); - if (ii > 0 && deletables.at(ii-1)) { - item->stackAfter(deletables.at(ii-1)); - } else { - QQuickItem *after = q; - for (int si = ii+1; si < itemCount; ++si) { - if (deletables.at(si)) { - after = deletables.at(si); - break; - } + return; + } + d->deletables[index] = item; + item->setParentItem(parentItem()); + if (index > 0 && d->deletables.at(index-1)) { + item->stackAfter(d->deletables.at(index-1)); + } else { + QQuickItem *after = this; + for (int si = index+1; si < d->itemCount; ++si) { + if (d->deletables.at(si)) { + after = d->deletables.at(si); + break; } - item->stackBefore(after); } - emit q->itemAdded(ii, item); + item->stackBefore(after); } + emit itemAdded(index, item); } - inRequest = false; -} - -void QQuickRepeater::createdItem(int, QObject *) -{ - Q_D(QQuickRepeater); - if (!d->inRequest) - d->createItems(); } void QQuickRepeater::initItem(int, QObject *object) @@ -476,7 +474,6 @@ void QQuickRepeater::modelUpdated(const QQmlChangeSet &changeSet, bool reset) difference -= remove.count; } - d->createFrom = -1; foreach (const QQmlChangeSet::Change &insert, changeSet.inserts()) { int index = qMin(insert.index, d->deletables.count()); if (insert.isMove()) { @@ -491,14 +488,13 @@ void QQuickRepeater::modelUpdated(const QQmlChangeSet &changeSet, bool reset) int modelIndex = index + i; ++d->itemCount; d->deletables.insert(modelIndex, 0); - if (d->createFrom == -1) - d->createFrom = modelIndex; + QObject *object = d->model->object(modelIndex, false); + if (object) + d->model->release(object); } difference += insert.count; } - d->createItems(); - if (difference != 0) emit countChanged(); } |