Commit b966468a3d3a7b3e9b686eee7c08e3b4eb61296c
1 parent
dd8b84f9
Exists in
master
MOD: Support 'remove when released' option in pedal callbacks
Also, send 'Pedal state changed' events regardless of if any callbacks have been registered or not.
Showing
1 changed file
with
21 additions
and
18 deletions
Show diff stats
invesalius/net/pedal_connection.py
... | ... | @@ -40,7 +40,7 @@ class PedalConnection(Thread, metaclass=Singleton): |
40 | 40 | |
41 | 41 | self._midi_in = None |
42 | 42 | self._active_inputs = None |
43 | - self._callbacks = {} | |
43 | + self._callback_infos = [] | |
44 | 44 | |
45 | 45 | def _midi_to_pedal(self, msg): |
46 | 46 | # TODO: At this stage, interpret all note_on messages as the pedal being pressed, |
... | ... | @@ -48,24 +48,24 @@ class PedalConnection(Thread, metaclass=Singleton): |
48 | 48 | # message types and be more stringent about the messages. |
49 | 49 | # |
50 | 50 | if msg.type == 'note_on': |
51 | - if not self._callbacks: | |
52 | - print("Pedal pressed, no callbacks registered") | |
53 | - else: | |
54 | - Publisher.sendMessage('Pedal state changed', state=True) | |
55 | - | |
56 | - for callback in self._callbacks.values(): | |
57 | - callback(True) | |
51 | + print("Pedal pressed") | |
52 | + state = True | |
58 | 53 | |
59 | 54 | elif msg.type == 'note_off': |
60 | - if not self._callbacks: | |
61 | - print("Pedal released, no callbacks registered") | |
62 | - else: | |
63 | - Publisher.sendMessage('Pedal state changed', state=False) | |
55 | + print("Pedal released") | |
56 | + state = False | |
64 | 57 | |
65 | - for callback in self._callbacks.values(): | |
66 | - callback(False) | |
67 | 58 | else: |
68 | 59 | print("Unknown message type received from MIDI device") |
60 | + return | |
61 | + | |
62 | + Publisher.sendMessage('Pedal state changed', state=state) | |
63 | + for callback_info in self._callback_infos: | |
64 | + callback = callback_info['callback'] | |
65 | + callback(state) | |
66 | + | |
67 | + if not state: | |
68 | + self._callback_infos = [callback_info for callback_info in self._callback_infos if not callback_info['remove_when_released']] | |
69 | 69 | |
70 | 70 | def _connect_if_disconnected(self): |
71 | 71 | if self._midi_in is None and len(self._midi_inputs) > 0: |
... | ... | @@ -93,12 +93,15 @@ class PedalConnection(Thread, metaclass=Singleton): |
93 | 93 | def is_connected(self): |
94 | 94 | return self._midi_in is not None |
95 | 95 | |
96 | - def add_callback(self, name, callback): | |
97 | - self._callbacks[name] = callback | |
96 | + def add_callback(self, name, callback, remove_when_released=False): | |
97 | + self._callback_infos.append({ | |
98 | + 'name': name, | |
99 | + 'callback': callback, | |
100 | + 'remove_when_released': remove_when_released, | |
101 | + }) | |
98 | 102 | |
99 | 103 | def remove_callback(self, name): |
100 | - if name in self._callbacks: | |
101 | - del self._callbacks[name] | |
104 | + self._callback_infos = [callback_info for callback_info in self._callback_infos if callback_info['name'] != name] | |
102 | 105 | |
103 | 106 | def run(self): |
104 | 107 | self.in_use = True | ... | ... |