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,7 +40,7 @@ class PedalConnection(Thread, metaclass=Singleton): | ||
40 | 40 | ||
41 | self._midi_in = None | 41 | self._midi_in = None |
42 | self._active_inputs = None | 42 | self._active_inputs = None |
43 | - self._callbacks = {} | 43 | + self._callback_infos = [] |
44 | 44 | ||
45 | def _midi_to_pedal(self, msg): | 45 | def _midi_to_pedal(self, msg): |
46 | # TODO: At this stage, interpret all note_on messages as the pedal being pressed, | 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,24 +48,24 @@ class PedalConnection(Thread, metaclass=Singleton): | ||
48 | # message types and be more stringent about the messages. | 48 | # message types and be more stringent about the messages. |
49 | # | 49 | # |
50 | if msg.type == 'note_on': | 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 | elif msg.type == 'note_off': | 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 | else: | 58 | else: |
68 | print("Unknown message type received from MIDI device") | 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 | def _connect_if_disconnected(self): | 70 | def _connect_if_disconnected(self): |
71 | if self._midi_in is None and len(self._midi_inputs) > 0: | 71 | if self._midi_in is None and len(self._midi_inputs) > 0: |
@@ -93,12 +93,15 @@ class PedalConnection(Thread, metaclass=Singleton): | @@ -93,12 +93,15 @@ class PedalConnection(Thread, metaclass=Singleton): | ||
93 | def is_connected(self): | 93 | def is_connected(self): |
94 | return self._midi_in is not None | 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 | def remove_callback(self, name): | 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 | def run(self): | 106 | def run(self): |
104 | self.in_use = True | 107 | self.in_use = True |