# Copyright 2021 (c) Anna Schumaker. import db import audio from gi.repository import Gtk from . import column from . import model from . import sort class PlaylistView(Gtk.ColumnView): def __init__(self): Gtk.ColumnView.__init__(self) self.add_css_class("data-table") self.set_model(model.PlaylistSelection()) self.set_enable_rubberband(True) self.set_hexpand(True) self.set_vexpand(True) self.connect("activate", self.activated) audio.Player.connect("track-changed", self.track_changed) self.append_column(column.TracknoColumn()) self.append_column(column.TitleColumn()) self.append_column(column.LengthColumn()) self.append_column(column.ArtistColumn()) self.append_column(column.AlbumColumn()) self.append_column(column.SubtitleColumn()) self.append_column(column.YearColumn()) self.append_column(column.PlayCountColumn()) self.append_column(column.LastPlayedColumn()) def activated(self, view, position): track = self.get_model().get_item(position) if audio.play_track(track): plist = self.get_playlist() if index := plist.get_track_index(track): plist.current = index if plist == db.user.Table.find("Queued Tracks"): plist.remove_track(track) def selected_tracks(self): model = self.get_model() selection = model.get_selection() for n in range(selection.get_size()): yield model.get_item(selection.get_nth(n)) model.unselect_all() def clear_selection(self): self.get_model().unselect_all() def scroll_to(self, track): selection = self.get_model() adjustment = self.get_vadjustment() for i in range(selection.get_n_items()): if selection.get_item(i) == track: selection.select_item(i, True) pos = max(i - 5, 0) * adjustment.get_upper() adjustment.set_value(pos / selection.get_n_items()) return True return False def track_changed(self, player, old, new): if not self.scroll_to(new): self.scroll_to(self.get_playlist().get_current_track()) def get_filter_model(self): return self.get_model().get_filter_model() def get_playlist(self): return self.get_model().get_playlist() def set_playlist(self, plist): self.get_model().set_playlist(plist) class PlaylistWindow(Gtk.ScrolledWindow): def __init__(self): Gtk.ScrolledWindow.__init__(self) self.set_child(PlaylistView()) def get_filter_model(self): return self.get_child().get_filter_model() def get_playlist(self): return self.get_child().get_playlist() def set_playlist(self, plist): self.get_child().set_playlist(plist) def selected_tracks(self): return self.get_child().selected_tracks() def clear_selection(self): self.get_child().clear_selection() class SortOrderView(Gtk.ListView): def __init__(self): Gtk.ListView.__init__(self) self.set_model(Gtk.NoSelection.new(model.FlatSortModel())) self.set_factory(sort.Factory(self.get_model().get_model())) def set_playlist(self, plist): self.get_model().get_model().set_playlist(plist) class SortOrderPopover(Gtk.Popover): def __init__(self): Gtk.Popover.__init__(self) self.set_child(SortOrderView()) def set_playlist(self, plist): self.get_child().set_playlist(plist)