diff --git a/modules/Modules.qml b/modules/Modules.qml index 2ccdbf5..2992789 100644 --- a/modules/Modules.qml +++ b/modules/Modules.qml @@ -20,7 +20,8 @@ QtObject { enable: true }) property var notifications: ({ - enable: true + enable: true, + timeout: 3000 }) property var mpris: ({ enable: true diff --git a/modules/Mpris.qml b/modules/Mpris.qml index ada56ba..f6e26ac 100644 --- a/modules/Mpris.qml +++ b/modules/Mpris.qml @@ -12,8 +12,14 @@ M.BarSection { visible: opacity > 0 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 + + // Reset index if current player disappears + on_PlayersChanged: if (_playerIdx >= _players.length) + _playerIdx = 0 property string _cachedArt: "" property string _artTrack: "" @@ -428,15 +434,48 @@ M.BarSection { } } - // Player name - Text { - width: parent.width - height: 20 - horizontalAlignment: Text.AlignHCenter - text: root.player?.identity ?? "" - color: M.Theme.base03 - font.pixelSize: M.Theme.fontSize - 2 - font.family: M.Theme.fontFamily + // Player switcher + Row { + anchors.horizontalCenter: parent.horizontalCenter + height: 22 + spacing: 6 + + Repeater { + model: root._players + + 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 + } + } + } } } } diff --git a/modules/NotifService.qml b/modules/NotifService.qml index 445cec0..5e408fb 100644 --- a/modules/NotifService.qml +++ b/modules/NotifService.qml @@ -4,6 +4,7 @@ import QtQuick import Quickshell import Quickshell.Io import Quickshell.Services.Notifications +import "." as M QtObject { id: root @@ -84,7 +85,7 @@ QtObject { // Auto-expire 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(() => { _expireTimer.createObject(root, { _notifId: data.id, diff --git a/nix/hm-module.nix b/nix/hm-module.nix index 3752617..fe989d7 100644 --- a/nix/hm-module.nix +++ b/nix/hm-module.nix @@ -82,7 +82,6 @@ in "tray" "windowTitle" "clock" - "notifications" "mpris" "volume" "idleInhibitor" @@ -91,6 +90,13 @@ in in simpleModules // { + notifications = moduleOpt "notifications" { + timeout = lib.mkOption { + type = lib.types.int; + default = 3000; + description = "Notification popup timeout in milliseconds."; + }; + }; bluetooth = moduleOpt "bluetooth" (intervalOpt 5000); network = moduleOpt "network" (intervalOpt 5000); powerProfile = moduleOpt "powerProfile" (intervalOpt 5000);