lib: Give Tags an ability to loop during next()

I also provide a can_loop() function that the UI can use to determine
activatability of the loop toogle button.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-07-06 11:25:20 -04:00
parent 6d2a817a9b
commit 935087a040
2 changed files with 23 additions and 8 deletions

View File

@ -7,6 +7,7 @@ class Tag:
self.name = name
self.sort = sort.lower() if sort else str(name).lower()
self.current = -1
self.loop = False
self.tracks = [ ]
self.widgets = None
self.lock = threading.Lock()
@ -18,6 +19,7 @@ class Tag:
return { "name" : self.name,
"sort" : self.sort,
"current" : self.current,
"loop" : self.loop,
"tracks" : [ t.trackid for t in self.tracks ] }
def __len__(self):
@ -31,10 +33,16 @@ class Tag:
return True
return self.sort < rhs.parent.sort
def __next_track__(self):
if self.loop == True and self.current >= len(self.tracks):
return 0
return self.current + 1
def __setstate__(self, state):
self.name = state["name"]
self.sort = state["sort"]
self.current = state["current"]
self.loop = state["loop"]
self.tracks = state["tracks"]
self.widgets = None
self.lock = threading.Lock()
@ -49,6 +57,8 @@ class Tag:
self.tracks.append(track)
self.TrackAdded.publish(self, track)
def can_loop(self): return True
def get_header(self):
return self.sort[0].upper() if len(self.sort) > 0 else ""
@ -62,7 +72,7 @@ class Tag:
def next(self):
with self.lock:
self.current += 1
self.current = self.__next_track__()
if self.current < len(self.tracks):
return self.tracks[self.current]
return None
@ -79,12 +89,9 @@ class SuperTag(Tag):
self.parent = parent
def __getstate__(self):
with self.lock:
return { "name" : self.name,
"sort" : self.sort,
"current" : self.current,
"tracks" : [ t.trackid for t in self.tracks ],
"parent" : self.parent }
state = Tag.__getstate__(self)
state["parent"] = self.parent
return state
def __lt__(self, rhs):
if not isinstance(rhs, SuperTag):

View File

@ -22,6 +22,8 @@ class TestTag(unittest.TestCase):
self.assertEqual(t.sort, "test")
self.assertEqual(t.current, -1)
self.assertEqual(t.tracks, [ ])
self.assertFalse(t.loop)
self.assertTrue( t.can_loop())
self.assertIsNone(t.widgets)
self.assertIsInstance(t.lock, type(threading.Lock()))
self.assertIsInstance(t.TrackAdded, publisher.Publisher)
@ -61,11 +63,12 @@ class TestTag(unittest.TestCase):
state = t.__getstate__()
self.assertEqual(set(state.keys()),
set([ "name", "sort", "current", "tracks" ]))
set([ "name", "sort", "current", "loop", "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 ])
self.assertFalse(state["loop"])
state["sort"] = "sort"
state["current"] = 42
@ -77,6 +80,7 @@ class TestTag(unittest.TestCase):
self.assertEqual(t.current, 42)
self.assertEqual(t.tracks, [ 0, 1, 2, 3, 4 ])
self.assertEqual(t.widgets, None)
self.assertFalse(t.loop)
self.assertIsInstance(t.lock, type(threading.Lock()))
self.assertIsInstance(t.TrackAdded, publisher.Publisher)
self.assertIsInstance(t.TrackRemoved, publisher.Publisher)
@ -126,6 +130,10 @@ class TestTag(unittest.TestCase):
self.assertIsNone(t.next())
self.assertEqual(t.current, 3)
t.loop = True
self.assertEqual(t.next(), 1)
self.assertEqual(t.current, 0)
class TestSuperTag(unittest.TestCase):
def test_super_tag(self):