summaryrefslogtreecommitdiff
path: root/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/MprisController.qml
diff options
context:
space:
mode:
Diffstat (limited to 'raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/MprisController.qml')
-rw-r--r--raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/MprisController.qml78
1 files changed, 78 insertions, 0 deletions
diff --git a/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/MprisController.qml b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/Services/MprisController.qml
new file mode 100644
index 0000000..44ad135
--- /dev/null
+++ b/raveos-theme/hyprland/theme-data/DankMaterialShell/quickshell/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();
+ }
+}