]> git.immae.eu Git - perso/Immae/Projets/Python/MusicSampler.git/blobdiff - music_sampler/key.py
Cleanup key and action workflows
[perso/Immae/Projets/Python/MusicSampler.git] / music_sampler / key.py
index e524c350d86c3cf7cb0ceb6a378ee9edd25724b5..e05bb169354a7e6afc395cdb655a27a306f0ac4b 100644 (file)
@@ -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: