Files
sublime-music/sublime/ui/state.py
2020-05-08 11:30:23 -06:00

86 lines
2.5 KiB
Python

from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, List, Optional
from sublime.server.api_objects import Child
class RepeatType(Enum):
NO_REPEAT = 0
REPEAT_QUEUE = 1
REPEAT_SONG = 2
@property
def icon(self) -> str:
icon_name = ["repeat-symbolic", "repeat-symbolic", "repeat-song-symbolic"][
self.value
]
return f"media-playlist-{icon_name}"
def as_mpris_loop_status(self) -> str:
return ["None", "Playlist", "Track"][self.value]
@staticmethod
def from_mpris_loop_status(loop_status: str) -> "RepeatType":
return {
"None": RepeatType.NO_REPEAT,
"Track": RepeatType.REPEAT_SONG,
"Playlist": RepeatType.REPEAT_QUEUE,
}[loop_status]
@dataclass
class UIState:
"""Represents the UI state of the application."""
version: int = 1
playing: bool = False
current_song_index: int = -1
play_queue: List[str] = field(default_factory=list)
old_play_queue: List[str] = field(default_factory=list)
_volume: Dict[str, float] = field(default_factory=lambda: {"this device": 100.0})
is_muted: bool = False
repeat_type: RepeatType = RepeatType.NO_REPEAT
shuffle_on: bool = False
song_progress: float = 0
current_device: str = "this device"
current_tab: str = "albums"
selected_album_id: Optional[str] = None
selected_artist_id: Optional[str] = None
selected_browse_element_id: Optional[str] = None
selected_playlist_id: Optional[str] = None
# State for Album sort.
current_album_sort: str = "random"
current_album_genre: str = "Rock"
current_album_alphabetical_sort: str = "name"
current_album_from_year: int = 2010
current_album_to_year: int = 2020
active_playlist_id: Optional[str] = None
def migrate(self):
pass
@property
def current_song(self) -> Optional[Child]:
from sublime.cache_manager import CacheManager
if (
not self.play_queue
or self.current_song_index < 0
or not CacheManager.ready()
):
return None
current_song_id = self.play_queue[self.current_song_index]
return CacheManager.get_song_details(current_song_id).result()
@property
def volume(self) -> float:
return self._volume.get(self.current_device, 100.0)
@volume.setter
def volume(self, value: float):
self._volume[self.current_device] = value