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,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