emmental/playlist/model.py

73 lines
2.3 KiB
Python

# Copyright 2021 (c) Anna Schumaker.
from . import controls
from . import runtime
from lib import bus
from gi.repository import GObject, Gio
import audio
class TagModel(GObject.GObject, Gio.ListModel):
def __init__(self, tag=None):
GObject.GObject.__init__(self)
self.Controls = controls.Controls()
self.bus = bus.Bus(1)
self.items = [ ]
self.__set_tag__(tag)
audio.Player.TrackChanged.register(self.on_tracks_changed)
def __set_tag__(self, tag):
self.tag = tag
if self.tag != None:
self.items = self.tag.tracks.copy()
self.tag.TrackAdded.register(self.track_added)
self.tag.TrackRemoved.register(self.track_removed)
self.Controls.set_tag(tag)
return len(self.items)
def __unset_tag__(self):
n = len(self.items)
if self.tag:
self.tag.TrackAdded.unregister(self.track_added)
self.tag.TrackRemoved.unregister(self.track_removed)
self.items.clear()
return n
def do_get_item_type(self):
return GObject.TYPE_PYOBJECT
def do_get_n_items(self):
return len(self.items)
def do_get_item(self, n):
if n < len(self.items):
return self.items[n]
def items_changed(self, pos, removed, added):
super().items_changed(pos, removed, added)
runtime.set_runtime(self.tag.runtime)
runtime.set_visible_count(len(self.items))
def switch_tag(self, tag):
removed = self.__unset_tag__()
added = self.__set_tag__(tag)
self.items_changed(0, removed, added)
def do_track_added(self, tag, track, pos):
self.items.insert(pos, track)
self.items_changed(pos, 0, 1)
def track_added(self, tag, track, pos):
self.bus.board(self.do_track_added, tag, track, pos)
def do_track_removed(self, tag, track, pos):
self.items.remove(track)
self.items_changed(pos, 1, 0)
def track_removed(self, tag, track, pos):
self.bus.board(self.do_track_removed, tag, track, pos)
def on_tracks_changed(self, prev, new):
if prev in self.items:
self.items_changed(self.items.index(prev), 1, 1)
if new in self.items:
self.items_changed(self.items.index(new), 1, 1)