2021-10-30 09:13:04 -04:00
|
|
|
# Copyright 2021 (c) Anna Schumaker.
|
2021-12-06 11:32:49 -05:00
|
|
|
import db
|
2021-11-20 17:12:52 -05:00
|
|
|
import audio
|
2021-10-30 09:13:04 -04:00
|
|
|
from gi.repository import Gtk
|
2021-11-03 13:54:47 -04:00
|
|
|
from . import column
|
2021-10-30 09:13:04 -04:00
|
|
|
from . import model
|
2021-11-08 15:04:45 -05:00
|
|
|
from . import sort
|
2021-10-30 09:13:04 -04:00
|
|
|
|
|
|
|
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)
|
2021-11-20 17:12:52 -05:00
|
|
|
self.connect("activate", self.activated)
|
2021-11-22 11:16:23 -05:00
|
|
|
audio.Player.connect("track-changed", self.track_changed)
|
2021-10-30 09:13:04 -04:00
|
|
|
|
2021-11-03 13:54:47 -04:00
|
|
|
self.append_column(column.TracknoColumn())
|
2021-11-03 14:38:12 -04:00
|
|
|
self.append_column(column.TitleColumn())
|
2021-11-03 14:52:44 -04:00
|
|
|
self.append_column(column.LengthColumn())
|
2021-11-03 14:59:07 -04:00
|
|
|
self.append_column(column.ArtistColumn())
|
2021-11-03 15:10:37 -04:00
|
|
|
self.append_column(column.AlbumColumn())
|
2021-11-03 15:22:02 -04:00
|
|
|
self.append_column(column.SubtitleColumn())
|
2021-11-03 15:36:42 -04:00
|
|
|
self.append_column(column.YearColumn())
|
2021-11-03 15:46:50 -04:00
|
|
|
self.append_column(column.PlayCountColumn())
|
2021-11-03 16:03:49 -04:00
|
|
|
self.append_column(column.LastPlayedColumn())
|
2021-11-03 13:54:47 -04:00
|
|
|
|
2021-11-20 17:12:52 -05:00
|
|
|
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
|
2021-12-06 11:32:49 -05:00
|
|
|
if plist == db.user.Table.find("Queued Tracks"):
|
|
|
|
plist.remove_track(track)
|
2021-11-20 17:12:52 -05:00
|
|
|
|
2021-12-05 12:05:33 -05:00
|
|
|
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))
|
2021-12-09 17:49:22 -05:00
|
|
|
model.unselect_all()
|
2021-12-05 12:05:33 -05:00
|
|
|
|
2021-12-05 13:55:37 -05:00
|
|
|
def clear_selection(self):
|
|
|
|
self.get_model().unselect_all()
|
|
|
|
|
2021-12-06 11:28:12 -05:00
|
|
|
def scroll_to(self, track):
|
2021-11-22 11:16:23 -05:00
|
|
|
selection = self.get_model()
|
|
|
|
adjustment = self.get_vadjustment()
|
|
|
|
for i in range(selection.get_n_items()):
|
2021-12-06 11:28:12 -05:00
|
|
|
if selection.get_item(i) == track:
|
2021-11-22 11:16:23 -05:00
|
|
|
selection.select_item(i, True)
|
|
|
|
pos = max(i - 5, 0) * adjustment.get_upper()
|
|
|
|
adjustment.set_value(pos / selection.get_n_items())
|
2021-12-06 11:28:12 -05:00
|
|
|
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())
|
2021-11-22 11:16:23 -05:00
|
|
|
|
2021-10-30 09:13:04 -04:00
|
|
|
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)
|
2021-10-30 09:38:47 -04:00
|
|
|
|
|
|
|
|
|
|
|
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)
|
2021-12-05 12:05:33 -05:00
|
|
|
def selected_tracks(self): return self.get_child().selected_tracks()
|
2021-12-05 13:55:37 -05:00
|
|
|
def clear_selection(self): self.get_child().clear_selection()
|
2021-11-08 15:04:45 -05:00
|
|
|
|
|
|
|
|
|
|
|
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)
|
2021-11-08 15:57:31 -05:00
|
|
|
|
|
|
|
|
|
|
|
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)
|