From 13bad429bc5d5f9938164f62c4c2d0b9e2300f9c Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Thu, 12 Jun 2025 07:44:03 +0200 Subject: [PATCH] refractor visualizer to its own file --- .../modules/common/widgets/WaveVisualizer.qml | 78 +++++++++++++++++++ .../modules/mediaControls/PlayerControl.qml | 65 ++-------------- 2 files changed, 84 insertions(+), 59 deletions(-) create mode 100644 .config/quickshell/modules/common/widgets/WaveVisualizer.qml diff --git a/.config/quickshell/modules/common/widgets/WaveVisualizer.qml b/.config/quickshell/modules/common/widgets/WaveVisualizer.qml new file mode 100644 index 000000000..eb579d7e1 --- /dev/null +++ b/.config/quickshell/modules/common/widgets/WaveVisualizer.qml @@ -0,0 +1,78 @@ +import "root:/modules/common" +import "root:/modules/common/widgets" +import "root:/services" +import "root:/modules/common/functions/color_utils.js" as ColorUtils +import QtQuick +import QtQuick.Effects +import QtQuick.Layouts +import QtQuick.Controls +import Quickshell +import Quickshell.Io + +Canvas { // Visualizer + id: root + property list points + property list smoothPoints + property real maxVisualizerValue: 1000 + property int smoothing: 2 + property bool live: true + property color color: Appearance.m3colors.m3primary + + onPointsChanged: () => { + root.requestPaint() + } + + anchors.fill: parent + onPaint: { + var ctx = getContext("2d"); + ctx.clearRect(0, 0, width, height); + + var points = root.points; + var maxVal = root.maxVisualizerValue || 1; + var h = height; + var w = width; + var n = points.length; + if (n < 2) return; + + // Smoothing: simple moving average (optional) + var smoothWindow = root.smoothing; // adjust for more/less smoothing + root.smoothPoints = []; + for (var i = 0; i < n; ++i) { + var sum = 0, count = 0; + for (var j = -smoothWindow; j <= smoothWindow; ++j) { + var idx = Math.max(0, Math.min(n - 1, i + j)); + sum += points[idx]; + count++; + } + root.smoothPoints.push(sum / count); + } + if (!root.live) smoothedPoints.fill(0); // If not playing, show no points + + ctx.beginPath(); + ctx.moveTo(0, h); + for (var i = 0; i < n; ++i) { + var x = i * w / (n - 1); + var y = h - (root.smoothPoints[i] / maxVal) * h; + ctx.lineTo(x, y); + } + ctx.lineTo(w, h); + ctx.closePath(); + + ctx.fillStyle = Qt.rgba( + root.color.r, + root.color.g, + root.color.b, + 0.15 + ); + ctx.fill(); + } + + layer.enabled: true + layer.effect: MultiEffect { // Blur a bit to obscure away the points + source: root + saturation: 0.2 + blurEnabled: true + blurMax: 7 + blur: 1 + } +} \ No newline at end of file diff --git a/.config/quickshell/modules/mediaControls/PlayerControl.qml b/.config/quickshell/modules/mediaControls/PlayerControl.qml index fb4799e17..2100cc90c 100644 --- a/.config/quickshell/modules/mediaControls/PlayerControl.qml +++ b/.config/quickshell/modules/mediaControls/PlayerControl.qml @@ -153,67 +153,14 @@ Item { // Player instance } } - Canvas { // Visualizer + WaveVisualizer { id: visualizerCanvas anchors.fill: parent - onPaint: { - var ctx = getContext("2d"); - ctx.clearRect(0, 0, width, height); - - var points = playerController.visualizerPoints; - var maxVal = playerController.maxVisualizerValue || 1; - var h = height; - var w = width; - var n = points.length; - if (n < 2) return; - - // Smoothing: simple moving average (optional) - var smoothPoints = []; - var smoothWindow = playerController.visualizerSmoothing; // adjust for more/less smoothing - for (var i = 0; i < n; ++i) { - var sum = 0, count = 0; - for (var j = -smoothWindow; j <= smoothWindow; ++j) { - var idx = Math.max(0, Math.min(n - 1, i + j)); - sum += points[idx]; - count++; - } - smoothPoints.push(sum / count); - } - if (!playerController.player?.isPlaying) smoothedPoints.fill(0); // If not playing, show no points - - ctx.beginPath(); - ctx.moveTo(0, h); - for (var i = 0; i < n; ++i) { - var x = i * w / (n - 1); - var y = h - (smoothPoints[i] / maxVal) * h; - ctx.lineTo(x, y); - } - ctx.lineTo(w, h); - ctx.closePath(); - - ctx.fillStyle = Qt.rgba( - blendedColors.colPrimary.r, - blendedColors.colPrimary.g, - blendedColors.colPrimary.b, - 0.15 - ); - ctx.fill(); - } - Connections { - target: playerController - function onVisualizerPointsChanged() { - visualizerCanvas.requestPaint() - } - } - - layer.enabled: true - layer.effect: MultiEffect { // Blur a bit to obscure away the points - source: visualizerCanvas - saturation: 0.2 - blurEnabled: true - blurMax: 7 - blur: 1 - } + live: playerController.player?.isPlaying + points: playerController.visualizerPoints + maxVisualizerValue: playerController.maxVisualizerValue + smoothing: playerController.visualizerSmoothing + color: blendedColors.colPrimary } RowLayout {