Compare commits

...
2 changed files with 53 additions and 79 deletions

View file

@ -306,20 +306,14 @@ Column {
// Player switcher // Player switcher
Item { Item {
width: root.width width: root.width
height: root.players.length > 1 ? 28 : 0 height: root.players.length > 1 ? _playerFlow.implicitHeight + 6 : 0
visible: root.players.length > 1 visible: root.players.length > 1
Flickable { Flow {
id: _switcher id: _playerFlow
anchors.centerIn: parent anchors.horizontalCenter: parent.horizontalCenter
width: Math.min(_playerRow.implicitWidth, parent.width - 16) anchors.verticalCenter: parent.verticalCenter
height: 22 width: parent.width - 16
contentWidth: _playerRow.implicitWidth
clip: true
Row {
id: _playerRow
height: 22
spacing: 6 spacing: 6
Repeater { Repeater {
@ -337,7 +331,6 @@ Column {
color: _active ? S.Theme.base02 : (pHover.hovered ? S.Theme.base02 : "transparent") color: _active ? S.Theme.base02 : (pHover.hovered ? S.Theme.base02 : "transparent")
border.color: _active ? root.accentColor : S.Theme.base03 border.color: _active ? root.accentColor : S.Theme.base03
border.width: _active ? 1 : 0 border.width: _active ? 1 : 0
anchors.verticalCenter: parent.verticalCenter
Text { Text {
id: _pLabel id: _pLabel
@ -364,4 +357,3 @@ Column {
} }
} }
} }
}

View file

@ -1,6 +1,7 @@
pragma Singleton pragma Singleton
import QtQuick import QtQuick
import QtQml.Models
import Quickshell.Services.Mpris import Quickshell.Services.Mpris
QtObject { QtObject {
@ -13,7 +14,6 @@ QtObject {
property string _selectedIdentity: "" property string _selectedIdentity: ""
property var _lastPlayedTime: ({}) property var _lastPlayedTime: ({})
property var _watchers: []
onPlayerChanged: { onPlayerChanged: {
if (player) if (player)
@ -33,33 +33,18 @@ QtObject {
} }
} }
// Watch raw Mpris.players for add/remove - this does NOT fire on state changes // Watch all raw players for state changes via Instantiator -
property Connections _mprisConn: Connections { // delegates persist across state changes since the model only
target: Mpris // changes on player add/remove, not property changes
function onPlayersChanged() { property Instantiator _stateWatchers: Instantiator {
root._reconnectWatchers(); model: Mpris.players
} delegate: QtObject {
} required property MprisPlayer modelData
property Connections _conn: Connections {
function _reconnectWatchers() { target: modelData
for (const w of _watchers)
w.destroy();
const raw = Mpris.players.values ?? [];
const newWatchers = [];
for (const p of raw) {
const conn = _watcherComp.createObject(root, {
target: p
});
newWatchers.push(conn);
}
_watchers = newWatchers;
}
property Component _watcherComp: Component {
Connections {
function onPlaybackStateChanged() { function onPlaybackStateChanged() {
root._onPlaybackStateChanged(target); root._onPlaybackStateChanged(modelData);
}
} }
} }
} }
@ -84,7 +69,6 @@ QtObject {
} }
} }
} else if (p.playbackState === MprisPlaybackState.Paused && p === player) { } else if (p.playbackState === MprisPlaybackState.Paused && p === player) {
// Current player paused - switch to a playing one if available
_switchToPlaying(); _switchToPlaying();
} }
} }
@ -139,6 +123,4 @@ QtObject {
if (players[idx]) if (players[idx])
_selectedIdentity = players[idx].identity ?? ""; _selectedIdentity = players[idx].identity ?? "";
} }
Component.onCompleted: _reconnectWatchers()
} }