diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 4621956f..30ad9292 100644
--- a/resources/qml/TimelineView.qml
+++ b/resources/qml/TimelineView.qml
@@ -364,95 +364,10 @@ Item {
onClicked: Rooms.resetCurrentRoom()
}
- ParticleSystem {
- id: particleSystem
+ TimelineEffects {
+ id: timelineEffects
- Component.onCompleted: pause();
- paused: !shouldEffectsRun
- }
-
- Emitter {
- id: confettiEmitter
-
- group: "confetti"
- width: parent.width * 3/4
- enabled: false
- anchors.horizontalCenter: parent.horizontalCenter
- y: parent.height
- emitRate: Math.min(400 * Math.sqrt(parent.width * parent.height) / 870, 1000)
- lifeSpan: 15000
- system: particleSystem
- maximumEmitted: 500
- velocityFromMovement: 8
- size: 16
- sizeVariation: 4
- velocity: PointDirection {
- x: 0
- y: -Math.min(450 * parent.height / 700, 1000)
- xVariation: Math.min(4 * parent.width / 7, 450)
- yVariation: 250
- }
- }
-
- ImageParticle {
- system: particleSystem
- groups: ["confetti"]
- source: "qrc:/confettiparticle.svg"
- rotationVelocity: 0
- rotationVelocityVariation: 360
- colorVariation: 1
- color: "white"
- entryEffect: ImageParticle.None
- xVector: PointDirection {
- x: 1
- y: 0
- xVariation: 0.2
- yVariation: 0.2
- }
- yVector: PointDirection {
- x: 0
- y: 0.5
- xVariation: 0.2
- yVariation: 0.2
- }
- }
-
- Gravity {
- system: particleSystem
anchors.fill: parent
- magnitude: 350
- angle: 90
- }
-
- Emitter {
- id: rainfallEmitter
-
- group: "rain"
- width: parent.width
- enabled: false
- anchors.horizontalCenter: parent.horizontalCenter
- y: -60
- emitRate: parent.width / 50
- lifeSpan: 10000
- system: particleSystem
- velocity: PointDirection {
- x: 0
- y: 300
- xVariation: 0
- yVariation: 75
- }
-
- ItemParticle {
- system: particleSystem
- groups: ["rain"]
- fade: false
- delegate: Rectangle {
- width: 2
- height: 30 + 30 * Math.random()
- radius: 2
- color: "#0099ff"
- }
- }
}
NhekoDropArea {
@@ -463,7 +378,7 @@ Item {
Timer {
id: effectsTimer
onTriggered: shouldEffectsRun = false;
- interval: Math.max(confettiEmitter.lifeSpan, rainfallEmitter.lifeSpan)
+ interval: timelineEffects.maxLifespan
repeat: false
running: false
}
@@ -497,7 +412,7 @@ Item {
return
shouldEffectsRun = true;
- confettiEmitter.pulse(parent.height * 2)
+ timelineEffects.pulseConfetti()
room.markSpecialEffectsDone()
}
@@ -515,7 +430,7 @@ Item {
return
shouldEffectsRun = true;
- rainfallEmitter.pulse(parent.height * 7.5)
+ timelineEffects.pulseRainfall()
room.markSpecialEffectsDone()
}
diff --git a/resources/qml/ui/TimelineEffects.qml b/resources/qml/ui/TimelineEffects.qml
new file mode 100644
index 00000000..6af2892e
--- /dev/null
+++ b/resources/qml/ui/TimelineEffects.qml
@@ -0,0 +1,111 @@
+// SPDX-FileCopyrightText: Nheko Contributors
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+import QtQuick 2.15
+import QtQuick.Particles 2.15
+
+Item {
+ readonly property int maxLifespan: Math.max(confettiEmitter.lifeSpan, rainfallEmitter.lifeSpan)
+
+ function pulseConfetti()
+ {
+ confettiEmitter.pulse(parent.height * 2)
+ }
+
+ function pulseRainfall()
+ {
+ rainfallEmitter.pulse(parent.height * 7.5)
+ }
+
+ ParticleSystem {
+ id: particleSystem
+
+ Component.onCompleted: pause();
+ paused: !shouldEffectsRun
+ }
+
+ Emitter {
+ id: confettiEmitter
+
+ group: "confetti"
+ width: parent.width * 3/4
+ enabled: false
+ anchors.horizontalCenter: parent.horizontalCenter
+ y: parent.height
+ emitRate: Math.min(400 * Math.sqrt(parent.width * parent.height) / 870, 1000)
+ lifeSpan: 15000
+ system: particleSystem
+ maximumEmitted: 500
+ velocityFromMovement: 8
+ size: 16
+ sizeVariation: 4
+ velocity: PointDirection {
+ x: 0
+ y: -Math.min(450 * parent.height / 700, 1000)
+ xVariation: Math.min(4 * parent.width / 7, 450)
+ yVariation: 250
+ }
+ }
+
+ ImageParticle {
+ system: particleSystem
+ groups: ["confetti"]
+ source: "qrc:/confettiparticle.svg"
+ rotationVelocity: 0
+ rotationVelocityVariation: 360
+ colorVariation: 1
+ color: "white"
+ entryEffect: ImageParticle.None
+ xVector: PointDirection {
+ x: 1
+ y: 0
+ xVariation: 0.2
+ yVariation: 0.2
+ }
+ yVector: PointDirection {
+ x: 0
+ y: 0.5
+ xVariation: 0.2
+ yVariation: 0.2
+ }
+ }
+
+ Gravity {
+ system: particleSystem
+ anchors.fill: parent
+ magnitude: 350
+ angle: 90
+ }
+
+ Emitter {
+ id: rainfallEmitter
+
+ group: "rain"
+ width: parent.width
+ enabled: false
+ anchors.horizontalCenter: parent.horizontalCenter
+ y: -60
+ emitRate: parent.width / 50
+ lifeSpan: 10000
+ system: particleSystem
+ velocity: PointDirection {
+ x: 0
+ y: 300
+ xVariation: 0
+ yVariation: 75
+ }
+
+ ItemParticle {
+ system: particleSystem
+ groups: ["rain"]
+ fade: false
+ delegate: Rectangle {
+ width: 2
+ height: 30 + 30 * Math.random()
+ radius: 2
+ color: "#0099ff"
+ }
+ }
+ }
+}
diff --git a/resources/res.qrc b/resources/res.qrc
index faa90495..3f1b2b65 100644
--- a/resources/res.qrc
+++ b/resources/res.qrc
@@ -197,6 +197,7 @@
qml/voip/VideoCall.qml
confettiparticle.svg
qml/delegates/EncryptionEnabled.qml
+ qml/ui/TimelineEffects.qml
media/ring.ogg