emmental/lib/tag.py

81 lines
2.3 KiB
Python
Raw Normal View History

# Copyright 2021 (c) Anna Schumaker.
from . import publisher
import threading
class Tag:
def __init__(self, name):
self.name = name
self.tracks = [ ]
self.widgets = None
self.lock = threading.Lock()
self.TrackAdded = publisher.Publisher()
self.TrackRemoved = publisher.Publisher()
def __getstate__(self):
with self.lock:
return { "name" : self.name,
"tracks" : [ t.trackid for t in self.tracks ] }
def __len__(self):
with self.lock:
return len(self.tracks)
def __lt__(self, rhs):
if not isinstance(rhs, SuperTag):
return self.name < rhs.name
if self == rhs.parent:
return True
return self.name < rhs.parent.name
def __setstate__(self, state):
self.name = state["name"]
self.tracks = state["tracks"]
self.widgets = None
self.lock = threading.Lock()
self.TrackAdded = publisher.Publisher()
self.TrackRemoved = publisher.Publisher()
def __str__(self):
return self.name
def add_track(self, track):
with self.lock:
self.tracks.append(track)
self.TrackAdded.publish(self, track)
def init_track(self, track):
with self.lock:
try:
i = self.tracks.index(track.trackid)
self.tracks[i] = track
except Exception as e:
pass
def remove_track(self, track):
with self.lock:
self.tracks.remove(track)
self.TrackRemoved.publish(self, track)
class SuperTag(Tag):
def __init__(self, parent, name):
Tag.__init__(self, name)
self.parent = parent
def __getstate__(self):
with self.lock:
return { "name" : self.name,
"tracks" : [ t.trackid for t in self.tracks ],
"parent" : self.parent }
def __lt__(self, rhs):
if not isinstance(rhs, SuperTag):
return self.parent.name < rhs.name
if self.parent == rhs.parent:
return self.name < rhs.name
return self.parent.name < rhs.parent.name
def __setstate__(self, state):
Tag.__setstate__(self, state)
self.parent = state["parent"]