Source code for bauiv1lib.soundtrack.macmusicapp

# Released under the MIT License. See LICENSE for details.
#
"""UI functionality related to using the macOS Music app for soundtracks."""

from __future__ import annotations

import copy
from typing import TYPE_CHECKING

import bauiv1 as bui

if TYPE_CHECKING:
    from typing import Any, Callable


[docs] class MacMusicAppPlaylistSelectWindow(bui.Window): """Window for selecting an iTunes playlist.""" def __init__( self, callback: Callable[[Any], Any], existing_playlist: str | None, existing_entry: Any, ): from baclassic.macmusicapp import MacMusicAppMusicPlayer self._r = 'editSoundtrackWindow' self._callback = callback self._existing_playlist = existing_playlist self._existing_entry = copy.deepcopy(existing_entry) self._width = 520.0 self._height = 520.0 self._spacing = 45.0 v = self._height - 90.0 v -= self._spacing * 1.0 super().__init__( root_widget=bui.containerwidget( size=(self._width, self._height), transition='in_right' ) ) btn = bui.buttonwidget( parent=self._root_widget, position=(35, self._height - 65), size=(130, 50), label=bui.Lstr(resource='cancelText'), on_activate_call=self._back, autoselect=True, ) bui.containerwidget(edit=self._root_widget, cancel_button=btn) assert bui.app.classic is not None bui.textwidget( parent=self._root_widget, position=(20, self._height - 54), size=(self._width, 25), text=bui.Lstr(resource=self._r + '.selectAPlaylistText'), color=bui.app.ui_v1.title_color, h_align='center', v_align='center', maxwidth=200, ) self._scrollwidget = bui.scrollwidget( parent=self._root_widget, position=(40, v - 340), size=(self._width - 80, 400), claims_tab=True, selection_loops_to_parent=True, ) bui.widget(edit=self._scrollwidget, right_widget=self._scrollwidget) self._column = bui.columnwidget( parent=self._scrollwidget, claims_tab=True, selection_loops_to_parent=True, ) bui.textwidget( parent=self._column, size=(self._width - 80, 22), text=bui.Lstr(resource=self._r + '.fetchingITunesText'), color=(0.6, 0.9, 0.6, 1.0), scale=0.8, ) assert bui.app.classic is not None musicplayer = bui.app.classic.music.get_music_player() assert isinstance(musicplayer, MacMusicAppMusicPlayer) musicplayer.get_playlists(self._playlists_cb) bui.containerwidget( edit=self._root_widget, selected_child=self._scrollwidget ) def _playlists_cb(self, playlists: list[str]) -> None: if self._column: for widget in self._column.get_children(): widget.delete() for i, playlist in enumerate(playlists): txt = bui.textwidget( parent=self._column, size=(self._width - 80, 30), text=playlist, v_align='center', maxwidth=self._width - 110, selectable=True, on_activate_call=bui.Call(self._sel, playlist), click_activate=True, ) bui.widget(edit=txt, show_buffer_top=40, show_buffer_bottom=40) if playlist == self._existing_playlist: bui.columnwidget( edit=self._column, selected_child=txt, visible_child=txt ) if i == len(playlists) - 1: bui.widget(edit=txt, down_widget=txt) def _sel(self, selection: str) -> None: if self._root_widget: bui.containerwidget(edit=self._root_widget, transition='out_right') self._callback({'type': 'iTunesPlaylist', 'name': selection}) def _back(self) -> None: bui.containerwidget(edit=self._root_widget, transition='out_right') self._callback(self._existing_entry)