118 lines
5.1 KiB
Python
118 lines
5.1 KiB
Python
# 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("notify::loaded", self.__database_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 __database_loaded(self, sql: db.Connection, param: GObject.ParamSpec):
|
|
self.set_sensitive(sql.loaded)
|
|
if sql.loaded is 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,
|
|
"<Control>question", enabled=(self, "sensitive")),
|
|
ActionEntry("goto-active-playlist", self._jump.activate,
|
|
"<Control><Alt>g", enabled=(self, "sensitive")),
|
|
ActionEntry("goto-playlists", self._playlists.activate,
|
|
"<Shift><Control>p", enabled=(self, "sensitive")),
|
|
ActionEntry("goto-artists", self._artists.activate,
|
|
"<Shift><Control>a", enabled=(self, "sensitive")),
|
|
ActionEntry("goto-genres", self._genres.activate,
|
|
"<Shift><Control>g", enabled=(self, "sensitive")),
|
|
ActionEntry("goto-decades", self._decades.activate,
|
|
"<Shift><Control>d", enabled=(self, "sensitive")),
|
|
ActionEntry("goto-libraries", self._libraries.activate,
|
|
"<Shift><Control>l", enabled=(self, "sensitive"))]
|