diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2020-01-09 01:00:43 +0100 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2020-01-09 07:24:26 +0000 |
commit | ba10b0b9ed93be007fcb156710ef6081000e3ae3 (patch) | |
tree | ea17c625900b83d5955cb4a2db1587a5f07e2fb4 /src/particles | |
parent | 653c25d48298fb747cf6f3b012816855c51d4260 (diff) | |
parent | 1798d20ded699837f7b3afe0bb340617af266518 (diff) |
Merge remote-tracking branch 'origin/5.14' into 5.15
Conflicts:
src/particles/qquickitemparticle.cpp
src/qmlmodels/qqmladaptormodel.cpp
tests/auto/particles/qquickitemparticle/tst_qquickitemparticle.cpp
Change-Id: Ibd8fbb91da6893a09f4ffe61ad0b95d8149bbc87
Diffstat (limited to 'src/particles')
-rw-r--r-- | src/particles/qquickitemparticle.cpp | 84 | ||||
-rw-r--r-- | src/particles/qquickitemparticle_p.h | 3 |
2 files changed, 36 insertions, 51 deletions
diff --git a/src/particles/qquickitemparticle.cpp b/src/particles/qquickitemparticle.cpp index 740d0f60f3..ce254c212d 100644 --- a/src/particles/qquickitemparticle.cpp +++ b/src/particles/qquickitemparticle.cpp @@ -136,6 +136,7 @@ QQuickItemParticle::QQuickItemParticle(QQuickItem *parent) : QQuickItemParticle::~QQuickItemParticle() { delete clock; + qDeleteAll(m_managed); } void QQuickItemParticle::freeze(QQuickItem* item) @@ -172,7 +173,8 @@ void QQuickItemParticle::give(QQuickItem *item) void QQuickItemParticle::initialize(int gIdx, int pIdx) { - m_loadables << m_system->groupData[gIdx]->data[pIdx];//defer to other thread + Q_UNUSED(gIdx); + Q_UNUSED(pIdx); } void QQuickItemParticle::commit(int, int) @@ -205,50 +207,43 @@ void QQuickItemParticle::tick(int time) { Q_UNUSED(time);//only needed because QTickAnimationProxy expects one processDeletables(); - - foreach (QQuickParticleData* d, m_loadables){ - Q_ASSERT(d); - if (m_stasis.contains(d->delegate)) - qWarning() << "Current model particles prefers overwrite:false"; - //remove old item from the particle that is dying to make room for this one - if (d->delegate) { - m_deletables << d->delegate; - d->delegate = nullptr; - } - QQuickItem* parentItem = nullptr; - if (!m_pendingItems.isEmpty()){ - QQuickItem *item = m_pendingItems.front(); - m_pendingItems.pop_front(); - parentItem = item->parentItem(); - d->delegate = item; - }else if (m_delegate){ - d->delegate = qobject_cast<QQuickItem*>(m_delegate->create(qmlContext(this))); - if (d->delegate) - m_managed << d->delegate; - } - if (d && d->delegate){//###Data can be zero if creating an item leads to a reset - this screws things up. - d->delegate->setX(d->curX(m_system) - d->delegate->width() / 2); //TODO: adjust for system? - d->delegate->setY(d->curY(m_system) - d->delegate->height() / 2); - QQuickItemParticleAttached* mpa = qobject_cast<QQuickItemParticleAttached*>(qmlAttachedPropertiesObject<QQuickItemParticle>(d->delegate)); - if (mpa){ - mpa->m_parentItem = parentItem; - mpa->m_mp = this; - mpa->attach(); + for (auto groupId : groupIds()) { + for (QQuickParticleData* d : qAsConst(m_system->groupData[groupId]->data)) { + if (!d->delegate && d->t != -1 && d->stillAlive(m_system)) { + QQuickItem* parentItem = nullptr; + if (!m_pendingItems.isEmpty()){ + QQuickItem *item = m_pendingItems.front(); + m_pendingItems.pop_front(); + parentItem = item->parentItem(); + d->delegate = item; + }else if (m_delegate){ + d->delegate = qobject_cast<QQuickItem*>(m_delegate->create(qmlContext(this))); + if (d->delegate) + m_managed << d->delegate; + } + if (d && d->delegate){//###Data can be zero if creating an item leads to a reset - this screws things up. + d->delegate->setX(d->curX(m_system) - d->delegate->width() / 2); //TODO: adjust for system? + d->delegate->setY(d->curY(m_system) - d->delegate->height() / 2); + QQuickItemParticleAttached* mpa = qobject_cast<QQuickItemParticleAttached*>(qmlAttachedPropertiesObject<QQuickItemParticle>(d->delegate)); + if (mpa){ + mpa->m_parentItem = parentItem; + mpa->m_mp = this; + mpa->attach(); + } + d->delegate->setParentItem(this); + if (m_fade) + d->delegate->setOpacity(0.); + d->delegate->setVisible(false);//Will be set to true when we prepare the next frame + m_activeCount++; + } } - d->delegate->setParentItem(this); - if (m_fade) - d->delegate->setOpacity(0.); - d->delegate->setVisible(false);//Will be set to true when we prepare the next frame - m_activeCount++; } } - m_loadables.clear(); } void QQuickItemParticle::reset() { QQuickParticlePainter::reset(); - m_loadables.clear(); // delete all managed items which had their logical particles cleared // but leave it alone if the logical particle is maintained @@ -258,7 +253,7 @@ void QQuickItemParticle::reset() lost.remove(d->delegate); } } - m_deletables.append(lost.values()); + m_deletables.unite(lost); //TODO: This doesn't yet handle calling detach on taken particles in the system reset case processDeletables(); } @@ -267,18 +262,9 @@ void QQuickItemParticle::reset() QSGNode* QQuickItemParticle::updatePaintNode(QSGNode* n, UpdatePaintNodeData* d) { //Dummy update just to get painting tick - if (m_pleaseReset){ + if (m_pleaseReset) m_pleaseReset = false; - //Refill loadables, delayed here so as to only happen once per frame max - //### Constant resetting might lead to m_loadables never being populated when tick() occurs - for (auto groupId : groupIds()) { - for (QQuickParticleData* d : qAsConst(m_system->groupData[groupId]->data)) { - if (!d->delegate && d->t != -1 && d->stillAlive(m_system)) { - m_loadables << d; - } - } - } - } + prepareNextFrame(); update();//Get called again diff --git a/src/particles/qquickitemparticle_p.h b/src/particles/qquickitemparticle_p.h index ea46c67db7..32c9881691 100644 --- a/src/particles/qquickitemparticle_p.h +++ b/src/particles/qquickitemparticle_p.h @@ -108,9 +108,8 @@ protected: private: void processDeletables(); void tick(int time = 0); - QList<QQuickItem* > m_deletables; + QSet<QQuickItem* > m_deletables; QList<QQuickItem* > m_managed; - QList< QQuickParticleData* > m_loadables; bool m_fade; QList<QQuickItem*> m_pendingItems; |