diff options
-rw-r--r-- | solo-tool-project/src/solo_tool/notifier.py | 1 | ||||
-rw-r--r-- | solo-tool-project/src/solo_tool/solo_tool.py | 8 | ||||
-rw-r--r-- | solo-tool-project/test/notifier_unittest.py | 1 | ||||
-rw-r--r-- | solo-tool-project/test/solo_tool_integrationtest.py | 34 | ||||
-rw-r--r-- | web-project/src/solo_tool_web.py | 3 |
5 files changed, 44 insertions, 3 deletions
diff --git a/solo-tool-project/src/solo_tool/notifier.py b/solo-tool-project/src/solo_tool/notifier.py index 73b84b7..dadf85c 100644 --- a/solo-tool-project/src/solo_tool/notifier.py +++ b/solo-tool-project/src/solo_tool/notifier.py @@ -4,6 +4,7 @@ class Notifier: PLAYBACK_RATE_EVENT = 2 CURRENT_SONG_EVENT = 3 CURRENT_KEY_POINT_EVENT = 3 + KEY_POINTS_EVENT = 4 def __init__(self, player): self._callbacks = dict() diff --git a/solo-tool-project/src/solo_tool/solo_tool.py b/solo-tool-project/src/solo_tool/solo_tool.py index 0f47aef..199e2ad 100644 --- a/solo-tool-project/src/solo_tool/solo_tool.py +++ b/solo-tool-project/src/solo_tool/solo_tool.py @@ -16,8 +16,9 @@ class SoloTool: self._song = index path = self._songs[index] self._player.setCurrentSong(path) - self._notifier.notify(Notifier.CURRENT_SONG_EVENT, index) self._keyPoint = 0.0 + self._notifier.notify(Notifier.CURRENT_SONG_EVENT, index) + self._notifier.notify(Notifier.CURRENT_KEY_POINT_EVENT, index) @staticmethod def _keyPointValid(kp: float) -> bool: @@ -49,13 +50,14 @@ class SoloTool: def keyPoints(self) -> list[float]: if self._song is None: return None - return self._keyPoints[self._song] + return self._keyPoints[self._song].copy() @keyPoints.setter def keyPoints(self, new: list[float]) -> None: if new is not None and self._song is not None: sanitized = sorted(list(set([p for p in new if SoloTool._keyPointValid(p)]))) self._keyPoints[self._song] = sanitized + self._notifier.notify(Notifier.KEY_POINTS_EVENT, sanitized.copy()) @property def keyPoint(self) -> float: @@ -127,3 +129,5 @@ class SoloTool: def registerCurrentKeyPointCallback(self, callback): self._notifier.registerCallback(Notifier.CURRENT_KEY_POINT_EVENT, callback) + def registerKeyPointsCallback(self, callback): + self._notifier.registerCallback(Notifier.KEY_POINTS_EVENT, callback) diff --git a/solo-tool-project/test/notifier_unittest.py b/solo-tool-project/test/notifier_unittest.py index 115d21a..51d3e48 100644 --- a/solo-tool-project/test/notifier_unittest.py +++ b/solo-tool-project/test/notifier_unittest.py @@ -38,6 +38,7 @@ def test_allEvents(uut): checkEvent(uut, Notifier.PLAYBACK_RATE_EVENT) checkEvent(uut, Notifier.CURRENT_SONG_EVENT) checkEvent(uut, Notifier.CURRENT_KEY_POINT_EVENT) + checkEvent(uut, Notifier.KEY_POINTS_EVENT) def test_eventWithoutRegisteredCallbacks(uut): uut.notify(Notifier.PLAYING_STATE_EVENT, 0) diff --git a/solo-tool-project/test/solo_tool_integrationtest.py b/solo-tool-project/test/solo_tool_integrationtest.py index 2a55df9..3d7d20f 100644 --- a/solo-tool-project/test/solo_tool_integrationtest.py +++ b/solo-tool-project/test/solo_tool_integrationtest.py @@ -405,3 +405,37 @@ def test_currentKeyPointNotification(uut): uut.keyPoint = 0.5 assert not called +def test_keyPointsNotification(uut): + called = False + receivedValue = None + def callback(value): + nonlocal called, receivedValue + called = True + receivedValue = value + + uut.registerKeyPointsCallback(callback) + assert not called + + song = "test.flac" + uut.addSong(song) + uut.song = 0 + assert not called + + # Adding list of key points triggers a notification + uut.keyPoints = [0.2, 0.4] + assert called + assert receivedValue == [0.2, 0.4] + called = False + + # Same list does trigger a notification again + uut.keyPoints = [0.2, 0.4] + assert called + assert receivedValue == [0.2, 0.4] + called = False + + # Incrementing list of key points triggers a notification after sanitization + uut.keyPoints += [0.2, None, 0.1] + assert called + assert receivedValue == [0.1, 0.2, 0.4] + called = False + diff --git a/web-project/src/solo_tool_web.py b/web-project/src/solo_tool_web.py index 6616d82..e3dd9aa 100644 --- a/web-project/src/solo_tool_web.py +++ b/web-project/src/solo_tool_web.py @@ -20,9 +20,10 @@ def keyPointTables() -> None: for kp in st._keyPoints[i]: ui.item(f"{kp:0.2}", on_click=handlers.setKeyPoint(st, kp)).props('clickable v-ripple') +st.registerKeyPointsCallback(lambda new: keyPointTables.refresh()) + def addKeyPoint() -> None: st.keyPoints += [st.keyPoint] - keyPointTables.refresh() def main(): fullscreen = ui.fullscreen() |