X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=music_sampler%2Fmapping.py;h=5c61f8a5be6eb318949400bfb80398e3cd03472a;hb=93a3e51e749afc0c3ba8488b900124fda6bb8774;hp=99c99773b7751c213eb2546871fd3d2dfbb9d229;hpb=51f6ce0fdb32061b681d63e8de4d96eb8b59e1e9;p=perso%2FImmae%2FProjets%2FPython%2FMusicSampler.git diff --git a/music_sampler/mapping.py b/music_sampler/mapping.py index 99c9977..5c61f8a 100644 --- a/music_sampler/mapping.py +++ b/music_sampler/mapping.py @@ -22,8 +22,7 @@ class Mapping(RelativeLayout): 'configuring', 'configured', 'loading', - 'loaded', - 'failed' + 'loaded' ] TRANSITIONS = [ @@ -32,11 +31,6 @@ class Mapping(RelativeLayout): 'source': 'initial', 'dest': 'configuring' }, - { - 'trigger': 'fail', - 'source': 'configuring', - 'dest': 'failed' - }, { 'trigger': 'success', 'source': 'configuring', @@ -48,11 +42,6 @@ class Mapping(RelativeLayout): 'source': 'configured', 'dest': 'loading' }, - { - 'trigger': 'fail', - 'source': 'loading', - 'dest': 'failed' - }, { 'trigger': 'success', 'source': 'loading', @@ -74,10 +63,11 @@ class Mapping(RelativeLayout): self.running = [] self.wait_ids = {} self.open_files = {} + self.is_leaving_application = False Machine(model=self, states=self.STATES, transitions=self.TRANSITIONS, initial='initial', - ignore_invalid_triggers=True, queued=True) + auto_transitions=False, queued=True) super(Mapping, self).__init__(**kwargs) self.keyboard = Window.request_keyboard(self.on_keyboard_closed, self) self.keyboard.bind(on_key_down=self.on_keyboard_down) @@ -127,13 +117,14 @@ class Mapping(RelativeLayout): elif 'ctrl' in modifiers and (keycode[0] == 113 or keycode[0] == '99'): self.leave_application() sys.exit() - elif 'ctrl' in modifiers and keycode[0] == 114: - threading.Thread(name="MSReload", target=self.reload).start() + elif 'ctrl' in modifiers and keycode[0] == 114 and self.is_loaded(): + self.reload() return True def leave_application(self): self.keyboard.unbind(on_key_down=self.on_keyboard_down) self.stop_all_running() + self.is_leaving_application = True for music in self.open_files.values(): music.stop() for thread in threading.enumerate(): @@ -167,13 +158,20 @@ class Mapping(RelativeLayout): # Callbacks def key_loaded_callback(self): + if hasattr(self, 'finished_loading'): + return + + opacity = int(Config.load_all_musics) + result = self.all_keys_ready() if result == "success": - self.ready_color = [0, 1, 0, 1] + self.ready_color = [0, 1, 0, opacity] + self.finished_loading = True elif result == "partial": - self.ready_color = [1, 0, 0, 1] + self.ready_color = [1, 0, 0, opacity] + self.finished_loading = True else: - self.ready_color = [1, 165/255, 0, 1] + self.ready_color = [1, 165/255, 0, opacity] ## Some global actions def stop_all_running(self, except_key=None, key_start_time=0): @@ -206,15 +204,17 @@ class Mapping(RelativeLayout): self.wait_ids[None] = [] self.wait_ids[None].append(action_or_wait) - def interrupt_wait(self, wait_id=None): + def matching_wait_ids(self, wait_id=None): if wait_id is None: - ids_to_interrupt = list(self.wait_ids.keys()) + matching_ids = list(self.wait_ids.keys()) elif wait_id in self.wait_ids: - ids_to_interrupt = [wait_id] + matching_ids = [wait_id] else: - ids_to_interrupt = [] + matching_ids = [] + return matching_ids - for _wait_id in ids_to_interrupt: + def interrupt_wait(self, wait_id=None): + for _wait_id in self.matching_wait_ids(wait_id=wait_id): action_or_waits = self.wait_ids[_wait_id] del(self.wait_ids[_wait_id]) for action_or_wait in action_or_waits: @@ -223,6 +223,27 @@ class Mapping(RelativeLayout): else: action_or_wait.set() + def pause_wait(self, wait_id=None): + for _wait_id in self.matching_wait_ids(wait_id=wait_id): + action_or_waits = self.wait_ids[_wait_id] + for action_or_wait in action_or_waits: + if isinstance(action_or_wait, Action): + action_or_wait.pause() + + def unpause_wait(self, wait_id=None): + for _wait_id in self.matching_wait_ids(wait_id=wait_id): + action_or_waits = self.wait_ids[_wait_id] + for action_or_wait in action_or_waits: + if isinstance(action_or_wait, Action): + action_or_wait.unpause() + + def reset_wait(self, wait_id=None): + for _wait_id in self.matching_wait_ids(wait_id=wait_id): + action_or_waits = self.wait_ids[_wait_id] + for action_or_wait in action_or_waits: + if isinstance(action_or_wait, Action): + action_or_wait.reset() + # Methods to control running keys def start_running(self, key, start_time): self.running.append((key, start_time))