72 lines
2.7 KiB
Python
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
|