emmental/emmental/tracklist/__init__.py

72 lines
2.7 KiB
Python

# Copyright 2022 (c) Anna Schumaker.
"""A card for displaying a list of tracks."""
from gi.repository import GObject
from gi.repository import GLib
from gi.repository import Gio
from gi.repository import Gtk
from .. import db
from .. import entry
from .. import playlist
from . import buttons
from . import trackview
class Card(Gtk.Box):
"""Our Tracklist."""
sql = GObject.Property(type=db.Connection)
playlist = GObject.Property(type=playlist.playlist.Playlist)
def __init__(self, sql: db.Connection, **kwargs):
"""Set up the Tracklist widget."""
super().__init__(sql=sql, orientation=Gtk.Orientation.VERTICAL,
spacing=6, **kwargs)
self._top_left = Gtk.Box()
self._top_box = Gtk.CenterBox(margin_top=6, margin_start=6,
margin_end=6)
self._filter = entry.Filter("tracks", hexpand=True,
margin_start=100, margin_end=100)
self._trackview = trackview.TrackView(sql, margin_start=6,
margin_end=6)
self._visible_cols = buttons.VisibleColumns(self._trackview.columns)
self._unselect = Gtk.Button(icon_name="edit-select-none-symbolic",
has_frame=False, sensitive=False)
self._top_left.append(self._visible_cols)
self._top_left.append(self._unselect)
self._top_box.set_start_widget(self._top_left)
self._top_box.set_center_widget(self._filter)
self.append(self._top_box)
self.append(self._trackview)
self._trackview.bind_property("have-selected", self._unselect,
"sensitive")
self.bind_property("playlist", self._trackview, "playlist")
self._filter.connect("search-changed", self.__search_changed)
self._unselect.connect("clicked", self.__clear_selection)
self.add_css_class("card")
def __clear_selection(self, unselect: Gtk.Button) -> None:
self._trackview.clear_selected_tracks()
def __search_changed(self, filter: entry.Filter) -> None:
self.sql.tracks.filter(filter.get_query())
def __scroll_idle(self, track: db.tracks.Track) -> bool:
self._trackview.scroll_to_track(track)
return GLib.SOURCE_REMOVE
def scroll_to_track(self, track: db.tracks.Track) -> None:
"""Scroll to the requested Track."""
if self.playlist is not None:
GLib.idle_add(self.__scroll_idle, track)
@GObject.Property(type=Gio.ListModel)
def columns(self) -> Gio.ListModel:
"""Get the columns displayed in the Tracklist."""
return self._trackview.columns