summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/sddm/sddm-rave-theme/Components/ParticleOverlay.qml
blob: 6fa02f9e6c036fb7d53603663b036694d3b88922 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// Config created by Keyitdev https://git.rp1.hu/gabeszm/sddm-rave-theme
// Copyright (C) 2022-2025 Keyitdev
// Distributed under the GPLv3+ License https://www.gnu.org/licenses/gpl-3.0.html

import QtQuick 2.15

Canvas {
    id: particleCanvas

    anchors.fill: parent

    property int particleCount: 55
    property var particles: []
    property real time: 0

    function initParticles() {
        var arr = []
        for (var i = 0; i < particleCount; i++) {
            arr.push({
                x:          Math.random() * width,
                y:          Math.random() * height,
                vx:         (Math.random() - 0.5) * 0.35,
                vy:         (Math.random() - 0.5) * 0.35,
                baseR:      Math.random() * 2.0 + 0.8,
                hue:        Math.random() * 360,
                hueSpeed:   (Math.random() - 0.5) * 0.4,
                phase:      Math.random() * Math.PI * 2,
                opacity:    Math.random() * 0.45 + 0.15,
                glowR:      Math.random() * 18 + 8
            })
        }
        particles = arr
    }

    onPaint: {
        var ctx = getContext("2d")
        ctx.clearRect(0, 0, width, height)

        for (var i = 0; i < particles.length; i++) {
            var p = particles[i]
            var r = p.baseR * (0.75 + 0.25 * Math.sin(p.phase + time * 2.2))

            // Glow halo
            var grd = ctx.createRadialGradient(p.x, p.y, 0, p.x, p.y, p.glowR)
            grd.addColorStop(0, "hsla(" + p.hue + ",100%,72%," + (p.opacity * 0.55) + ")")
            grd.addColorStop(1, "hsla(" + p.hue + ",100%,72%,0)")
            ctx.beginPath()
            ctx.arc(p.x, p.y, p.glowR, 0, Math.PI * 2)
            ctx.fillStyle = grd
            ctx.fill()

            // Core dot
            ctx.beginPath()
            ctx.arc(p.x, p.y, r, 0, Math.PI * 2)
            ctx.fillStyle = "hsla(" + p.hue + ",100%,88%," + p.opacity + ")"
            ctx.fill()
        }
    }

    Timer {
        interval: 16
        repeat: true
        running: true
        onTriggered: {
            particleCanvas.time += 0.016
            var pts = particleCanvas.particles
            var W = particleCanvas.width
            var H = particleCanvas.height
            var t = particleCanvas.time
            for (var i = 0; i < pts.length; i++) {
                var p = pts[i]
                p.x += p.vx + Math.sin(t * 0.9 + p.phase) * 0.28
                p.y += p.vy + Math.cos(t * 0.7 + p.phase) * 0.28
                p.hue  += p.hueSpeed
                p.phase += 0.008
                var margin = p.glowR
                if (p.x < -margin)  p.x = W + margin
                if (p.x > W + margin) p.x = -margin
                if (p.y < -margin)  p.y = H + margin
                if (p.y > H + margin) p.y = -margin
            }
            particleCanvas.requestPaint()
        }
    }

    Component.onCompleted: {
        // kis késleltetés hogy a méret biztosan kész legyen
        Qt.callLater(initParticles)
    }
}