From 045a1b6343dc1a1ec4b27f5ae11856b8a422c9db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= Date: Sat, 13 Aug 2016 23:09:12 +0200 Subject: Fix configuring not resetting the key --- music_sampler/key.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'music_sampler/key.py') diff --git a/music_sampler/key.py b/music_sampler/key.py index ce2f45b..68e6f04 100644 --- a/music_sampler/key.py +++ b/music_sampler/key.py @@ -119,21 +119,20 @@ class KeyMachine(Widget): return self.is_loaded_no_config() or self.is_loaded_no_actions() def on_enter_configuring(self): + self.destroy_actions() + self.key.unset_description() + self.key.unset_color() + if self.key.key_sym in self.key.parent.key_config: self.key.config = self.key.parent.key_config[self.key.key_sym] - self.key.actions = [] for key_action in self.key.config['actions']: self.key.add_action(key_action[0], **key_action[1]) if 'description' in self.key.config['properties']: self.key.set_description(self.key.config['properties']['description']) - else: - self.key.unset_description() if 'color' in self.key.config['properties']: self.key.set_color(self.key.config['properties']['color']) - else: - self.key.unset_color() self.success() else: self.no_config() @@ -145,6 +144,11 @@ class KeyMachine(Widget): else: self.no_actions() + def destroy_actions(self): + for action in self.key.actions: + action.destroy() + self.key.actions = [] + def run_actions(self, modifiers): self.key.parent.parent.ids['KeyList'].append(self.key.key_sym) debug_print("running actions for {}".format(self.key.key_sym)) -- cgit v1.2.3 From a9324e30da6292f53f008f1b827779c7f8e2fcdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= Date: Mon, 19 Sep 2016 14:02:12 +0200 Subject: Use @mainthread decorator where necessary --- music_sampler/key.py | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'music_sampler/key.py') diff --git a/music_sampler/key.py b/music_sampler/key.py index 68e6f04..e524c35 100644 --- a/music_sampler/key.py +++ b/music_sampler/key.py @@ -9,6 +9,10 @@ import time import threading from transitions.extensions import HierarchicalMachine as Machine +# All drawing operations should happen in the main thread +# https://github.com/kivy/kivy/wiki/Working-with-Python-threads-inside-a-Kivy-application +from kivy.clock import mainthread + class KeyMachine(Widget): STATES = [ 'initial', @@ -118,6 +122,7 @@ class KeyMachine(Widget): def is_loaded_inactive(self): return self.is_loaded_no_config() or self.is_loaded_no_actions() + @mainthread def on_enter_configuring(self): self.destroy_actions() self.key.unset_description() @@ -172,6 +177,7 @@ class KeyMachine(Widget): self.key.repeat_protection_finished() # Callbacks + @mainthread def key_loaded_callback(self): self.key.parent.key_loaded_callback() @@ -250,6 +256,10 @@ class Key(ButtonBehavior, Widget): super(Key, self).__init__(**kwargs) # Kivy events + @mainthread + def update_state(self, value): + self.machine_state = value + def on_key_sym(self, key, key_sym): if key_sym != "": self.configure() -- cgit v1.2.3 From 93a3e51e749afc0c3ba8488b900124fda6bb8774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isma=C3=ABl=20Bouya?= Date: Mon, 19 Sep 2016 15:57:42 +0200 Subject: Cleanup key and action workflows --- music_sampler/key.py | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) (limited to 'music_sampler/key.py') 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: -- cgit v1.2.3