4#include <QtCore/qtconfigmacros.h>
9#include <QtQuick/qsgnode.h>
11#include <QQmlComponent>
17
18
19
20
21
22
23
27
28
29
30
31
34
35
36
37
38
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
67
68
69
70
71
72
75
76
77
78
79
80
81
82
84
85
86
87
88
89
90
91
92
93
95QQuickItemParticle::QQuickItemParticle(QQuickItem *parent) :
96 QQuickParticlePainter(parent), m_fade(
true), m_lastT(0), m_activeCount(0), m_delegate(
nullptr)
98 setFlag(QQuickItem::ItemHasContents);
99 clock =
new Clock(
this);
100 connect(
this, &QQuickItemParticle::systemChanged,
this, &QQuickItemParticle::reconnectSystem);
101 connect(
this, &QQuickItemParticle::parentChanged,
this, &QQuickItemParticle::reconnectParent);
102 connect(
this, &QQuickItemParticle::enabledChanged,
this, &QQuickItemParticle::updateClock);
103 reconnectSystem(m_system);
104 reconnectParent(parent);
107QQuickItemParticle::~QQuickItemParticle()
110 qDeleteAll(m_managed);
113void QQuickItemParticle::freeze(QQuickItem* item)
119void QQuickItemParticle::unfreeze(QQuickItem* item)
121 m_stasis.remove(item);
124void QQuickItemParticle::take(QQuickItem *item,
bool prioritize)
127 m_pendingItems.push_front(item);
129 m_pendingItems.push_back(item);
132void QQuickItemParticle::give(QQuickItem *item)
134 for (
auto groupId : groupIds()) {
135 for (QQuickParticleData* data : std::as_const(m_system->groupData[groupId]->data)) {
136 if (data->delegate == item){
137 m_deletables << item;
138 data->delegate =
nullptr;
139 m_system->groupData[groupId]->kill(data);
146void QQuickItemParticle::initialize(
int gIdx,
int pIdx)
152void QQuickItemParticle::commit(
int,
int)
156void QQuickItemParticle::processDeletables()
158 foreach (QQuickItem* item, m_deletables){
160 item->setOpacity(0.);
161 item->setVisible(
false);
162 QQuickItemParticleAttached* mpa;
163 if ((mpa = qobject_cast<QQuickItemParticleAttached*>(qmlAttachedPropertiesObject<QQuickItemParticle>(item)))) {
164 if (mpa->m_parentItem !=
nullptr)
165 item->setParentItem(mpa->m_parentItem);
169 if ((idx = m_managed.indexOf(item)) != -1) {
170 m_managed.takeAt(idx);
175 m_deletables.clear();
178void QQuickItemParticle::tick(
int time)
182 for (
auto groupId : groupIds()) {
183 for (QQuickParticleData* d : std::as_const(m_system->groupData[groupId]->data)) {
184 if (!d->delegate && d->t != -1 && d->stillAlive(m_system)) {
185 QQuickItem* parentItem =
nullptr;
186 if (!m_pendingItems.isEmpty()){
187 QQuickItem *item = m_pendingItems.front();
188 m_pendingItems.pop_front();
189 parentItem = item->parentItem();
191 }
else if (m_delegate){
192 d->delegate = qobject_cast<QQuickItem*>(m_delegate->create(qmlContext(
this)));
194 m_managed << d->delegate;
196 if (d && d->delegate){
197 d->delegate->setX(d->curX(m_system) - d->delegate->width() / 2);
198 d->delegate->setY(d->curY(m_system) - d->delegate->height() / 2);
199 QQuickItemParticleAttached* mpa = qobject_cast<QQuickItemParticleAttached*>(qmlAttachedPropertiesObject<QQuickItemParticle>(d->delegate));
201 mpa->m_parentItem = parentItem;
205 d->delegate->setParentItem(
this);
207 d->delegate->setOpacity(0.);
208 d->delegate->setVisible(
false);
216void QQuickItemParticle::reset()
218 QQuickParticlePainter::reset();
222 QSet<QQuickItem*> lost = QSet<QQuickItem*>(m_managed.cbegin(), m_managed.cend());
223 for (
auto groupId : groupIds()) {
224 for (QQuickParticleData* d : std::as_const(m_system->groupData[groupId]->data)) {
225 lost.remove(d->delegate);
228 m_deletables.unite(lost);
234QSGNode* QQuickItemParticle::updatePaintNode(QSGNode* n, UpdatePaintNodeData* d)
238 m_pleaseReset =
false;
240 if (clockShouldUpdate()) {
245 n->markDirty(QSGNode::DirtyMaterial);
246 return QQuickItem::updatePaintNode(n,d);
249void QQuickItemParticle::prepareNextFrame()
253 qint64 timeStamp = m_system->systemSync(
this);
254 qreal curT = timeStamp/1000.0;
255 qreal dt = curT - m_lastT;
261 for (
auto groupId : groupIds()) {
262 for (QQuickParticleData* data : std::as_const(m_system->groupData[groupId]->data)) {
263 QQuickItem* item = data->delegate;
266 float t = ((timeStamp / 1000.0f) - data->t) / data->lifeSpan;
267 if (m_stasis.contains(item)) {
272 m_deletables << item;
273 data->delegate =
nullptr;
275 data->delegate->setVisible(
true);
285 item->setX(data->curX(m_system) - item->width() / 2 - m_systemOffset.x());
286 item->setY(data->curY(m_system) - item->height() / 2 - m_systemOffset.y());
291QQuickItemParticleAttached *QQuickItemParticle::qmlAttachedProperties(QObject *object)
293 return new QQuickItemParticleAttached(object);
296bool QQuickItemParticle::clockShouldUpdate()
const
302 QQuickParticleEmitter *parentEmitter = qobject_cast<QQuickParticleEmitter *>(parent());
303 bool parentEmitterDisabled = parentEmitter && !parentEmitter->isEnabled();
304 bool systemRunning = m_system && (m_system->isRunning() || m_system->isPaused());
305 return systemRunning && !parentEmitterDisabled;
308void QQuickItemParticle::reconnectParent(QQuickItem *parentItem)
311 disconnect(m_parentEnabledStateConnection);
313 m_parentEnabledStateConnection = connect(parentItem, &QQuickParticleSystem::enabledChanged,
314 this, &QQuickItemParticle::updateClock);
318void QQuickItemParticle::reconnectSystem(QQuickParticleSystem *system)
321 disconnect(m_systemRunStateConnection);
322 disconnect(m_systemPauseStateConnection);
323 disconnect(m_systemEnabledStateConnection);
325 m_systemRunStateConnection = connect(m_system, &QQuickParticleSystem::runningChanged,
this, [
this](){
326 QQuickItemParticle::updateClock();
328 m_systemPauseStateConnection = connect(m_system, &QQuickParticleSystem::pausedChanged,
this, [
this](){
329 QQuickItemParticle::updateClock();
331 m_systemEnabledStateConnection = connect(m_system, &QQuickParticleSystem::enabledChanged,
this,
332 &QQuickItemParticle::updateClock);
336void QQuickItemParticle::updateClock()
338 if (clockShouldUpdate()) {
339 if (!clock->isRunning())
342 if (clock->isRunning())
349#include "moc_qquickitemparticle_p.cpp"
Combined button and popup list for selecting options.