mirror of
https://git.srhtnin.garden/sarah/SaraTune.git
synced 2026-10-15 02:23:17 +02:00
Media controls (MPRIS, Windows SMTC); stop old tracks when switching
This commit is contained in:
1 parent
e2d7515e08
commit
d7f5eba1c2
14 files changed
+799
-26
No files matched your search
+21
-5
@@ -15,7 +15,7 @@ from Library import Library, Matches
|
||||
from Metadata import Track
|
||||
from Player import Player
|
||||
from Playlists import ExportM3U, LoadPlaylists, NameTaken, Playlist, ReadM3U
|
||||
from PlayQueue import RestartAfterMs, Session, LoadSession
|
||||
from PlayQueue import RepeatModes, RestartAfterMs, Session, LoadSession
|
||||
from Transport import CoverImage, Transport
|
||||
from Widgets import App, EmptyState
|
||||
|
||||
@@ -51,6 +51,7 @@ class MusicMode(ft.Column):
|
||||
self.ViewArgument: object = None
|
||||
self.Shown: list[Track] = []
|
||||
self.RowsByPath: dict[str, list[ft.Container]] = {}
|
||||
self.NowPlaying: Optional[Track] = None # for the system media controls
|
||||
|
||||
ThePlayer.OnEnded = lambda: TheApp.Page.run_task(self._Ended)
|
||||
ThePlayer.OnChanged = self._PlayerChanged
|
||||
@@ -507,12 +508,14 @@ class MusicMode(ft.Column):
|
||||
IsCurrent = PathText == Current and (Context != "Queue" or Index == self.Queue.Index)
|
||||
Row.bgcolor = Palette.Surface0 if IsCurrent else None
|
||||
Lead = Row.content.controls[0]
|
||||
if isinstance(Lead, ft.Container) and isinstance(Lead.data, ft.Text):
|
||||
Lead = Lead.data # already showing the icon: start from the number again
|
||||
if IsCurrent:
|
||||
Row.content.controls[0] = ft.Container(
|
||||
ft.Icon(ft.Icons.VOLUME_UP if self.ThePlayer.Playing else ft.Icons.PAUSE, size=16,
|
||||
color=Palette.Mauve), width=36, data=Lead)
|
||||
elif isinstance(Lead, ft.Container) and isinstance(Lead.data, ft.Text):
|
||||
Row.content.controls[0] = Lead.data
|
||||
else:
|
||||
Row.content.controls[0] = Lead
|
||||
|
||||
async def _RowClicked(self, Context: str, Index: int) -> None:
|
||||
if Context == "Queue":
|
||||
@@ -552,6 +555,8 @@ class MusicMode(ft.Column):
|
||||
self.TheApp.Notify("Couldn't play any song in the queue (missing or unplayable files).", "error")
|
||||
|
||||
def _ShowNowPlaying(self, Item: Track) -> None:
|
||||
self.NowPlaying = Item
|
||||
self.TheApp.MediaChanged()
|
||||
Subtitle = " - ".join(Part for Part in (Item.DisplayArtist, Item.Album) if Part)
|
||||
self.Bar.ShowTrack(Item.DisplayTitle, Subtitle, None)
|
||||
self.TheApp.Page.run_task(self._LoadBarCover, Item.Path)
|
||||
@@ -606,7 +611,11 @@ class MusicMode(ft.Column):
|
||||
self.RepeatButton.tooltip = f"Repeat: {self.Queue.Repeat.lower()}"
|
||||
|
||||
def _ToggleShuffle(self, e) -> None:
|
||||
self.Queue.SetShuffle(not self.Queue.Shuffle)
|
||||
self.SetShuffle(not self.Queue.Shuffle)
|
||||
|
||||
def SetShuffle(self, Enabled: bool) -> None:
|
||||
self.Queue.SetShuffle(Enabled)
|
||||
self.TheApp.MediaModesChanged()
|
||||
self._ShowModes()
|
||||
self._Show(self.ShuffleButton)
|
||||
self.SaveSession()
|
||||
@@ -614,7 +623,12 @@ class MusicMode(ft.Column):
|
||||
self._Rebuild()
|
||||
|
||||
def _CycleRepeat(self, e) -> None:
|
||||
self.Queue.CycleRepeat()
|
||||
self.SetRepeat(RepeatModes[(RepeatModes.index(self.Queue.Repeat) + 1) % len(RepeatModes)])
|
||||
|
||||
def SetRepeat(self, Mode: str) -> None:
|
||||
"""Off, All or One."""
|
||||
self.Queue.Repeat = Mode if Mode in RepeatModes else "Off"
|
||||
self.TheApp.MediaModesChanged()
|
||||
self._ShowModes()
|
||||
self._Show(self.RepeatButton)
|
||||
self.SaveSession()
|
||||
@@ -659,6 +673,8 @@ class MusicMode(ft.Column):
|
||||
self.Queue.Clear()
|
||||
self.TheApp.Page.run_task(self.ThePlayer.Stop)
|
||||
self.Bar.ShowTrack("Nothing playing", "", None)
|
||||
self.NowPlaying = None
|
||||
self.TheApp.MediaChanged()
|
||||
self._AfterQueueEdit()
|
||||
|
||||
def _Reordered(self, Context: str, Old: Optional[int], New: Optional[int]) -> None:
|
||||
|
||||
Reference in new issue
Block a user