]> git.immae.eu Git - perso/Immae/Projets/Python/MusicSampler.git/blobdiff - music_sampler/mapping.py
Fix common key properties not applying when property is absent
[perso/Immae/Projets/Python/MusicSampler.git] / music_sampler / mapping.py
index e589ac0a93edfdb234587e25ab6cb1d15a4d7d1b..99c99773b7751c213eb2546871fd3d2dfbb9d229 100644 (file)
@@ -6,6 +6,7 @@ from kivy.clock import Clock
 import threading
 import yaml
 import sys
+import copy
 from collections import defaultdict
 
 from transitions.extensions import HierarchicalMachine as Machine
@@ -197,17 +198,30 @@ class Mapping(RelativeLayout):
             music.set_gain_with_effect(db_gain, fade=fade)
 
     # Wait handler methods
-    def add_wait_id(self, wait_id, action_or_wait):
-        self.wait_ids[wait_id] = action_or_wait
-
-    def interrupt_wait(self, wait_id):
-        if wait_id in self.wait_ids:
-            action_or_wait = self.wait_ids[wait_id]
-            del(self.wait_ids[wait_id])
-            if isinstance(action_or_wait, Action):
-                action_or_wait.interrupt()
-            else:
-                action_or_wait.set()
+    def add_wait(self, action_or_wait, wait_id=None):
+        if wait_id is not None:
+            self.wait_ids[wait_id] = [action_or_wait]
+        else:
+            if None not in self.wait_ids:
+                self.wait_ids[None] = []
+            self.wait_ids[None].append(action_or_wait)
+
+    def interrupt_wait(self, wait_id=None):
+        if wait_id is None:
+            ids_to_interrupt = list(self.wait_ids.keys())
+        elif wait_id in self.wait_ids:
+            ids_to_interrupt = [wait_id]
+        else:
+            ids_to_interrupt = []
+
+        for _wait_id in ids_to_interrupt:
+            action_or_waits = self.wait_ids[_wait_id]
+            del(self.wait_ids[_wait_id])
+            for action_or_wait in action_or_waits:
+                if isinstance(action_or_wait, Action):
+                    action_or_wait.interrupt()
+                else:
+                    action_or_wait.set()
 
     # Methods to control running keys
     def start_running(self, key, start_time):
@@ -224,7 +238,8 @@ class Mapping(RelativeLayout):
     def parse_config(self):
         def update_alias(prop_hash, aliases, key):
             if isinstance(aliases[key], dict):
-                prop_hash.update(aliases[key], **prop_hash)
+                for alias in aliases[key]:
+                    prop_hash.setdefault(alias, aliases[key][alias])
             else:
                 warn_print("Alias {} is not a hash, ignored".format(key))
 
@@ -336,13 +351,25 @@ class Mapping(RelativeLayout):
 
         seen_files = {}
 
+        common_key_properties = {}
+        if 'common' in config['key_properties'] and\
+                isinstance(config['key_properties'], dict):
+            common_key_properties = config['key_properties']['common']
+            include_aliases(common_key_properties, aliases)
+            check_key_property(common_key_properties, 'common')
+        elif 'common' in config['key_properties']:
+            warn_print("'common' key in key_properties is not a hash, ignored")
+
         key_properties = defaultdict(lambda: {
                 "actions":    [],
-                "properties": {},
+                "properties": copy.deepcopy(common_key_properties),
                 "files":      []
             })
 
         for key in check_key_properties(config):
+            if key == 'common':
+                continue
+
             key_prop = config['key_properties'][key]
 
             if not isinstance(key_prop, dict):
@@ -353,7 +380,7 @@ class Mapping(RelativeLayout):
             include_aliases(key_prop, aliases)
             check_key_property(key_prop, key)
 
-            key_properties[key]["properties"] = key_prop
+            key_properties[key]["properties"].update(key_prop)
 
         for mapped_key in check_mapped_keys(config):
             for index, action in enumerate(check_mapped_key(