From 3b166bd27083a4e3e0cd57df23a87c1e0891fd17 Mon Sep 17 00:00:00 2001 From: loner <2788892716@qq.com> Date: Sat, 1 Nov 2025 02:15:44 +0800 Subject: [PATCH] fix: Media player auto-switching in Control Center Detailed Explanation: Addresses an issue where the media player would automatically switch,overriding user's manual selections when the Control Center was open. The core problem was that the automatic player detection logic was too aggressive and didn't respect explicit user choices. Previous attempts to pause auto-switching based on UI visibility were unreliable due to incorrect event handling for the custom NPanel component. --- Modules/ControlCenter/Cards/MediaCard.qml | 3 +-- Modules/ControlCenter/ControlCenterPanel.qml | 8 ++++++++ Services/MediaService.qml | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Modules/ControlCenter/Cards/MediaCard.qml b/Modules/ControlCenter/Cards/MediaCard.qml index d5753455..0138a859 100644 --- a/Modules/ControlCenter/Cards/MediaCard.qml +++ b/Modules/ControlCenter/Cards/MediaCard.qml @@ -179,8 +179,7 @@ NBox { onTriggered: function (action) { var index = parseInt(action) if (!isNaN(index)) { - MediaService.selectedPlayerIndex = index - MediaService.updateCurrentPlayer() + MediaService.switchToPlayer(index) } } } diff --git a/Modules/ControlCenter/ControlCenterPanel.qml b/Modules/ControlCenter/ControlCenterPanel.qml index fcc13cb8..0e899019 100644 --- a/Modules/ControlCenter/ControlCenterPanel.qml +++ b/Modules/ControlCenter/ControlCenterPanel.qml @@ -63,6 +63,14 @@ NPanel { readonly property int weatherHeight: Math.round(190 * Style.uiScaleRatio) readonly property int mediaSysMonHeight: Math.round(260 * Style.uiScaleRatio) + onOpened: { + MediaService.autoSwitchingPaused = true + } + + onClosed: { + MediaService.autoSwitchingPaused = false + } + panelContent: Item { id: content diff --git a/Services/MediaService.qml b/Services/MediaService.qml index 30295bc5..aa6a6648 100644 --- a/Services/MediaService.qml +++ b/Services/MediaService.qml @@ -171,6 +171,21 @@ Singleton { } } + property bool autoSwitchingPaused: false + + function switchToPlayer(index) { + let availablePlayers = getAvailablePlayers() + if (index >= 0 && index < availablePlayers.length) { + let newPlayer = availablePlayers[index] + if (newPlayer !== currentPlayer) { + currentPlayer = newPlayer + selectedPlayerIndex = index + currentPosition = currentPlayer ? currentPlayer.position : 0 + Logger.d("Media", "Manually switched to player " + currentPlayer.identity) + } + } + } + // Switch to the most recently active player function updateCurrentPlayer() { let newPlayer = findActivePlayer() @@ -289,6 +304,8 @@ Singleton { repeat: true running: true onTriggered: { + Logger.d("MediaService", "playerStateMonitor triggered. autoSwitchingPaused: " + root.autoSwitchingPaused) + if (autoSwitchingPaused) return // Only update if we don't have a playing player or if current player is paused if (!currentPlayer || !currentPlayer.isPlaying || currentPlayer.playbackState !== MprisPlaybackState.Playing) { updateCurrentPlayer()