# 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()