Commit b966468a3d3a7b3e9b686eee7c08e3b4eb61296c

Authored by Olli-Pekka Kahilakoski
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
... ...