Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 770b5cb

Browse files
committedNov 9, 2021
Add disconnect-all-of-group menu item to patchbay
If one group has multiple connections to another group an extra menu item is added to its disconnect context menu, which allows the user to disconnect it all at once. The entry is added at the bottom of the disconnect menu in the form of "Groupname (all x ports)". This comes in very handy when the user wants to disconnect a soundcard from their current application. PortContextMenuDisconnect() now also accepts a list via setData()/data(), so we can disconnect multiple ports at once.
1 parent 1edb1bb commit 770b5cb

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed
 

‎source/frontend/patchcanvas/canvasbox.py

+21
Original file line numberDiff line numberDiff line change
@@ -502,10 +502,31 @@ def contextMenuEvent(self, event):
502502
conn_list_ids.append(tmp_conn_id)
503503

504504
if len(conn_list) > 0:
505+
groups = {}
505506
for conn_id, group_id, port_id in conn_list:
507+
groups.setdefault(group_id, []).append(conn_id)
506508
act_x_disc = discMenu.addAction(CanvasGetFullPortName(group_id, port_id))
507509
act_x_disc.setData(conn_id)
508510
act_x_disc.triggered.connect(canvas.qobject.PortContextMenuDisconnect)
511+
512+
# menu entries for disconnecting multiple connections to the same group
513+
separator_added = False
514+
for group_id, conn_ids in groups.items():
515+
if len(conn_ids) < 2:
516+
continue
517+
for group in canvas.group_list:
518+
if group.group_id == group_id:
519+
group_name = group.group_name
520+
break
521+
else:
522+
qCritical("Couldn't find group for group id {}".format(group_id))
523+
continue
524+
if not separator_added:
525+
discMenu.addSeparator()
526+
separator_added = True
527+
act_x_disc_multi = discMenu.addAction("{} (all {} ports)".format(group_name, len(conn_ids)))
528+
act_x_disc_multi.setData(conn_ids)
529+
act_x_disc_multi.triggered.connect(canvas.qobject.PortContextMenuDisconnect)
509530
else:
510531
act_x_disc = discMenu.addAction("No connections")
511532
act_x_disc.setEnabled(False)

‎source/frontend/patchcanvas/patchcanvas.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,16 @@ def PortContextMenuConnect(self):
138138
@pyqtSlot()
139139
def PortContextMenuDisconnect(self):
140140
try:
141-
connectionId = int(self.sender().data())
141+
connection_ids = self.sender().data()
142+
if isinstance(connection_ids, (list, tuple)):
143+
connection_ids = [int(conn_id) for conn_id in connection_ids]
144+
else:
145+
connection_ids = [int(connection_ids)]
142146
except:
143147
return
144148

145-
CanvasCallback(ACTION_PORTS_DISCONNECT, connectionId, 0, "")
149+
for connection_id in connection_ids:
150+
CanvasCallback(ACTION_PORTS_DISCONNECT, connection_id, 0, "")
146151

147152
@pyqtSlot(int, bool, int, int)
148153
def boxPositionChanged(self, groupId, split, x, y):

0 commit comments

Comments
 (0)
Please sign in to comment.