76 lines
2.0 KiB
Python
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()
|