emmental/playlist/header.py

143 lines
4.1 KiB
Python

# Copyright 2021 (c) Anna Schumaker.
import audio
import db
import lib
from gi.repository import Gtk
from . import model
from . import view
class FilterEntry(lib.filter.Entry):
def __init__(self):
lib.filter.Entry.__init__(self, model.PlaylistFilter)
self.set_margin_start(200)
self.set_margin_end(200)
self.set_hexpand(True)
class PropertyToggle(Gtk.ToggleButton):
def __init__(self, prop, icon):
Gtk.ToggleButton.__init__(self)
self.set_icon_name(icon)
self.set_sensitive(False)
self.property = prop
self.playlist = None
def set_playlist(self, plist):
self.playlist = plist
self.set_active(plist.get_property(self.property))
def do_toggled(self):
if self.playlist:
self.playlist.set_property(self.property, self.get_active())
class RandomToggle(PropertyToggle):
def __init__(self):
PropertyToggle.__init__(self, "random", "media-playlist-shuffle")
def set_playlist(self, plist):
super().set_playlist(plist)
self.set_sensitive(plist != db.user.Table.find("Previous"))
class LoopToggle(PropertyToggle):
def __init__(self):
PropertyToggle.__init__(self, "loop", "media-playlist-repeat")
def set_playlist(self, plist):
super().set_playlist(plist)
self.set_sensitive(plist != db.user.Table.find("Collection") and
plist != db.user.Table.find("Previous") and
plist != db.user.Table.find("Queued Tracks"))
class SortButton(Gtk.MenuButton):
def __init__(self):
Gtk.MenuButton.__init__(self)
self.set_icon_name("view-sort-ascending")
self.set_popover(view.SortOrderPopover())
self.set_sensitive(False)
def set_playlist(self, plist):
self.get_popover().set_playlist(plist)
self.set_sensitive(plist != db.user.Table.find("Previous"))
class FavoriteButton(Gtk.ToggleButton):
def __init__(self):
Gtk.ToggleButton.__init__(self)
self.set_icon_name("emmental-favorites")
self.track_changed(audio.Player, None, audio.Player.track)
audio.Player.connect("track-changed", self.track_changed)
def set_playlist(self, plist):
pass
def track_changed(self, player, old, new):
self.set_sensitive(new != None)
self.set_active(new in db.user.Table.find("Favorites").get_tracks())
def do_toggled(self):
if audio.Player.track:
fav = db.user.Table.find("Favorites")
if self.get_active():
fav.add_track(audio.Player.track)
else:
fav.remove_track(audio.Player.track)
class JumpButton(Gtk.Button):
def __init__(self):
Gtk.Button.__init__(self)
self.set_icon_name("go-jump")
self.set_sensitive(False)
def set_playlist(self, plist):
self.set_sensitive(plist is not None)
class ControlBox(Gtk.Box):
def __init__(self):
Gtk.Box.__init__(self, margin_top=5, margin_bottom=5,
margin_end=5, margin_start=5)
self.add_css_class("linked")
def set_playlist(self, plist):
child = self.get_first_child()
while child:
child.set_playlist(plist)
child = child.get_next_sibling()
class TrackBox(ControlBox):
def __init__(self):
ControlBox.__init__(self)
self.append(FavoriteButton())
self.append(JumpButton())
def get_jump_button(self):
return self.get_last_child()
class PlaylistBox(ControlBox):
def __init__(self):
ControlBox.__init__(self)
self.append(RandomToggle())
self.append(LoopToggle())
self.append(SortButton())
class Header(Gtk.Box):
def __init__(self):
Gtk.Box.__init__(self)
self.append(TrackBox())
self.append(FilterEntry())
self.append(PlaylistBox())
def get_jump_button(self):
return self.get_first_child().get_jump_button()
def set_playlist(self, plist):
self.get_first_child().set_playlist(plist)
self.get_last_child().set_playlist(plist)