X-Git-Url: https://git.immae.eu/?p=perso%2FImmae%2FProjets%2FPython%2FMusicSampler.git;a=blobdiff_plain;f=music_sampler%2Fkey.py;h=e05bb169354a7e6afc395cdb655a27a306f0ac4b;hp=e524c350d86c3cf7cb0ceb6a378ee9edd25724b5;hb=93a3e51e749afc0c3ba8488b900124fda6bb8774;hpb=6dc040edf2f31497d4492c159397c4634037be66 diff --git a/music_sampler/key.py b/music_sampler/key.py index e524c35..e05bb16 100644 --- a/music_sampler/key.py +++ b/music_sampler/key.py @@ -13,7 +13,7 @@ from transitions.extensions import HierarchicalMachine as Machine # https://github.com/kivy/kivy/wiki/Working-with-Python-threads-inside-a-Kivy-application from kivy.clock import mainthread -class KeyMachine(Widget): +class KeyMachine(): STATES = [ 'initial', 'configuring', @@ -101,11 +101,15 @@ class KeyMachine(Widget): { 'trigger': 'repeat_protection_finished', 'source': 'loaded_protecting_repeat', - 'dest': 'loaded' + 'dest': 'loaded', + 'after': 'callback_action_state_changed' }, ] - state = StringProperty("") + def __setattr__(self, name, value): + if hasattr(self, 'initialized') and name == 'state': + self.key.update_state(value) + super().__setattr__(name, value) def __init__(self, key, **kwargs): self.key = key @@ -113,7 +117,8 @@ class KeyMachine(Widget): Machine(model=self, states=self.STATES, transitions=self.TRANSITIONS, initial='initial', ignore_invalid_triggers=True, queued=True) - super(KeyMachine, self).__init__(**kwargs) + + self.initialized = True # Machine states / events def is_loaded_or_failed(self): @@ -181,6 +186,17 @@ class KeyMachine(Widget): def key_loaded_callback(self): self.key.parent.key_loaded_callback() + def callback_action_state_changed(self): + if self.state not in ['failed', 'loading', 'loaded']: + return + + if any(action.is_failed() for action in self.key.actions): + self.to_failed() + elif any(action.is_loading() for action in self.key.actions): + self.to_loading() + else: + self.to_loaded() + self.key_loaded_callback() class Key(ButtonBehavior, Widget): @@ -244,14 +260,10 @@ class Key(ButtonBehavior, Widget): else: raise AttributeError - def machine_state_changed(self, instance, machine_state): - self.machine_state = self.machine.state - def __init__(self, **kwargs): self.actions = [] self.current_action = None self.machine = KeyMachine(self) - self.machine.bind(state=self.machine_state_changed) super(Key, self).__init__(**kwargs) @@ -272,13 +284,6 @@ class Key(ButtonBehavior, Widget): def interrupt(self): self.current_action.interrupt() - # Callbacks - def callback_action_ready(self, action, success): - if not success: - self.fail() - elif all(action.is_loaded_or_failed() for action in self.actions): - self.success() - # Setters def set_description(self, description): if description[0] is not None: