summaryrefslogtreecommitdiff
path: root/raveos-hyprland-theme/theme-data/dms/Services/MprisController.qml
diff options
context:
space:
mode:
authorNippy <nippy@rp1.hu>2026-05-08 19:50:49 +0200
committerNippy <nippy@rp1.hu>2026-05-08 19:50:49 +0200
commit3462bcc46ecf74f576ea4397f16492c16bd75b10 (patch)
treec5ab7aef4498647e057bda8d49c11e5f9dda74c9 /raveos-hyprland-theme/theme-data/dms/Services/MprisController.qml
parent56616f693b4f263cbf0d47da43b67424efa6022d (diff)
downloadRaveOS-PKGBUILD-3462bcc46ecf74f576ea4397f16492c16bd75b10.tar.gz
RaveOS-PKGBUILD-3462bcc46ecf74f576ea4397f16492c16bd75b10.zip
raveos update
Diffstat (limited to 'raveos-hyprland-theme/theme-data/dms/Services/MprisController.qml')
-rw-r--r--raveos-hyprland-theme/theme-data/dms/Services/MprisController.qml78
1 files changed, 78 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/dms/Services/MprisController.qml b/raveos-hyprland-theme/theme-data/dms/Services/MprisController.qml
new file mode 100644
index 0000000..44ad135
--- /dev/null
+++ b/raveos-hyprland-theme/theme-data/dms/Services/MprisController.qml
@@ -0,0 +1,78 @@
+pragma Singleton
+pragma ComponentBehavior: Bound
+
+import QtQuick
+import Quickshell
+import Quickshell.Services.Mpris
+import qs.Common
+
+Singleton {
+ id: root
+
+ readonly property list<MprisPlayer> availablePlayers: Mpris.players.values
+ property MprisPlayer activePlayer: null
+
+ onAvailablePlayersChanged: _resolveActivePlayer()
+ Component.onCompleted: _resolveActivePlayer()
+
+ Instantiator {
+ model: root.availablePlayers
+ delegate: Connections {
+ required property MprisPlayer modelData
+ target: modelData
+ function onIsPlayingChanged() {
+ if (modelData.isPlaying)
+ root._resolveActivePlayer();
+ }
+ }
+ }
+
+ function _resolveActivePlayer(): void {
+ const playing = availablePlayers.find(p => p.isPlaying);
+ if (playing) {
+ activePlayer = playing;
+ _persistIdentity(playing.identity);
+ return;
+ }
+ if (activePlayer && availablePlayers.indexOf(activePlayer) >= 0)
+ return;
+ const savedId = SessionData.lastPlayerIdentity;
+ if (savedId) {
+ const match = availablePlayers.find(p => p.identity === savedId);
+ if (match) {
+ activePlayer = match;
+ return;
+ }
+ }
+ activePlayer = availablePlayers.find(p => p.canControl && p.canPlay) ?? null;
+ if (activePlayer)
+ _persistIdentity(activePlayer.identity);
+ }
+
+ function setActivePlayer(player: MprisPlayer): void {
+ activePlayer = player;
+ if (player)
+ _persistIdentity(player.identity);
+ }
+
+ function _persistIdentity(identity: string): void {
+ if (identity && SessionData.lastPlayerIdentity !== identity)
+ SessionData.set("lastPlayerIdentity", identity);
+ }
+
+ Timer {
+ interval: 1000
+ running: root.activePlayer?.playbackState === MprisPlaybackState.Playing
+ repeat: true
+ onTriggered: root.activePlayer?.positionChanged()
+ }
+
+ function previousOrRewind(): void {
+ if (!activePlayer)
+ return;
+ if (activePlayer.position > 8 && activePlayer.canSeek)
+ activePlayer.position = 0;
+ else if (activePlayer.canGoPrevious)
+ activePlayer.previous();
+ }
+}