diff --git a/Modules/Bar/Widgets/AudioVisualizer.qml b/Modules/Bar/Widgets/AudioVisualizer.qml index f13701d3a..30ea55c75 100644 --- a/Modules/Bar/Widgets/AudioVisualizer.qml +++ b/Modules/Bar/Widgets/AudioVisualizer.qml @@ -45,23 +45,29 @@ Item { readonly property bool shouldShow: (currentVisualizerType !== "" && currentVisualizerType !== "none") && (!hideWhenIdle || MediaService.isPlaying) + readonly property bool needsSpectrum: root.shouldShow && MediaService.isPlaying + // Register/unregister with SpectrumService based on visibility (use screenName — screen can be null after DPMS/output changes) readonly property string spectrumComponentId: "bar:audiovisualizer:" + screenName + ":" + root.section + ":" + root.sectionWidgetIndex - onShouldShowChanged: { - if (root.shouldShow) { + onNeedsSpectrumChanged: { + if (root.needsSpectrum) { SpectrumService.registerComponent(root.spectrumComponentId); } else { SpectrumService.unregisterComponent(root.spectrumComponentId); } } - Component.onDestruction: { - if (root.shouldShow) { - SpectrumService.unregisterComponent(root.spectrumComponentId); + Component.onCompleted: { + if (root.needsSpectrum) { + SpectrumService.registerComponent(root.spectrumComponentId); } } + Component.onDestruction: { + SpectrumService.unregisterComponent(root.spectrumComponentId); + } + // Content dimensions for implicit sizing readonly property real contentWidth: !shouldShow ? 0 : isVerticalBar ? capsuleHeight : visualizerWidth readonly property real contentHeight: !shouldShow ? 0 : isVerticalBar ? visualizerWidth : capsuleHeight @@ -104,7 +110,7 @@ Item { id: visualizerLoader anchors.fill: parent anchors.margins: Style.marginS - active: shouldShow + active: root.needsSpectrum asynchronous: true sourceComponent: { diff --git a/Modules/Bar/Widgets/MediaMini.qml b/Modules/Bar/Widgets/MediaMini.qml index d7b6b74aa..8e27aa6fd 100644 --- a/Modules/Bar/Widgets/MediaMini.qml +++ b/Modules/Bar/Widgets/MediaMini.qml @@ -75,7 +75,7 @@ Item { // SpectrumService registration for visualizer readonly property string spectrumComponentId: "bar:mediamini:" + root.screen?.name + ":" + root.section + ":" + root.sectionWidgetIndex - readonly property bool needsSpectrum: root.showVisualizer && root.visualizerType !== "" && root.visualizerType !== "none" && !root.isHidden + readonly property bool needsSpectrum: root.showVisualizer && root.visualizerType !== "" && root.visualizerType !== "none" && !root.isHidden && MediaService.isPlaying Layout.preferredHeight: isVertical ? -1 : Style.getBarHeightForScreen(screenName) Layout.preferredWidth: isVertical ? Style.getBarHeightForScreen(screenName) : -1 @@ -265,10 +265,10 @@ Item { y: Style.pixelAlignCenter(parent.height, height) width: Style.toOdd(parent.width) height: Style.toOdd(parent.height) - active: showVisualizer + active: root.needsSpectrum z: 0 sourceComponent: { - if (!showVisualizer) + if (!root.needsSpectrum) return null; if (visualizerType === "linear") return linearSpectrum; diff --git a/Modules/Cards/MediaCard.qml b/Modules/Cards/MediaCard.qml index ab604be12..7526d4f97 100644 --- a/Modules/Cards/MediaCard.qml +++ b/Modules/Cards/MediaCard.qml @@ -16,7 +16,7 @@ NBox { readonly property bool hasActivePlayer: MediaService.currentPlayer && MediaService.canPlay // SpectrumService registration for visualizer - readonly property bool needsSpectrum: Settings.data.audio.visualizerType !== "" && Settings.data.audio.visualizerType !== "none" + readonly property bool needsSpectrum: Settings.data.audio.visualizerType !== "" && Settings.data.audio.visualizerType !== "none" && MediaService.isPlaying onNeedsSpectrumChanged: { if (root.needsSpectrum) { @@ -138,7 +138,7 @@ NBox { // Background visualizer on top of the artwork Loader { anchors.fill: parent - active: Settings.data.audio.visualizerType !== "" && Settings.data.audio.visualizerType !== "none" + active: root.needsSpectrum sourceComponent: { switch (Settings.data.audio.visualizerType) { diff --git a/Modules/DesktopWidgets/Widgets/DesktopAudioVisualizer.qml b/Modules/DesktopWidgets/Widgets/DesktopAudioVisualizer.qml index a462df86c..dc30b1543 100644 --- a/Modules/DesktopWidgets/Widgets/DesktopAudioVisualizer.qml +++ b/Modules/DesktopWidgets/Widgets/DesktopAudioVisualizer.qml @@ -25,7 +25,7 @@ DraggableDesktopWidget { readonly property bool shouldShow: visualizerType !== "" && visualizerType !== "none" && (!hideWhenIdle || MediaService.isPlaying) readonly property bool isHidden: !shouldShow - readonly property bool shouldRegisterSpectrum: shouldShow + readonly property bool shouldRegisterSpectrum: shouldShow && MediaService.isPlaying // Keep widget visible in edit mode so users can move/configure it visible: !root.isHidden || DesktopWidgetRegistry.editMode @@ -66,7 +66,7 @@ DraggableDesktopWidget { id: visualizerLoader anchors.fill: parent anchors.margins: root.showBackground ? Math.round(Style.marginXS * root.widgetScale) : 0 - active: root.shouldShow + active: root.shouldRegisterSpectrum asynchronous: true sourceComponent: { diff --git a/Modules/DesktopWidgets/Widgets/DesktopMediaPlayer.qml b/Modules/DesktopWidgets/Widgets/DesktopMediaPlayer.qml index 52b5cbbf7..81ba80816 100644 --- a/Modules/DesktopWidgets/Widgets/DesktopMediaPlayer.qml +++ b/Modules/DesktopWidgets/Widgets/DesktopMediaPlayer.qml @@ -34,7 +34,7 @@ DraggableDesktopWidget { // SpectrumService registration for visualizer readonly property string spectrumComponentId: "desktopmediaplayer:" + (root.screen ? root.screen.name : "unknown") - readonly property bool needsSpectrum: root.shouldShowVisualizer && !root.isHidden + readonly property bool needsSpectrum: root.shouldShowVisualizer && !root.isHidden && root.isPlaying onNeedsSpectrumChanged: { if (root.needsSpectrum) { diff --git a/Modules/LockScreen/LockScreen.qml b/Modules/LockScreen/LockScreen.qml index 88698b58f..eb6851005 100644 --- a/Modules/LockScreen/LockScreen.qml +++ b/Modules/LockScreen/LockScreen.qml @@ -17,7 +17,7 @@ Loader { active: false // Track if the visualizer should be shown (lockscreen active + media playing + non-compact mode) - readonly property bool needsSpectrum: root.active && !Settings.data.general.compactLockScreen && Settings.data.audio.visualizerType !== "" && Settings.data.audio.visualizerType !== "none" + readonly property bool needsSpectrum: root.active && !Settings.data.general.compactLockScreen && Settings.data.audio.visualizerType !== "" && Settings.data.audio.visualizerType !== "none" && MediaService.isPlaying onActiveChanged: { if (root.active && root.needsSpectrum) { diff --git a/Modules/LockScreen/LockScreenPanel.qml b/Modules/LockScreen/LockScreenPanel.qml index ddd0678c4..03c4e3e1d 100644 --- a/Modules/LockScreen/LockScreenPanel.qml +++ b/Modules/LockScreen/LockScreenPanel.qml @@ -264,7 +264,7 @@ Item { Loader { anchors.fill: parent anchors.margins: 4 - active: Settings.data.audio.visualizerType === "linear" + active: Settings.data.audio.visualizerType === "linear" && MediaService.isPlaying z: 0 sourceComponent: NLinearSpectrum { anchors.fill: parent @@ -278,7 +278,7 @@ Item { Loader { anchors.fill: parent anchors.margins: 4 - active: Settings.data.audio.visualizerType === "mirrored" + active: Settings.data.audio.visualizerType === "mirrored" && MediaService.isPlaying z: 0 sourceComponent: NMirroredSpectrum { anchors.fill: parent @@ -292,7 +292,7 @@ Item { Loader { anchors.fill: parent anchors.margins: 4 - active: Settings.data.audio.visualizerType === "wave" + active: Settings.data.audio.visualizerType === "wave" && MediaService.isPlaying z: 0 sourceComponent: NWaveSpectrum { anchors.fill: parent diff --git a/Modules/Panels/Media/MediaPlayerPanel.qml b/Modules/Panels/Media/MediaPlayerPanel.qml index 400738f9e..79100e25e 100644 --- a/Modules/Panels/Media/MediaPlayerPanel.qml +++ b/Modules/Panels/Media/MediaPlayerPanel.qml @@ -50,7 +50,7 @@ SmartPanel { readonly property bool isSideBySide: root.compactMode && root.showAlbumArt - readonly property bool needsSpectrum: root.showVisualizer && root.visualizerType !== "" && root.visualizerType !== "none" && root.isPanelOpen + readonly property bool needsSpectrum: root.showVisualizer && root.visualizerType !== "" && root.visualizerType !== "none" && root.isPanelOpen && MediaService.isPlaying onNeedsSpectrumChanged: { if (root.needsSpectrum) {