Safer cleanup in model/item particle
authorAlan Alpert <alan.alpert@nokia.com>
Tue, 14 Jun 2011 04:09:30 +0000 (14:09 +1000)
committerAlan Alpert <alan.alpert@nokia.com>
Tue, 14 Jun 2011 04:13:23 +0000 (14:13 +1000)
src/declarative/particles/qsgitemparticle.cpp
src/declarative/particles/qsgmodelparticle.cpp

index 498dd90..42f0062 100644 (file)
@@ -102,8 +102,8 @@ void QSGItemParticle::tick()
             mpa->detach();//reparent as well?
         //TODO: Delete iff we created it
         m_activeCount--;
-        m_deletables.removeAll(item);
     }
+    m_deletables.clear();
 
     foreach(int pos, m_loadables){
         if(m_stasis.contains(m_items[pos]))
@@ -133,8 +133,8 @@ void QSGItemParticle::tick()
                 m_items[pos]->setOpacity(0.);
             m_activeCount++;
         }
-        m_loadables.removeAll(pos);
     }
+    m_loadables.clear();
 }
 
 void QSGItemParticle::reload(QSGParticleData* d)
index b0b4fa4..f87c0d3 100644 (file)
@@ -177,21 +177,23 @@ void QSGModelParticle::processPending()
     foreach(QSGItem* item, m_deletables){
         item->setOpacity(0.);
         m_model->release(item);
-        m_deletables.removeAll(item);
     }
+    m_deletables.clear();
 
     foreach(int pos, m_requests){
-        m_items[pos] = m_model->item(m_available.first());
-        m_idx[pos] = m_available.first();
-        m_available.pop_front();
-        QSGModelParticleAttached* mpa = qobject_cast<QSGModelParticleAttached*>(qmlAttachedPropertiesObject<QSGModelParticle>(m_items[pos]));
-        if(mpa){
-            mpa->m_mp = this;
-            mpa->attach();
+        if(!m_available.isEmpty()){
+            m_items[pos] = m_model->item(m_available.first());
+            m_idx[pos] = m_available.first();
+            m_available.pop_front();
+            QSGModelParticleAttached* mpa = qobject_cast<QSGModelParticleAttached*>(qmlAttachedPropertiesObject<QSGModelParticle>(m_items[pos]));
+            if(mpa){
+                mpa->m_mp = this;
+                mpa->attach();
+            }
+            m_items[pos]->setParentItem(this);
         }
-        m_items[pos]->setParentItem(this);
-        m_requests.removeAll(pos);
     }
+    m_requests.clear();
 }
 
 void QSGModelParticle::reload(QSGParticleData* d)