80 lines
2.4 KiB
Python
80 lines
2.4 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
|
|
|
|
@property
|
|
def current_song(self) -> Optional[Child]:
|
|
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
|