summaryrefslogtreecommitdiff
path: root/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/AudioVisualization.qml
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/AudioVisualization.qml')
-rw-r--r--raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/AudioVisualization.qml94
1 files changed, 94 insertions, 0 deletions
diff --git a/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/AudioVisualization.qml b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/AudioVisualization.qml
new file mode 100644
index 0000000..52ace33
--- /dev/null
+++ b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Modules/DankBar/Widgets/AudioVisualization.qml
@@ -0,0 +1,94 @@
+import QtQuick
+import Quickshell.Services.Mpris
+import qs.Common
+import qs.Services
+
+Item {
+ id: root
+
+ readonly property MprisPlayer activePlayer: MprisController.activePlayer
+ readonly property bool hasActiveMedia: activePlayer !== null
+ readonly property bool isPlaying: hasActiveMedia && activePlayer && activePlayer.playbackState === MprisPlaybackState.Playing
+
+ width: 20
+ height: Theme.iconSize
+
+ Loader {
+ active: isPlaying
+
+ sourceComponent: Component {
+ Ref {
+ service: CavaService
+ }
+ }
+ }
+
+ readonly property real maxBarHeight: Theme.iconSize - 2
+ readonly property real minBarHeight: 3
+ readonly property real heightRange: maxBarHeight - minBarHeight
+ property var barHeights: [minBarHeight, minBarHeight, minBarHeight, minBarHeight, minBarHeight, minBarHeight]
+
+ Timer {
+ id: fallbackTimer
+
+ running: !CavaService.cavaAvailable && isPlaying
+ interval: 500
+ repeat: true
+ onTriggered: {
+ CavaService.values = [Math.random() * 20 + 5, Math.random() * 25 + 8, Math.random() * 22 + 6, Math.random() * 20 + 5, Math.random() * 22 + 6, Math.random() * 25 + 8];
+ }
+ }
+
+ Connections {
+ target: CavaService
+ function onValuesChanged() {
+ if (!root.isPlaying) {
+ root.barHeights = [root.minBarHeight, root.minBarHeight, root.minBarHeight, root.minBarHeight, root.minBarHeight, root.minBarHeight];
+ return;
+ }
+
+ const newHeights = [];
+ for (let i = 0; i < 6; i++) {
+ if (CavaService.values.length <= i) {
+ newHeights.push(root.minBarHeight);
+ continue;
+ }
+
+ const rawLevel = CavaService.values[i];
+ if (rawLevel <= 0) {
+ newHeights.push(root.minBarHeight);
+ } else if (rawLevel >= 100) {
+ newHeights.push(root.maxBarHeight);
+ } else {
+ newHeights.push(root.minBarHeight + Math.sqrt(rawLevel * 0.01) * root.heightRange);
+ }
+ }
+ root.barHeights = newHeights;
+ }
+ }
+
+ Row {
+ anchors.centerIn: parent
+ spacing: 1.5
+
+ Repeater {
+ model: 6
+
+ Rectangle {
+ width: 2
+ height: root.barHeights[index]
+ radius: 1.5
+ color: Theme.primary
+ anchors.verticalCenter: parent.verticalCenter
+
+ Behavior on height {
+ enabled: root.isPlaying && !CavaService.cavaAvailable
+ NumberAnimation {
+ duration: 100
+ easing.type: Easing.Linear
+ }
+ }
+ }
+ }
+ }
+}