From 2852735d70ec1fdf46d1208169c89d4d2072c862 Mon Sep 17 00:00:00 2001 From: Benjamin Palko Date: Mon, 21 Jul 2025 13:34:33 -0400 Subject: [PATCH] mpris --- config/Dimensions.qml | 10 ++++++ modules/bar/Bar.qml | 2 ++ modules/bar/components/Mpris.qml | 29 ++++++++++++++++ modules/bar/components/Player.qml | 55 +++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 modules/bar/components/Mpris.qml create mode 100644 modules/bar/components/Player.qml diff --git a/config/Dimensions.qml b/config/Dimensions.qml index 1440bc2..113d640 100644 --- a/config/Dimensions.qml +++ b/config/Dimensions.qml @@ -9,6 +9,7 @@ Singleton { property int radius: 8 property Bar bar: Bar {} + property Mpris mpris: Mpris {} property Clock clock: Clock {} property Workspace workspace: Workspace {} @@ -24,6 +25,15 @@ Singleton { property int horizontalPadding: 8 } + component Mpris: QtObject { + id: clock + + property int fontSize: 14 + property int height: 30 + property int horizontalPadding: 8 + property int verticalPadding: 6 + } + component Clock: QtObject { id: clock diff --git a/modules/bar/Bar.qml b/modules/bar/Bar.qml index 095be8c..01b9e12 100644 --- a/modules/bar/Bar.qml +++ b/modules/bar/Bar.qml @@ -67,6 +67,8 @@ Scope { anchors.bottomMargin: Dimensions.bar.verticalPadding spacing: Dimensions.bar.spacing + + Mpris {} } Row { diff --git a/modules/bar/components/Mpris.qml b/modules/bar/components/Mpris.qml new file mode 100644 index 0000000..6d8f63c --- /dev/null +++ b/modules/bar/components/Mpris.qml @@ -0,0 +1,29 @@ +import Quickshell +import Quickshell.Services.Mpris +import QtQuick + +Item { + id: root + + property int currentIndex: 0 + + implicitWidth: childrenRect.width + implicitHeight: childrenRect.height + + Repeater { + id: players + model: Mpris.players.values.filter(item => item != null) + + Player { + + visible: index === root.currentIndex && modelData.canControl + + onNextPlayer: { + currentIndex = (currentIndex + 1) % players.count; + } + onPreviousPlayer: { + currentIndex = (currentIndex - 1 + players.count) % players.count; + } + } + } +} diff --git a/modules/bar/components/Player.qml b/modules/bar/components/Player.qml new file mode 100644 index 0000000..2a40343 --- /dev/null +++ b/modules/bar/components/Player.qml @@ -0,0 +1,55 @@ +import Quickshell +import Quickshell.Services.Mpris +import QtQuick +import "../../../styled/" +import "../../../config/" + +Item { + required property MprisPlayer modelData + required property int index + + signal nextPlayer() + signal previousPlayer() + + anchors.horizontalCenter: parent.horizontalCenter + implicitWidth: childrenRect.width + implicitHeight: Dimensions.mpris.height + + StyledLabel { + anchors.fill: parent + } + + StyledText { + text: `${modelData.isPlaying ? "" : ""} ${modelData.trackTitle} - ${modelData.trackArtist}` + + anchors.verticalCenter: parent.verticalCenter + topPadding: Dimensions.mpris.verticalPadding + bottomPadding: Dimensions.mpris.verticalPadding + leftPadding: Dimensions.mpris.horizontalPadding + rightPadding: Dimensions.mpris.horizontalPadding + + font.pixelSize: Dimensions.mpris.fontSize + } + + MouseArea { + anchors.fill: parent + + onClicked: { + if (!modelData.canTogglePlaying) { + return; + } + if (modelData.isPlaying) { + modelData.pause(); + } else { + modelData.play(); + } + } + onWheel: event => { + if (event.angleDelta.y > 0) { + parent.nextPlayer(); + } else if (event.angleDelta.y < 0) { + parent.previousPlayer(); + } + } + } +}