From 7c0156309eef50b5cfd3e498eaed6d7218dc40f8 Mon Sep 17 00:00:00 2001
From: Alan Alpert <aalpert@blackberry.com>
Date: Wed, 1 May 2013 17:22:14 -0700
Subject: [PATCH] Fix Instantiator response to model change

Objects were not being created correctly when the model changed after
componentComplete. After correcting that the model change can lead to
an intermediate count change when the old model is cleared, so a flag
is set to ignore intermediate changes fom the QQmlDelegateModel when
the model changes.

Task-number: QTBUG-30379
Change-Id: I55519c9ee378a1b0569567137ebd378f32a6c85c
Reviewed-by: Caroline Chao <caroline.chao@digia.com>
Reviewed-by: Christopher Adams <chris.adams@jollamobile.com>
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
---
 src/qml/types/qqmlinstantiator.cpp   | 10 +++++++---
 src/qml/types/qqmlinstantiator_p_p.h |  1 +
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/qml/types/qqmlinstantiator.cpp b/src/qml/types/qqmlinstantiator.cpp
index a2a1fa23ad..234494e088 100644
--- a/src/qml/types/qqmlinstantiator.cpp
+++ b/src/qml/types/qqmlinstantiator.cpp
@@ -52,6 +52,7 @@ QT_BEGIN_NAMESPACE
 
 QQmlInstantiatorPrivate::QQmlInstantiatorPrivate()
     : componentComplete(true)
+    , effectiveReset(false)
     , active(true)
     , async(false)
     , ownModel(false)
@@ -124,7 +125,7 @@ void QQmlInstantiatorPrivate::_q_modelUpdated(const QQmlChangeSet &changeSet, bo
 {
     Q_Q(QQmlInstantiator);
 
-    if (componentComplete)
+    if (!componentComplete || effectiveReset)
         return;
 
     if (reset) {
@@ -162,7 +163,7 @@ void QQmlInstantiatorPrivate::_q_modelUpdated(const QQmlChangeSet &changeSet, bo
             objects = objects.mid(0, index) + movedObjects + objects.mid(index);
         } else for (int i = 0; i < insert.count; ++i) {
             int modelIndex = index + i;
-            QObject* obj = instanceModel->object(i, async);
+            QObject* obj = instanceModel->object(modelIndex, async);
             if (obj)
                 _q_createdItem(modelIndex, obj);
         }
@@ -378,8 +379,11 @@ void QQmlInstantiator::setModel(const QVariant &v)
         if (!d->ownModel)
             d->makeModel();
 
-        if (QQmlDelegateModel *dataModel = qobject_cast<QQmlDelegateModel *>(d->instanceModel))
+        if (QQmlDelegateModel *dataModel = qobject_cast<QQmlDelegateModel *>(d->instanceModel)) {
+            d->effectiveReset = true;
             dataModel->setModel(v);
+            d->effectiveReset = false;
+        }
     }
 
     if (d->instanceModel != prevModel) {
diff --git a/src/qml/types/qqmlinstantiator_p_p.h b/src/qml/types/qqmlinstantiator_p_p.h
index 79459299dc..ac25ce809c 100644
--- a/src/qml/types/qqmlinstantiator_p_p.h
+++ b/src/qml/types/qqmlinstantiator_p_p.h
@@ -76,6 +76,7 @@ public:
     void _q_modelUpdated(const QQmlChangeSet &, bool);
 
     bool componentComplete;
+    bool effectiveReset;
     bool active;
     bool async;
     bool ownModel;
-- 
GitLab