emmental/playlist/column.py

105 lines
3.6 KiB
Python
Raw Normal View History

# Copyright 2021 (c) Anna Schumaker.
import audio
import lib
from gi.repository import Gtk, GLib
from lib import settings
class LabelFactory(Gtk.SignalListItemFactory):
def __init__(self, xalign):
Gtk.SignalListItemFactory.__init__(self)
self.connect("setup", self.on_setup)
self.connect("bind", self.on_bind)
self.connect("unbind", self.on_unbind)
self.connect("teardown", self.on_teardown)
self.xalign = xalign
def get_track_text(self, track):
raise NotImplementedError
def on_setup(self, factory, listitem):
listitem.set_child(Gtk.Label(xalign=self.xalign))
def on_bind(self, factory, listitem):
text = self.get_track_text(listitem.get_item())
listitem.get_child().set_text(text)
def on_unbind(self, factory, listitem):
listitem.get_child().set_text("")
def on_teardown(self, factory, listitem):
listitem.set_child(None)
class TracknoFactory(LabelFactory):
def __init__(self): LabelFactory.__init__(self, xalign=1)
def get_track_text(self, track): return f"{track.disc.number}-{track.number:02}"
class TitleFactory(LabelFactory):
def __init__(self): LabelFactory.__init__(self, xalign=0)
def get_track_text(self, track): return track.title
class LengthFactory(LabelFactory):
def __init__(self): LabelFactory.__init__(self, xalign=1)
def get_track_text(self, track):
(m, s) = divmod(int(track.length), 60)
return f"{m}:{s:02}"
class ArtistFactory(LabelFactory):
def __init__(self): LabelFactory.__init__(self, xalign=0)
def get_track_text(self, track): return track.artist.name
class AlbumFactory(LabelFactory):
def __init__(self): LabelFactory.__init__(self, xalign=0)
def get_track_text(self, track): return track.album.name
class SubtitleFactory(LabelFactory):
def __init__(self): LabelFactory.__init__(self, xalign=0)
def get_track_text(self, track): return track.disc.subtitle
class YearFactory(LabelFactory):
def __init__(self): LabelFactory.__init__(self, xalign=1)
def get_track_text(self, track): return str(track.year.year)
class PlayCountFactory(LabelFactory):
def __init__(self): LabelFactory.__init__(self, xalign=1)
def get_track_text(self, track): return str(track.playcount)
class LastPlayedFactory(LabelFactory):
def __init__(self): LabelFactory.__init__(self, xalign=0)
def get_track_text(self, track):
return "Never" if track.playcount == 0 else str(track.lastplayed)
class Column(Gtk.ColumnViewColumn):
def __init__(self, title, factory, width=-1, **kwargs):
Gtk.ColumnViewColumn.__init__(self, title=title, **kwargs)
self.set_factory(factory)
self.set_resizable(True)
lib.settings.initialize(f"column.{title}", width)
self.set_fixed_width(settings.get_int(f"column.{title}"))
self.connect("notify::fixed-width", self.width_changed)
def width_changed(self, col, param):
lib.settings.set(f"column.{self.get_title()}", self.get_fixed_width())
def TracknoColumn(): return Column("#", TracknoFactory())
def TitleColumn(): return Column("Title", TitleFactory(), width=250, expand=True)
def LengthColumn(): return Column("Length", LengthFactory())
def ArtistColumn(): return Column("Artist", ArtistFactory(), width=150, expand=True)
def AlbumColumn(): return Column("Album", AlbumFactory(), width=150, expand=True)
def SubtitleColumn(): return Column("Subtitle", SubtitleFactory(), width=150, expand=True)
def YearColumn(): return Column("Year", YearFactory())
def PlayCountColumn(): return Column("Count", PlayCountFactory())
def LastPlayedColumn(): return Column("Last Played", LastPlayedFactory())