# Copyright 2022 (c) Anna Schumaker. """A card for displaying the list of playlists.""" from gi.repository import GObject from gi.repository import GLib from gi.repository import Gtk from . import artist from . import decade from . import genre from . import library from . import playlist from . import section from ..action import ActionEntry from .. import db from .. import entry class Card(Gtk.Box): """Our playlist Sidebar.""" sql = GObject.Property(type=db.Connection) show_all_artists = GObject.Property(type=bool, default=False) selected_playlist = GObject.Property(type=db.playlist.Playlist) def __init__(self, sql: db.Connection, **kwargs): """Set up the Sidebar widget.""" super().__init__(sql=sql, orientation=Gtk.Orientation.VERTICAL, sensitive=False, **kwargs) self._header = Gtk.CenterBox() self._filter = entry.Filter("playlists", hexpand=True) self._jump = Gtk.Button(icon_name="arrow4-down-symbolic", tooltip_text="scroll to current playlist") self._playlists = playlist.Section(self.sql.playlists) self._artists = artist.Section(self.sql.artists, self.sql.albums) self._genres = genre.Section(self.sql.genres) self._decades = decade.Section(self.sql.decades, self.sql.years) self._libraries = library.Section(self.sql.libraries) self._view = section.View(sql) self._header.set_center_widget(self._filter) self._header.set_end_widget(self._jump) self.append(self._header) for sect in [self._playlists, self._artists, self._genres, self._decades, self._libraries]: self._view.add(sect) self.append(self._view) self._view.bind_property("selected-playlist", self, "selected-playlist") self.bind_property("show-all-artists", self._artists, "show-all", GObject.BindingFlags.BIDIRECTIONAL) self._filter.connect("search-changed", self.__search_changed) self._jump.connect("clicked", self.__jump_to_playlist) self.sql.connect("table-loaded", self.__table_loaded) self._header.add_css_class("toolbar") self.add_css_class("card") def __jump_to_playlist(self, jump: Gtk.Button) -> None: self.select_playlist(self.sql.active_playlist) def __search_changed(self, entry: entry.Filter) -> None: self.sql.filter(entry.get_query()) def __table_loaded(self, sql: db.Connection, table: db.table.Table): if self.get_sensitive() is False: if False not in {tbl.loaded for tbl in sql.playlist_tables()}: self.set_sensitive(True) self.select_playlist(sql.active_playlist, 150) if len(sql.libraries) == 0: self._libraries.extra_widget.emit("clicked") def __select_playlist(self, playlist: db.playlist.Playlist) -> bool: if playlist is not None: section = self.table_section(playlist.table) if not section.active: section.active = True return GLib.SOURCE_CONTINUE section.select_playlist(playlist) return GLib.SOURCE_REMOVE def select_playlist(self, playlist: db.playlist.Playlist, timeout: int = 0) -> None: """Set the current active playlist.""" GLib.timeout_add(timeout, self.__select_playlist, playlist) def table_section(self, table: db.playlist.Table) -> section.Section: """Get the Section associated with a specific Playlist Table.""" match table: case self.sql.playlists: return self._playlists case self.sql.artists | self.sql.albums | self.sql.media: return self._artists case self.sql.genres: return self._genres case self.sql.decades | self.sql.years: return self._decades case self.sql.libraries: return self._libraries @property def accelerators(self) -> list[ActionEntry]: """Get a list of accelerators for the Sidebar.""" return [ActionEntry("focus-search-playlist", self._filter.grab_focus, "question", enabled=(self, "sensitive")), ActionEntry("goto-active-playlist", self._jump.activate, "g", enabled=(self, "sensitive")), ActionEntry("goto-playlists", self._playlists.activate, "p", enabled=(self, "sensitive")), ActionEntry("goto-artists", self._artists.activate, "a", enabled=(self, "sensitive")), ActionEntry("goto-genres", self._genres.activate, "g", enabled=(self, "sensitive")), ActionEntry("goto-decades", self._decades.activate, "d", enabled=(self, "sensitive")), ActionEntry("goto-libraries", self._libraries.activate, "l", enabled=(self, "sensitive"))]