diff options
Diffstat (limited to 'blc2/functions/multichaser.py')
-rw-r--r-- | blc2/functions/multichaser.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/blc2/functions/multichaser.py b/blc2/functions/multichaser.py new file mode 100644 index 0000000..558112e --- /dev/null +++ b/blc2/functions/multichaser.py @@ -0,0 +1,73 @@ +from ..constants import MULTICHASER, ONESHOT +from .function import Function + +class MultiChaser(Function): + type = MULTICHASER + + def __init__(self, w, id_ = None, name = None): + super().__init__(w=w, id_=id_, name=name) + self._tracks = [] + + self._duration = 0 + self._actual_duration = 0 + self._scope = frozenset() + self._audio_scope = frozenset() + self._advance_mode = ONESHOT + ## Order is of the format: + ## (track 1 step number, track 2 step number, ... ) + self._order = [] + + @property + def audio_scope(self): + return self._audio_scope + + @property + def scope(self): + return self._scope + + @property + def tracks(self): + """Return the multichaser's tracks.""" + return tuple(self._tracks) + + def _recalculate(self, update=True): + self._duration = max(0, *(i.duration for i in self._tracks)) + self._actual_duration = max(0, *(i.actual_duration for i in self._tracks)) + self._scope = frozenset().union(*(i.scope for i in self._tracks)) + self._audio_scope = frozenset().union(*(i.audio_scope for i in self._tracks)) + if update: + self.w.function_changed(self) + + @property + def duration(self): + return self._duration + + @property + def actual_duration(self): + return self._actual_duration + + def register_track(self, track): + """Register a new track. + + Should only be called in the MultiChaserTrack constructor. + """ + self._tracks.append(track) + self.w.register_function_delete_callback(track, self._track_deleted, self) + self.w.register_function_change_callback(track, self._track_changed, self) + self._order = [(*i, 0) for i in self._order] + self._recalculate() + + def _track_changed(self, _): + ## May need to fix up indexes + pass + + def _track_deleted(self, track): + i = self._tracks.index(track) + self._order = + self._tracks.remove(track) + self._recalculate() + + def delete(self): + for track in self._tracks: + track.delete() + super().delete() |