emmental/playlist/__init__.py

95 lines
2.9 KiB
Python
Raw Normal View History

# Copyright 2021 (c) Anna Schumaker.
from . import column
from . import controls
from . import footer
from . import header
from . import model
from . import runtime
from . import view
from gi.repository import Gtk
import audio
import tagdb
class Panel(Gtk.Box):
def __init__(self):
Gtk.Box.__init__(self)
self.set_orientation(Gtk.Orientation.VERTICAL)
self.header = header.Header()
self.window = view.PlaylistWindow()
self.footer = footer.Footer(self.window.get_filter_model())
self.append(self.header)
self.append(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL))
self.append(self.window)
self.append(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL))
self.append(self.footer)
def get_playlist(self): return self.window.get_playlist()
def set_playlist(self, plist):
self.header.set_playlist(plist)
self.window.set_playlist(plist)
Model = model.TagModel()
def on_filter_pending(filter, pending):
runtime.set_visible_count(FilterModel.get_n_items())
FilterModel = Gtk.FilterListModel()
FilterModel.connect("notify::pending", on_filter_pending)
FilterModel.set_filter(Model.Controls.filter)
FilterModel.set_model(Model)
Selection = Gtk.MultiSelection()
Selection.set_model(FilterModel)
def on_row_activate(view, position):
track = FilterModel.get_item(position)
if audio.play_track(track):
Model.tag.track_selected(track)
tagdb.save()
View = Gtk.ColumnView()
View.connect("activate", on_row_activate)
View.add_css_class("data-table")
View.set_enable_rubberband(True)
View.set_hexpand(True)
View.set_vexpand(True)
View.set_model(Selection)
View.append_column(column.OldColumn("#", "tracknumber"))
View.append_column(column.OldColumn("Title", "title", width=250, expand=True))
View.append_column(column.OldColumn("Length", "length", align=100))
View.append_column(column.OldColumn("Artist", "artist", width=150))
View.append_column(column.OldColumn("Album", "album", width=150))
View.append_column(column.OldColumn("Year", "year"))
View.append_column(column.OldColumn("Count", "playcount"))
View.append_column(column.OldColumn("Last Played", "lastplayed", width=150))
Scroll = Gtk.ScrolledWindow()
Scroll.set_child(View)
def scroll_to_track(track):
adj = View.get_vadjustment()
for i in range(FilterModel.get_n_items()):
if FilterModel.get_item(i) == track:
Selection.select_item(i, True)
pos = (max(i - 5, 0) / FilterModel.get_n_items())
adj.set_value(pos * adj.get_upper())
return
def scroll_to_current(*args):
scroll_to_track(audio.Player.track)
Model.Controls.jump.connect("clicked", scroll_to_current)
def on_tracks_changed(player, prev, new):
scroll_to_track(new)
audio.Player.connect("track-changed", on_tracks_changed)
Box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
Box.append(Model.Controls)
Box.append(Scroll)
Box.append(Gtk.Separator.new(Gtk.Orientation.HORIZONTAL))
Box.append(runtime.Box)