Compare commits

...

2 commits

Author SHA1 Message Date
Damocles
b5b2276ff1 mpris: player switcher for multiple media sessions 2026-04-13 00:49:07 +02:00
Damocles
dea4541718 configurable notification timeout, default 3s 2026-04-13 00:08:45 +02:00
4 changed files with 60 additions and 13 deletions

View file

@ -20,7 +20,8 @@ QtObject {
enable: true enable: true
}) })
property var notifications: ({ property var notifications: ({
enable: true enable: true,
timeout: 3000
}) })
property var mpris: ({ property var mpris: ({
enable: true enable: true

View file

@ -12,8 +12,14 @@ M.BarSection {
visible: opacity > 0 visible: opacity > 0
tooltip: "" tooltip: ""
readonly property MprisPlayer player: Mpris.players.values[0] ?? null property int _playerIdx: 0
readonly property var _players: Mpris.players.values ?? []
readonly property MprisPlayer player: _players[_playerIdx] ?? _players[0] ?? null
readonly property bool playing: player?.playbackState === MprisPlaybackState.Playing readonly property bool playing: player?.playbackState === MprisPlaybackState.Playing
// Reset index if current player disappears
on_PlayersChanged: if (_playerIdx >= _players.length)
_playerIdx = 0
property string _cachedArt: "" property string _cachedArt: ""
property string _artTrack: "" property string _artTrack: ""
@ -428,15 +434,48 @@ M.BarSection {
} }
} }
// Player name // Player switcher
Text { Row {
width: parent.width anchors.horizontalCenter: parent.horizontalCenter
height: 20 height: 22
horizontalAlignment: Text.AlignHCenter spacing: 6
text: root.player?.identity ?? ""
color: M.Theme.base03 Repeater {
font.pixelSize: M.Theme.fontSize - 2 model: root._players
font.family: M.Theme.fontFamily
delegate: Rectangle {
required property var modelData
required property int index
readonly property bool _active: index === root._playerIdx
width: _pLabel.implicitWidth + 12
height: 18
radius: 9
color: _active ? M.Theme.base02 : (pArea.containsMouse ? M.Theme.base02 : "transparent")
border.color: _active ? M.Theme.base0E : M.Theme.base03
border.width: _active ? 1 : 0
anchors.verticalCenter: parent.verticalCenter
Text {
id: _pLabel
anchors.centerIn: parent
text: modelData.identity ?? "Player"
color: _active ? M.Theme.base0E : M.Theme.base04
font.pixelSize: M.Theme.fontSize - 2
font.family: M.Theme.fontFamily
font.bold: _active
}
MouseArea {
id: pArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: root._playerIdx = index
}
}
}
} }
} }
} }

View file

@ -4,6 +4,7 @@ import QtQuick
import Quickshell import Quickshell
import Quickshell.Io import Quickshell.Io
import Quickshell.Services.Notifications import Quickshell.Services.Notifications
import "." as M
QtObject { QtObject {
id: root id: root
@ -84,7 +85,7 @@ QtObject {
// Auto-expire popup // Auto-expire popup
if (data.popup) { if (data.popup) {
const timeout = notif.expireTimeout > 0 ? notif.expireTimeout : 5000; const timeout = notif.expireTimeout > 0 ? notif.expireTimeout : (M.Modules.notifications.timeout || 3000);
Qt.callLater(() => { Qt.callLater(() => {
_expireTimer.createObject(root, { _expireTimer.createObject(root, {
_notifId: data.id, _notifId: data.id,

View file

@ -82,7 +82,6 @@ in
"tray" "tray"
"windowTitle" "windowTitle"
"clock" "clock"
"notifications"
"mpris" "mpris"
"volume" "volume"
"idleInhibitor" "idleInhibitor"
@ -91,6 +90,13 @@ in
in in
simpleModules simpleModules
// { // {
notifications = moduleOpt "notifications" {
timeout = lib.mkOption {
type = lib.types.int;
default = 3000;
description = "Notification popup timeout in milliseconds.";
};
};
bluetooth = moduleOpt "bluetooth" (intervalOpt 5000); bluetooth = moduleOpt "bluetooth" (intervalOpt 5000);
network = moduleOpt "network" (intervalOpt 5000); network = moduleOpt "network" (intervalOpt 5000);
powerProfile = moduleOpt "powerProfile" (intervalOpt 5000); powerProfile = moduleOpt "powerProfile" (intervalOpt 5000);