129 lines
3.5 KiB
QML
129 lines
3.5 KiB
QML
import QtQuick
|
||
import Quickshell
|
||
import Quickshell.Wayland
|
||
import "." as M
|
||
|
||
PanelWindow {
|
||
id: root
|
||
|
||
required property var screen
|
||
|
||
color: "transparent"
|
||
|
||
WlrLayershell.layer: WlrLayer.Background
|
||
WlrLayershell.exclusiveZone: -1
|
||
WlrLayershell.namespace: "nova-overview-backdrop"
|
||
mask: Region {}
|
||
|
||
anchors.top: true
|
||
anchors.left: true
|
||
anchors.right: true
|
||
anchors.bottom: true
|
||
|
||
Rectangle {
|
||
anchors.fill: parent
|
||
color: M.Theme.base01
|
||
}
|
||
|
||
ShaderEffect {
|
||
id: fx
|
||
anchors.fill: parent
|
||
fragmentShader: Quickshell.shellPath("modules/hex_wave.frag.qsb")
|
||
|
||
property real uSize: 50.0
|
||
property real uWavePhase: -200
|
||
property real uBreath: 0
|
||
property real uGlitch: 0
|
||
property real uGlitchSeed: 0.0
|
||
property vector4d uResolution: Qt.vector4d(width, height, 0, 0)
|
||
property color uC0: M.Theme.base0C
|
||
property color uC1: M.Theme.base0E
|
||
property color uC2: M.Theme.base09
|
||
|
||
Connections {
|
||
target: M.NiriIpc
|
||
function onOverviewOpenChanged() {
|
||
if (!M.NiriIpc.overviewOpen) {
|
||
fx.uWavePhase = -200;
|
||
fx.uBreath = 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
// Wave animation: 6s sweep + 8s pause, only while overview is open
|
||
SequentialAnimation on uWavePhase {
|
||
loops: Animation.Infinite
|
||
running: M.NiriIpc.overviewOpen && !M.Theme.reducedMotion
|
||
NumberAnimation {
|
||
from: -200
|
||
to: fx.width + 200
|
||
duration: 6000
|
||
easing.type: Easing.InOutSine
|
||
}
|
||
PauseAnimation {
|
||
duration: 8000
|
||
}
|
||
}
|
||
|
||
// Breathing pulse while overview is open
|
||
SequentialAnimation on uBreath {
|
||
loops: Animation.Infinite
|
||
running: M.NiriIpc.overviewOpen && !M.Theme.reducedMotion
|
||
NumberAnimation {
|
||
from: 0
|
||
to: 1
|
||
duration: 2500
|
||
easing.type: Easing.InOutSine
|
||
}
|
||
NumberAnimation {
|
||
from: 1
|
||
to: 0
|
||
duration: 2500
|
||
easing.type: Easing.InOutSine
|
||
}
|
||
}
|
||
|
||
// Random subtle glitches — fire every 12–37s, total ~250ms each
|
||
Timer {
|
||
interval: 20000
|
||
repeat: true
|
||
running: !M.Theme.reducedMotion
|
||
onTriggered: {
|
||
interval = 12000 + Math.floor(Math.random() * 25000);
|
||
fx.uGlitchSeed = Math.random() * 1000.0;
|
||
_glitchAnim.start();
|
||
}
|
||
}
|
||
|
||
SequentialAnimation {
|
||
id: _glitchAnim
|
||
NumberAnimation {
|
||
target: fx
|
||
property: "uGlitch"
|
||
to: 0.7
|
||
duration: 50
|
||
easing.type: Easing.OutQuad
|
||
}
|
||
NumberAnimation {
|
||
target: fx
|
||
property: "uGlitch"
|
||
to: 0.15
|
||
duration: 50
|
||
}
|
||
NumberAnimation {
|
||
target: fx
|
||
property: "uGlitch"
|
||
to: 0.85
|
||
duration: 60
|
||
easing.type: Easing.OutQuad
|
||
}
|
||
NumberAnimation {
|
||
target: fx
|
||
property: "uGlitch"
|
||
to: 0
|
||
duration: 100
|
||
easing.type: Easing.InQuad
|
||
}
|
||
}
|
||
}
|
||
}
|