emmental/tagdb/stack.py

76 lines
2.0 KiB
Python

# Copyright 2021 (c) Anna Schumaker.
from lib import counter
from lib import publisher
from . import tags
class TagStack:
def __init__(self):
self.tags = [ ]
self.Counter = counter.Counter(-1, 99)
self.PushPop = publisher.Publisher()
self.NextTrack = publisher.Publisher()
def __do_next__(self, tag):
if track := tag.next():
track.add_to_playlist("Previous")
return track
def __getstate__(self):
return { "tags" : self.tags }
def __setstate__(self, state):
self.__dict__.update(state)
self.Counter = counter.Counter(-1, 99)
self.PushPop = publisher.Publisher()
self.NextTrack = publisher.Publisher()
def current(self):
if len(self.tags) == 0:
return tags.User.store["Collection"]
return self.tags[0]
def __next_track__(self):
if len(self.tags) == 0:
return self.__do_next__(tags.User["Collection"])
if track := self.__do_next__(self.tags[0]):
return track
self.pop()
return self.__next_track__()
def next(self):
ret = self.__next_track__()
count = self.Counter.decrement()
self.NextTrack.publish(ret)
return (ret, count != -1)
def pop(self):
prev = self.tags.pop(0)
self.PushPop.publish(prev, self.current())
def previous(self):
return tags.User["Previous"].next()
def push(self, tag):
prev = self.current()
if tag == tags.User["Previous"]:
return
if tag == tags.User["Collection"]:
self.tags.clear()
self.PushPop.publish(prev, tags.User["Collection"])
return
if tag in self.tags:
self.tags.remove(tag)
self.tags.insert(0, tag)
tag.stacked()
self.PushPop.publish(prev, tag)
def queue(self, track):
track.add_to_playlist("Up Next")
self.push(tags.User["Up Next"])
def reset(self):
self.tags.clear()
self.count = None
self.PushPop.reset()