aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/particles/qsgitemparticle.cpp
diff options
context:
space:
mode:
authorAlan Alpert <alan.alpert@nokia.com>2011-06-10 16:07:33 +1000
committerAlan Alpert <alan.alpert@nokia.com>2011-06-10 16:07:33 +1000
commit7b28a7eebeb8cbe5d356fc9b24651a36d73ab1ad (patch)
tree819592ab14dfc9c7e59ea42d02e998b77d4aa210 /src/declarative/particles/qsgitemparticle.cpp
parent6e69712287fa2d6087e5423cc4b7aace8b790894 (diff)
Add delegate property to ItemParticle
Also add burst(n,x,y) to ParticleEmitter, and a demo that uses both.
Diffstat (limited to 'src/declarative/particles/qsgitemparticle.cpp')
-rw-r--r--src/declarative/particles/qsgitemparticle.cpp78
1 files changed, 52 insertions, 26 deletions
diff --git a/src/declarative/particles/qsgitemparticle.cpp b/src/declarative/particles/qsgitemparticle.cpp
index 819c823155..498dd90a87 100644
--- a/src/declarative/particles/qsgitemparticle.cpp
+++ b/src/declarative/particles/qsgitemparticle.cpp
@@ -42,14 +42,22 @@
#include "qsgitemparticle_p.h"
#include <QtDeclarative/private/qsgvisualitemmodel_p.h>
#include <qsgnode.h>
+#include <QTimer>
+#include <QDeclarativeComponent>
#include <QDebug>
QT_BEGIN_NAMESPACE
QSGItemParticle::QSGItemParticle(QSGItem *parent) :
- QSGParticlePainter(parent), m_fade(true)
+ QSGParticlePainter(parent), m_fade(true), m_delegate(0)
{
setFlag(QSGItem::ItemHasContents);
+ QTimer* manageDelegates = new QTimer(this);//TODO: don't leak
+ connect(manageDelegates, SIGNAL(timeout()),
+ this, SLOT(tick()));
+ manageDelegates->setInterval(16);
+ manageDelegates->setSingleShot(false);
+ manageDelegates->start();
}
@@ -79,33 +87,54 @@ void QSGItemParticle::give(QSGItem *item)
void QSGItemParticle::load(QSGParticleData* d)
{
- if(m_pendingItems.isEmpty())
- return;
int pos = particleTypeIndex(d);
- if(m_items[pos]){
- if(m_stasis.contains(m_items[pos]))
- qWarning() << "Current model particles prefers overwrite:false";
- //remove old item from the particle that is dying to make room for this one
- m_items[pos]->setOpacity(0.);
+ m_data[pos] = d;
+ m_loadables << pos;
+}
+
+void QSGItemParticle::tick()
+{
+ foreach(QSGItem* item, m_deletables){
+ if(m_fade)
+ item->setOpacity(0.);
QSGItemParticleAttached* mpa;
- if((mpa = qobject_cast<QSGItemParticleAttached*>(qmlAttachedPropertiesObject<QSGItemParticle>(m_items[pos], false))))
+ if((mpa = qobject_cast<QSGItemParticleAttached*>(qmlAttachedPropertiesObject<QSGItemParticle>(item))))
mpa->detach();//reparent as well?
- m_items[pos] = 0;
- m_data[pos] = 0;
+ //TODO: Delete iff we created it
m_activeCount--;
+ m_deletables.removeAll(item);
}
- m_items[pos] = m_pendingItems.front();
- m_pendingItems.pop_front();
- m_items[pos]->setX(d->curX() - m_items[pos]->width()/2);
- m_items[pos]->setY(d->curY() - m_items[pos]->height()/2);
- QSGItemParticleAttached* mpa = qobject_cast<QSGItemParticleAttached*>(qmlAttachedPropertiesObject<QSGItemParticle>(m_items[pos]));
- if(mpa){
- mpa->m_mp = this;
- mpa->attach();
+
+ foreach(int pos, m_loadables){
+ if(m_stasis.contains(m_items[pos]))
+ qWarning() << "Current model particles prefers overwrite:false";
+ //remove old item from the particle that is dying to make room for this one
+ if(m_items[pos]){
+ m_deletables << m_items[pos];
+ m_activeCount--;
+ }
+ m_items[pos] = 0;
+ if(!m_pendingItems.isEmpty()){
+ m_items[pos] = m_pendingItems.front();
+ m_pendingItems.pop_front();
+ }else if(m_delegate){
+ m_items[pos] = qobject_cast<QSGItem*>(m_delegate->create(qmlContext(this)));
+ }
+ if(m_items[pos]){
+ m_items[pos]->setX(m_data[pos]->curX() - m_items[pos]->width()/2);//TODO: adjust for system?
+ m_items[pos]->setY(m_data[pos]->curY() - m_items[pos]->height()/2);
+ QSGItemParticleAttached* mpa = qobject_cast<QSGItemParticleAttached*>(qmlAttachedPropertiesObject<QSGItemParticle>(m_items[pos]));
+ if(mpa){
+ mpa->m_mp = this;
+ mpa->attach();
+ }
+ m_items[pos]->setParentItem(this);
+ if(m_fade)
+ m_items[pos]->setOpacity(0.);
+ m_activeCount++;
+ }
+ m_loadables.removeAll(pos);
}
- m_items[pos]->setParentItem(this);
- m_data[pos] = d;
- m_activeCount++;
}
void QSGItemParticle::reload(QSGParticleData* d)
@@ -173,10 +202,7 @@ void QSGItemParticle::prepareNextFrame()
continue;
}
if(t >= 1.0){//Usually happens from load
- item->setOpacity(0.);
- QSGItemParticleAttached* mpa;
- if((mpa = qobject_cast<QSGItemParticleAttached*>(qmlAttachedPropertiesObject<QSGItemParticle>(m_items[i]))))
- mpa->detach();//reparent as well?
+ m_deletables << item;
m_items[i] = 0;
m_data[i] = 0;
m_activeCount--;