lib: Give Tags a next() function

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-07-06 10:43:16 -04:00
parent 08a055bbe2
commit 6d2a817a9b
2 changed files with 41 additions and 7 deletions

View File

@ -6,6 +6,7 @@ class Tag:
def __init__(self, name, sort=None):
self.name = name
self.sort = sort.lower() if sort else str(name).lower()
self.current = -1
self.tracks = [ ]
self.widgets = None
self.lock = threading.Lock()
@ -14,9 +15,10 @@ class Tag:
def __getstate__(self):
with self.lock:
return { "name" : self.name,
"sort" : self.sort,
"tracks" : [ t.trackid for t in self.tracks ] }
return { "name" : self.name,
"sort" : self.sort,
"current" : self.current,
"tracks" : [ t.trackid for t in self.tracks ] }
def __len__(self):
with self.lock:
@ -32,6 +34,7 @@ class Tag:
def __setstate__(self, state):
self.name = state["name"]
self.sort = state["sort"]
self.current = state["current"]
self.tracks = state["tracks"]
self.widgets = None
self.lock = threading.Lock()
@ -57,6 +60,13 @@ class Tag:
except Exception as e:
pass
def next(self):
with self.lock:
self.current += 1
if self.current < len(self.tracks):
return self.tracks[self.current]
return None
def remove_track(self, track):
with self.lock:
self.tracks.remove(track)
@ -70,9 +80,10 @@ class SuperTag(Tag):
def __getstate__(self):
with self.lock:
return { "name" : self.name,
"sort" : self.sort,
"tracks" : [ t.trackid for t in self.tracks ],
return { "name" : self.name,
"sort" : self.sort,
"current" : self.current,
"tracks" : [ t.trackid for t in self.tracks ],
"parent" : self.parent }
def __lt__(self, rhs):

View File

@ -20,6 +20,7 @@ class TestTag(unittest.TestCase):
t = tag.Tag("test")
self.assertEqual(t.name, "test")
self.assertEqual(t.sort, "test")
self.assertEqual(t.current, -1)
self.assertEqual(t.tracks, [ ])
self.assertIsNone(t.widgets)
self.assertIsInstance(t.lock, type(threading.Lock()))
@ -59,16 +60,21 @@ class TestTag(unittest.TestCase):
t.tracks = tracks
state = t.__getstate__()
self.assertEqual(set(state.keys()), set([ "name", "sort", "tracks" ]))
self.assertEqual(set(state.keys()),
set([ "name", "sort", "current", "tracks" ]))
self.assertEqual(state["name"], "test")
self.assertEqual(state["sort"], "test")
self.assertEqual(state["current"], -1)
self.assertEqual(state["tracks"], [ 0, 1, 2, 3, 4 ])
state["sort"] = "sort"
state["current"] = 42
t.__dict__.clear()
t.__setstate__(state)
self.assertEqual(t.name, "test")
self.assertEqual(t.sort, "sort")
self.assertEqual(t.current, 42)
self.assertEqual(t.tracks, [ 0, 1, 2, 3, 4 ])
self.assertEqual(t.widgets, None)
self.assertIsInstance(t.lock, type(threading.Lock()))
@ -104,6 +110,22 @@ class TestTag(unittest.TestCase):
self.assertEqual(t.tracks, [ ])
self.assertEqual(self.changed, (t, 2))
def test_tag_next(self):
t = tag.Tag("test")
t.tracks = [ 1, 2, 3 ]
self.assertEqual(t.next(), 1)
self.assertEqual(t.current, 0)
self.assertEqual(t.next(), 2)
self.assertEqual(t.current, 1)
self.assertEqual(t.next(), 3)
self.assertEqual(t.current, 2)
self.assertIsNone(t.next())
self.assertEqual(t.current, 3)
class TestSuperTag(unittest.TestCase):
def test_super_tag(self):
@ -117,6 +139,7 @@ class TestSuperTag(unittest.TestCase):
state = st.__getstate__()
self.assertEqual(state["name"], "test")
self.assertEqual(state["sort"], "sort")
self.assertEqual(state["current"], -1)
self.assertEqual(state["tracks"], [ 0, 1, 2, 3, 4 ])
self.assertEqual(state["parent"], parent)