diff --git a/components/MprisController.qml b/components/MprisController.qml index 9b92b0a..9303bed 100644 --- a/components/MprisController.qml +++ b/components/MprisController.qml @@ -8,76 +8,73 @@ import QtQuick import QtQuick.Layouts import Quickshell.Services.Mpris -Loader { +ColumnLayout { id: root required property MprisPlayer player - active: player != null + spacing: 12 - sourceComponent: ColumnLayout { - spacing: 12 - implicitWidth: 800 + implicitWidth: 800 - StyledText { - id: text - Layout.alignment: Qt.AlignHCenter - text: `${root.player.trackTitle} - ${root.player.trackArtist}` - font.pixelSize: Dimensions.mpris.fontSize - } + StyledText { + id: text + Layout.alignment: Qt.AlignHCenter + text: `${root.player.trackTitle} - ${root.player.trackArtist}` + font.pixelSize: Dimensions.mpris.fontSize + } - RowLayout { - Layout.alignment: Qt.AlignHCenter - StyledIconButton { - id: backButton - text: Icons.skipBack - onClicked: { - root.player.previous(); - } - } - StyledIconButton { - id: playPauseButton - text: root.player.isPlaying ? Icons.pause : Icons.play - onClicked: { - root.player.isPlaying = !root.player.isPlaying; - } - } - StyledIconButton { - id: forwardButton - text: Icons.skipForward - onClicked: { - root.player.next(); - } + RowLayout { + Layout.alignment: Qt.AlignHCenter + StyledIconButton { + id: backButton + text: Icons.skipBack + onClicked: { + root.player.previous(); } } - - StyledText { - Layout.alignment: Qt.AlignHCenter - text: { - function formatTime(num) { - return Math.floor(num).toString().padStart(2, "0"); - } - return `${formatTime(root.player.position / 60)}:${formatTime(root.player.position % 60)} - ${formatTime(root.player.length / 60)}:${formatTime(root.player.length % 60)}`; + StyledIconButton { + id: playPauseButton + text: root.player.isPlaying ? Icons.pause : Icons.play + onClicked: { + root.player.isPlaying = !root.player.isPlaying; } - font.pixelSize: Dimensions.mpris.fontSize } - - StyledSlider { - from: 0 - to: root.player.length ?? 0 - value: root.player.position - implicitHeight: 6 - Layout.fillWidth: true - onMoved: { - root.player.position = value; - } - - Timer { - running: root.player.isPlaying - interval: 1000 - repeat: true - onTriggered: root.player.positionChanged() + StyledIconButton { + id: forwardButton + text: Icons.skipForward + onClicked: { + root.player.next(); } } } + + StyledText { + Layout.alignment: Qt.AlignHCenter + text: { + function formatTime(num) { + return Math.floor(num).toString().padStart(2, "0"); + } + return `${formatTime(root.player.position / 60)}:${formatTime(root.player.position % 60)} - ${formatTime(root.player.length / 60)}:${formatTime(root.player.length % 60)}`; + } + font.pixelSize: Dimensions.mpris.fontSize + } + + StyledSlider { + from: 0 + to: root.player.length ?? 0 + value: root.player.position + implicitHeight: 6 + Layout.fillWidth: true + onMoved: { + root.player.position = value; + } + + Timer { + running: root.player.isPlaying + interval: 1000 + repeat: true + onTriggered: root.player.positionChanged() + } + } } diff --git a/components/MprisPlayerSelector.qml b/components/MprisPlayerSelector.qml deleted file mode 100644 index 3a39693..0000000 --- a/components/MprisPlayerSelector.qml +++ /dev/null @@ -1,52 +0,0 @@ -import qs.components -import qs.constants -import qs.services -import qs.widgets -import QtQuick -import QtQuick.Layouts - -RowLayout { - spacing: 8 - - Layout.alignment: Qt.AlignHCenter - - StyledIconButton { - id: previousPlayerButton - - visible: Mpris.players.length > 1 - text: Icons.chevronLeft - - onClicked: { - Mpris.previousPlayer(); - } - } - - StyledText { - text: { - if (!Mpris.active) { - return "inactive"; - } - const player = Mpris.active; - const displayName = player.identity ?? player.desktopEntry ?? player.dbusName ?? "unknown"; - if (displayName.toLowerCase().includes('tidal')) { - return "Tidal"; - } - if (displayName.toLowerCase().includes('zen')) { - return "Zen"; - } - return displayName; - } - font.pixelSize: 20 - } - - StyledIconButton { - id: nextPlayerButton - - visible: Mpris.players.length > 1 - text: Icons.chevronRight - - onClicked: { - Mpris.nextPlayer(); - } - } -} diff --git a/modules/drawers/dashboard/Dashboard.qml b/modules/drawers/dashboard/Dashboard.qml index b98647d..6bbaafe 100644 --- a/modules/drawers/dashboard/Dashboard.qml +++ b/modules/drawers/dashboard/Dashboard.qml @@ -1,7 +1,9 @@ pragma ComponentBehavior: Bound import qs.components +import qs.constants import qs.services +import qs.widgets import QtQuick import QtQuick.Layouts @@ -14,9 +16,44 @@ StyledDrawer { margin: 32 ColumnLayout { spacing: 8 + RowLayout { + spacing: 8 - MprisPlayerSelector { Layout.alignment: Qt.AlignHCenter + + StyledIconButton { + id: previousPlayerButton + + visible: Mpris.players.length > 1 + text: Icons.chevronLeft + + onClicked: { + Mpris.previousPlayer(); + } + } + + StyledText { + text: { + if (Mpris.active?.identity) { + const words = Mpris.active?.identity.split("-"); + const capitalized = words.map(val => String(val).charAt(0).toUpperCase() + String(val).slice(1)); + return capitalized.join(" "); + } + return Mpris.active?.desktopEntry ?? Mpris.active?.dbusName ?? "unknown"; + } + font.pixelSize: 20 + } + + StyledButton { + id: nextPlayerButton + visible: Mpris.players.length > 1 + + text: Icons.chevronRight + + onClicked: { + Mpris.nextPlayer(); + } + } } MprisController { diff --git a/services/Mpris.qml b/services/Mpris.qml index d95161f..2abc69d 100644 --- a/services/Mpris.qml +++ b/services/Mpris.qml @@ -8,7 +8,7 @@ Singleton { id: root property list players: Mpris.players.values - property MprisPlayer active: players[properties.currentIndex] ?? null + property MprisPlayer active: players[properties.currentIndex] PersistentProperties { id: properties