|
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093 |
- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
-
- # PatchBay Canvas engine using QGraphicsView/Scene
- # Copyright (C) 2010-2019 Filipe Coelho <falktx@falktx.com>
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License as
- # published by the Free Software Foundation; either version 2 of
- # the License, or any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # For a full copy of the GNU General Public License see the doc/GPL.txt file.
-
- # ------------------------------------------------------------------------------------------------------------
- # Imports (Global)
-
- from PyQt5.QtCore import pyqtSlot, qCritical, qFatal, qWarning, QObject
- from PyQt5.QtCore import QPointF, QRectF, QTimer
- from PyQt5.QtWidgets import QGraphicsObject
-
- # ------------------------------------------------------------------------------------------------------------
- # Imports (Custom)
-
- from . import (
- canvas,
- features,
- options,
- group_dict_t,
- port_dict_t,
- connection_dict_t,
- bool2str,
- icon2str,
- split2str,
- port_mode2str,
- port_type2str,
- CanvasIconType,
- CanvasRubberbandType,
- ACTION_PORTS_DISCONNECT,
- EYECANDY_FULL,
- ICON_APPLICATION,
- ICON_HARDWARE,
- ICON_LADISH_ROOM,
- PORT_MODE_INPUT,
- PORT_MODE_OUTPUT,
- SPLIT_YES,
- SPLIT_NO,
- SPLIT_UNDEF,
- MAX_PLUGIN_ID_ALLOWED,
- )
-
- from .canvasbox import CanvasBox
- from .canvasbezierline import CanvasBezierLine
- from .canvasline import CanvasLine
- from .theme import Theme, getDefaultTheme, getThemeName
- from .utils import CanvasCallback, CanvasGetNewGroupPos, CanvasItemFX, CanvasRemoveItemFX
-
- # FIXME
- from . import *
- from .scene import PatchScene
-
- from carla_shared import QSafeSettings
-
- # ------------------------------------------------------------------------------------------------------------
-
- class CanvasObject(QObject):
- def __init__(self, parent=None):
- QObject.__init__(self, parent)
-
- @pyqtSlot()
- def AnimationFinishedShow(self):
- animation = self.sender()
- if animation:
- animation.forceStop()
- canvas.animation_list.remove(animation)
-
- @pyqtSlot()
- def AnimationFinishedHide(self):
- animation = self.sender()
- if animation:
- animation.forceStop()
- canvas.animation_list.remove(animation)
- item = animation.item()
- if item:
- if isinstance(item, QGraphicsObject):
- item.blockSignals(True)
- item.hide()
- item.blockSignals(False)
- else:
- item.hide()
-
- @pyqtSlot()
- def AnimationFinishedDestroy(self):
- animation = self.sender()
- if animation:
- animation.forceStop()
- canvas.animation_list.remove(animation)
- item = animation.item()
- if item:
- CanvasRemoveItemFX(item)
-
- @pyqtSlot()
- def PortContextMenuConnect(self):
- try:
- sources, targets = self.sender().data()
- except:
- return
-
- for port_type in (PORT_TYPE_AUDIO_JACK, PORT_TYPE_MIDI_JACK, PORT_TYPE_MIDI_ALSA, PORT_TYPE_PARAMETER):
- source_ports = sources[port_type]
- target_ports = targets[port_type]
-
- source_ports_len = len(source_ports)
- target_ports_len = len(target_ports)
-
- if source_ports_len == 0 or target_ports_len == 0:
- continue
-
- for i in range(min(source_ports_len, target_ports_len)):
- data = "%i:%i:%i:%i" % (source_ports[i][0],
- source_ports[i][1],
- target_ports[i][0],
- target_ports[i][1])
- CanvasCallback(ACTION_PORTS_CONNECT, 0, 0, data)
-
- if source_ports_len == 1 and target_ports_len > 1:
- for i in range(1, target_ports_len):
- data = "%i:%i:%i:%i" % (source_ports[0][0],
- source_ports[0][1],
- target_ports[i][0],
- target_ports[i][1])
- CanvasCallback(ACTION_PORTS_CONNECT, 0, 0, data)
-
- @pyqtSlot()
- def PortContextMenuDisconnect(self):
- try:
- connectionId = int(self.sender().data())
- except:
- return
-
- CanvasCallback(ACTION_PORTS_DISCONNECT, connectionId, 0, "")
-
- @pyqtSlot(int, bool, int, int)
- def boxPositionChanged(self, groupId, split, x, y):
- x2 = y2 = 0
-
- if split:
- for group in canvas.group_list:
- if group.group_id == groupId:
- if group.split:
- pos = group.widgets[1].pos()
- x2 = pos.x()
- y2 = pos.y()
- break
-
- valueStr = "%i:%i:%i:%i" % (x, y, x2, y2)
- CanvasCallback(ACTION_GROUP_POSITION, groupId, 0, valueStr)
-
- @pyqtSlot(int, bool, int, int)
- def sboxPositionChanged(self, groupId, split, x2, y2):
- x = y = 0
-
- for group in canvas.group_list:
- if group.group_id == groupId:
- pos = group.widgets[0].pos()
- x = pos.x()
- y = pos.y()
- break
-
- valueStr = "%i:%i:%i:%i" % (x, y, x2, y2)
- CanvasCallback(ACTION_GROUP_POSITION, groupId, 0, valueStr)
-
- # ------------------------------------------------------------------------------------------------------------
-
- def getStoredCanvasPosition(key, fallback_pos):
- try:
- return canvas.settings.value("CanvasPositions/" + key, fallback_pos, type=QPointF)
- except:
- return fallback_pos
-
- def getStoredCanvasSplit(group_name, fallback_split_mode):
- try:
- return canvas.settings.value("CanvasPositions/%s_SPLIT" % group_name, fallback_split_mode, type=int)
- except:
- return fallback_split_mode
-
- # ------------------------------------------------------------------------------------------------------------
-
- def init(appName, scene, callback, debug=False):
- if debug:
- print("PatchCanvas::init(\"%s\", %s, %s, %s)" % (appName, scene, callback, bool2str(debug)))
-
- if canvas.initiated:
- qCritical("PatchCanvas::init() - already initiated")
- return
-
- if not callback:
- qFatal("PatchCanvas::init() - fatal error: callback not set")
- return
-
- canvas.callback = callback
- canvas.debug = debug
- canvas.scene = scene
-
- canvas.last_z_value = 0
- canvas.last_connection_id = 0
- canvas.initial_pos = QPointF(0, 0)
- canvas.size_rect = QRectF()
-
- if not canvas.qobject:
- canvas.qobject = CanvasObject()
- if not canvas.settings:
- canvas.settings = QSafeSettings("falkTX", appName)
-
- if canvas.theme:
- del canvas.theme
- canvas.theme = None
-
- for i in range(Theme.THEME_MAX):
- this_theme_name = getThemeName(i)
- if this_theme_name == options.theme_name:
- canvas.theme = Theme(i)
- break
-
- if not canvas.theme:
- canvas.theme = Theme(getDefaultTheme())
-
- canvas.scene.updateTheme()
-
- canvas.initiated = True
-
- def clear():
- if canvas.debug:
- print("PatchCanvas::clear()")
-
- group_pos = {}
- group_list_ids = []
- port_list_ids = []
- connection_list_ids = []
-
- for group in canvas.group_list:
- group_pos[group.group_name] = (
- group.split,
- group.widgets[0].pos(),
- group.widgets[1].pos() if group.split else None,
- )
- group_list_ids.append(group.group_id)
-
- for port in canvas.port_list:
- port_list_ids.append((port.group_id, port.port_id))
-
- for connection in canvas.connection_list:
- connection_list_ids.append(connection.connection_id)
-
- for idx in connection_list_ids:
- disconnectPorts(idx)
-
- for group_id, port_id in port_list_ids:
- removePort(group_id, port_id)
-
- for idx in group_list_ids:
- removeGroup(idx)
-
- canvas.last_z_value = 0
- canvas.last_connection_id = 0
-
- canvas.group_list = []
- canvas.port_list = []
- canvas.connection_list = []
- canvas.group_plugin_map = {}
- canvas.old_group_pos = group_pos
-
- canvas.scene.clearSelection()
-
- animatedItems = []
- for animation in canvas.animation_list:
- animatedItems.append(animation.item())
-
- for item in canvas.scene.items():
- if item.type() in (CanvasIconType, CanvasRubberbandType) or item in animatedItems:
- continue
- canvas.scene.removeItem(item)
- del item
-
- canvas.initiated = False
-
- QTimer.singleShot(0, canvas.scene.update)
-
- # ------------------------------------------------------------------------------------------------------------
-
- def setInitialPos(x, y):
- if canvas.debug:
- print("PatchCanvas::setInitialPos(%i, %i)" % (x, y))
-
- canvas.initial_pos.setX(x)
- canvas.initial_pos.setY(y)
-
- def setCanvasSize(x, y, width, height):
- if canvas.debug:
- print("PatchCanvas::setCanvasSize(%i, %i, %i, %i)" % (x, y, width, height))
-
- canvas.size_rect.setX(x)
- canvas.size_rect.setY(y)
- canvas.size_rect.setWidth(width)
- canvas.size_rect.setHeight(height)
- canvas.scene.updateLimits()
- canvas.scene.fixScaleFactor()
-
- def addGroup(group_id, group_name, split=SPLIT_UNDEF, icon=ICON_APPLICATION):
- if canvas.debug:
- print("PatchCanvas::addGroup(%i, %s, %s, %s)" % (
- group_id, group_name.encode(), split2str(split), icon2str(icon)))
-
- for group in canvas.group_list:
- if group.group_id == group_id:
- qWarning("PatchCanvas::addGroup(%i, %s, %s, %s) - group already exists" % (
- group_id, group_name.encode(), split2str(split), icon2str(icon)))
- return None
-
- old_matching_group = canvas.old_group_pos.pop(group_name, None)
-
- if split == SPLIT_UNDEF:
- isHardware = bool(icon == ICON_HARDWARE)
-
- if features.handle_group_pos:
- split = getStoredCanvasSplit(group_name, SPLIT_YES if isHardware else split)
- elif isHardware:
- split = SPLIT_YES
- elif old_matching_group is not None and old_matching_group[0]:
- split = SPLIT_YES
-
- group_box = CanvasBox(group_id, group_name, icon)
- group_box.positionChanged.connect(canvas.qobject.boxPositionChanged)
- group_box.blockSignals(True)
-
- group_dict = group_dict_t()
- group_dict.group_id = group_id
- group_dict.group_name = group_name
- group_dict.split = bool(split == SPLIT_YES)
- group_dict.icon = icon
- group_dict.plugin_id = -1
- group_dict.plugin_ui = False
- group_dict.plugin_inline = False
- group_dict.widgets = [group_box, None]
-
- if split == SPLIT_YES:
- group_box.setSplit(True, PORT_MODE_OUTPUT)
-
- if features.handle_group_pos:
- group_box.setPos(getStoredCanvasPosition(group_name + "_OUTPUT", CanvasGetNewGroupPos(False)))
- elif old_matching_group is not None:
- group_box.setPos(old_matching_group[1])
- else:
- group_box.setPos(CanvasGetNewGroupPos(False))
-
- group_sbox = CanvasBox(group_id, group_name, icon)
- group_sbox.positionChanged.connect(canvas.qobject.sboxPositionChanged)
- group_sbox.blockSignals(True)
- group_sbox.setSplit(True, PORT_MODE_INPUT)
-
- group_dict.widgets[1] = group_sbox
-
- if features.handle_group_pos:
- group_sbox.setPos(getStoredCanvasPosition(group_name + "_INPUT", CanvasGetNewGroupPos(True)))
- elif old_matching_group is not None and old_matching_group[0]:
- group_sbox.setPos(old_matching_group[2])
- else:
- group_sbox.setPos(group_box.x() + group_box.boundingRect().width() + 300, group_box.y())
-
- canvas.last_z_value += 1
- group_sbox.setZValue(canvas.last_z_value)
-
- if options.eyecandy == EYECANDY_FULL and not options.auto_hide_groups:
- CanvasItemFX(group_sbox, True, False)
-
- group_sbox.checkItemPos()
- group_sbox.blockSignals(False)
-
- else:
- group_box.setSplit(False)
-
- if features.handle_group_pos:
- group_box.setPos(getStoredCanvasPosition(group_name, CanvasGetNewGroupPos(False)))
- elif old_matching_group is not None:
- group_box.setPos(old_matching_group[1])
- else:
- # Special ladish fake-split groups
- horizontal = bool(icon == ICON_HARDWARE or icon == ICON_LADISH_ROOM)
- group_box.setPos(CanvasGetNewGroupPos(horizontal))
-
- canvas.last_z_value += 1
- group_box.setZValue(canvas.last_z_value)
-
- group_box.checkItemPos()
- group_box.blockSignals(False)
-
- canvas.group_list.append(group_dict)
-
- if options.eyecandy == EYECANDY_FULL and not options.auto_hide_groups:
- CanvasItemFX(group_box, True, False)
- else:
- QTimer.singleShot(0, canvas.scene.update)
-
- return group_dict
-
- def removeGroup(group_id):
- if canvas.debug:
- print("PatchCanvas::removeGroup(%i)" % group_id)
-
- for group in canvas.group_list:
- if group.group_id == group_id:
- item = group.widgets[0]
- group_name = group.group_name
-
- if group.split:
- s_item = group.widgets[1]
-
- if features.handle_group_pos:
- canvas.settings.setValue("CanvasPositions/%s_OUTPUT" % group_name, item.pos())
- canvas.settings.setValue("CanvasPositions/%s_INPUT" % group_name, s_item.pos())
- canvas.settings.setValue("CanvasPositions/%s_SPLIT" % group_name, SPLIT_YES)
-
- if options.eyecandy == EYECANDY_FULL:
- CanvasItemFX(s_item, False, True)
- else:
- s_item.removeIconFromScene()
- canvas.scene.removeItem(s_item)
- del s_item
-
- else:
- if features.handle_group_pos:
- canvas.settings.setValue("CanvasPositions/%s" % group_name, item.pos())
- canvas.settings.setValue("CanvasPositions/%s_SPLIT" % group_name, SPLIT_NO)
-
- if options.eyecandy == EYECANDY_FULL:
- CanvasItemFX(item, False, True)
- else:
- item.removeIconFromScene()
- canvas.scene.removeItem(item)
- del item
-
- canvas.group_list.remove(group)
- canvas.group_plugin_map.pop(group.plugin_id, None)
-
- QTimer.singleShot(0, canvas.scene.update)
- return
-
- qCritical("PatchCanvas::removeGroup(%i) - unable to find group to remove" % group_id)
-
- def renameGroup(group_id, new_group_name):
- if canvas.debug:
- print("PatchCanvas::renameGroup(%i, %s)" % (group_id, new_group_name.encode()))
-
- for group in canvas.group_list:
- if group.group_id == group_id:
- group.group_name = new_group_name
- group.widgets[0].setGroupName(new_group_name)
-
- if group.split and group.widgets[1]:
- group.widgets[1].setGroupName(new_group_name)
-
- QTimer.singleShot(0, canvas.scene.update)
- return
-
- qCritical("PatchCanvas::renameGroup(%i, %s) - unable to find group to rename" % (group_id, new_group_name.encode()))
-
- def splitGroup(group_id):
- if canvas.debug:
- print("PatchCanvas::splitGroup(%i)" % group_id)
-
- item = None
- group_name = ""
- group_icon = ICON_APPLICATION
- plugin_id = -1
- plugin_ui = False
- plugin_inline = False
- ports_data = []
- conns_data = []
-
- # Step 1 - Store all Item data
- for group in canvas.group_list:
- if group.group_id == group_id:
- if group.split:
- if canvas.debug:
- print("PatchCanvas::splitGroup(%i) - group is already split" % group_id)
- return
-
- item = group.widgets[0]
- group_name = group.group_name
- group_icon = group.icon
- plugin_id = group.plugin_id
- plugin_ui = group.plugin_ui
- plugin_inline = group.plugin_inline
- break
-
- if not item:
- qCritical("PatchCanvas::splitGroup(%i) - unable to find group to split" % group_id)
- return
-
- port_list_ids = list(item.getPortList())
-
- for port in canvas.port_list:
- if port.port_id in port_list_ids:
- port_dict = port_dict_t()
- port_dict.group_id = port.group_id
- port_dict.port_id = port.port_id
- port_dict.port_name = port.port_name
- port_dict.port_mode = port.port_mode
- port_dict.port_type = port.port_type
- port_dict.is_alternate = port.is_alternate
- port_dict.widget = None
- ports_data.append(port_dict)
-
- for connection in canvas.connection_list:
- if connection.port_out_id in port_list_ids or connection.port_in_id in port_list_ids:
- connection_dict = connection_dict_t()
- connection_dict.connection_id = connection.connection_id
- connection_dict.group_in_id = connection.group_in_id
- connection_dict.port_in_id = connection.port_in_id
- connection_dict.group_out_id = connection.group_out_id
- connection_dict.port_out_id = connection.port_out_id
- connection_dict.widget = None
- conns_data.append(connection_dict)
-
- # Step 2 - Remove Item and Children
- for conn in conns_data:
- disconnectPorts(conn.connection_id)
-
- for port_id in port_list_ids:
- removePort(group_id, port_id)
-
- removeGroup(group_id)
-
- # Step 3 - Re-create Item, now split
- group = addGroup(group_id, group_name, SPLIT_YES, group_icon)
-
- if plugin_id >= 0:
- setGroupAsPlugin(group_id, plugin_id, plugin_ui, plugin_inline)
-
- for port in ports_data:
- addPort(group_id, port.port_id, port.port_name, port.port_mode, port.port_type, port.is_alternate)
-
- for conn in conns_data:
- connectPorts(conn.connection_id, conn.group_out_id, conn.port_out_id, conn.group_in_id, conn.port_in_id)
-
- if group is not None:
- pos1 = group.widgets[0].pos()
- pos2 = group.widgets[1].pos()
- valueStr = "%i:%i:%i:%i" % (pos1.x(), pos1.y(), pos2.x(), pos2.y())
- CanvasCallback(ACTION_GROUP_POSITION, group_id, 0, valueStr)
-
- QTimer.singleShot(0, canvas.scene.update)
-
- def joinGroup(group_id):
- if canvas.debug:
- print("PatchCanvas::joinGroup(%i)" % group_id)
-
- item = None
- s_item = None
- group_name = ""
- group_icon = ICON_APPLICATION
- plugin_id = -1
- plugin_ui = False
- plugin_inline = False
- ports_data = []
- conns_data = []
-
- # Step 1 - Store all Item data
- for group in canvas.group_list:
- if group.group_id == group_id:
- if not group.split:
- if canvas.debug:
- print("PatchCanvas::joinGroup(%i) - group is not split" % group_id)
- return
-
- item = group.widgets[0]
- s_item = group.widgets[1]
- group_name = group.group_name
- group_icon = group.icon
- plugin_id = group.plugin_id
- plugin_ui = group.plugin_ui
- plugin_inline = group.plugin_inline
- break
-
- # FIXME
- if not (item and s_item):
- qCritical("PatchCanvas::joinGroup(%i) - unable to find groups to join" % group_id)
- return
-
- port_list_ids = list(item.getPortList())
- port_list_idss = s_item.getPortList()
-
- for port_id in port_list_idss:
- if port_id not in port_list_ids:
- port_list_ids.append(port_id)
-
- for port in canvas.port_list:
- if port.port_id in port_list_ids:
- port_dict = port_dict_t()
- port_dict.group_id = port.group_id
- port_dict.port_id = port.port_id
- port_dict.port_name = port.port_name
- port_dict.port_mode = port.port_mode
- port_dict.port_type = port.port_type
- port_dict.is_alternate = port.is_alternate
- port_dict.widget = None
- ports_data.append(port_dict)
-
- for connection in canvas.connection_list:
- if connection.port_out_id in port_list_ids or connection.port_in_id in port_list_ids:
- connection_dict = connection_dict_t()
- connection_dict.connection_id = connection.connection_id
- connection_dict.group_in_id = connection.group_in_id
- connection_dict.port_in_id = connection.port_in_id
- connection_dict.group_out_id = connection.group_out_id
- connection_dict.port_out_id = connection.port_out_id
- connection_dict.widget = None
- conns_data.append(connection_dict)
-
- # Step 2 - Remove Item and Children
- for conn in conns_data:
- disconnectPorts(conn.connection_id)
-
- for port_id in port_list_ids:
- removePort(group_id, port_id)
-
- removeGroup(group_id)
-
- # Step 3 - Re-create Item, now together
- group = addGroup(group_id, group_name, SPLIT_NO, group_icon)
-
- if plugin_id >= 0:
- setGroupAsPlugin(group_id, plugin_id, plugin_ui, plugin_inline)
-
- for port in ports_data:
- addPort(group_id, port.port_id, port.port_name, port.port_mode, port.port_type, port.is_alternate)
-
- for conn in conns_data:
- connectPorts(conn.connection_id, conn.group_out_id, conn.port_out_id, conn.group_in_id, conn.port_in_id)
-
- if group is not None:
- pos = group.widgets[0].pos()
- valueStr = "%i:%i:%i:%i" % (pos.x(), pos.y(), 0, 0)
- CanvasCallback(ACTION_GROUP_POSITION, group_id, 0, valueStr)
-
- QTimer.singleShot(0, canvas.scene.update)
-
- # ------------------------------------------------------------------------------------------------------------
-
- def getGroupPos(group_id, port_mode=PORT_MODE_OUTPUT):
- if canvas.debug:
- print("PatchCanvas::getGroupPos(%i, %s)" % (group_id, port_mode2str(port_mode)))
-
- for group in canvas.group_list:
- if group.group_id == group_id:
- return group.widgets[1 if (group.split and port_mode == PORT_MODE_INPUT) else 0].pos()
-
- qCritical("PatchCanvas::getGroupPos(%i, %s) - unable to find group" % (group_id, port_mode2str(port_mode)))
- return QPointF(0, 0)
-
- def saveGroupPositions():
- if canvas.debug:
- print("PatchCanvas::getGroupPositions()")
-
- ret = []
-
- for group in canvas.group_list:
- if group.split:
- pos1 = group.widgets[0].pos()
- pos2 = group.widgets[1].pos()
- else:
- pos1 = group.widgets[0].pos()
- pos2 = QPointF(0, 0)
-
- ret.append({
- "name" : group.group_name,
- "pos1x": pos1.x(),
- "pos1y": pos1.y(),
- "pos2x": pos2.x(),
- "pos2y": pos2.y(),
- "split": group.split,
- })
-
- return ret
-
- def restoreGroupPositions(dataList):
- if canvas.debug:
- print("PatchCanvas::restoreGroupPositions(...)")
-
- mapping = {}
-
- for group in canvas.group_list:
- mapping[group.group_name] = group
-
- for data in dataList:
- name = data['name']
- group = mapping.get(name, None)
-
- if group is None:
- continue
-
- group.widgets[0].blockSignals(True)
- group.widgets[0].setPos(data['pos1x'], data['pos1y'])
- group.widgets[0].blockSignals(False)
-
- if group.split and group.widgets[1]:
- group.widgets[1].blockSignals(True)
- group.widgets[1].setPos(data['pos2x'], data['pos2y'])
- group.widgets[1].blockSignals(False)
-
- def setGroupPos(group_id, group_pos_x, group_pos_y):
- setGroupPosFull(group_id, group_pos_x, group_pos_y, group_pos_x, group_pos_y)
-
- def setGroupPosFull(group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group_pos_y_i):
- if canvas.debug:
- print("PatchCanvas::setGroupPos(%i, %i, %i, %i, %i)" % (
- group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group_pos_y_i))
-
- for group in canvas.group_list:
- if group.group_id == group_id:
- group.widgets[0].blockSignals(True)
- group.widgets[0].setPos(group_pos_x_o, group_pos_y_o)
- group.widgets[0].checkItemPos()
- group.widgets[0].blockSignals(False)
-
- if group.split and group.widgets[1]:
- group.widgets[1].blockSignals(True)
- group.widgets[1].setPos(group_pos_x_i, group_pos_y_i)
- group.widgets[1].checkItemPos()
- group.widgets[1].blockSignals(False)
-
- QTimer.singleShot(0, canvas.scene.update)
- return
-
- qCritical("PatchCanvas::setGroupPos(%i, %i, %i, %i, %i) - unable to find group to reposition" % (
- group_id, group_pos_x_o, group_pos_y_o, group_pos_x_i, group_pos_y_i))
-
- # ------------------------------------------------------------------------------------------------------------
-
- def setGroupIcon(group_id, icon):
- if canvas.debug:
- print("PatchCanvas::setGroupIcon(%i, %s)" % (group_id, icon2str(icon)))
-
- for group in canvas.group_list:
- if group.group_id == group_id:
- group.icon = icon
- group.widgets[0].setIcon(icon)
-
- if group.split and group.widgets[1]:
- group.widgets[1].setIcon(icon)
-
- QTimer.singleShot(0, canvas.scene.update)
- return
-
- qCritical("PatchCanvas::setGroupIcon(%i, %s) - unable to find group to change icon" % (group_id, icon2str(icon)))
-
- def setGroupAsPlugin(group_id, plugin_id, hasUI, hasInlineDisplay):
- if canvas.debug:
- print("PatchCanvas::setGroupAsPlugin(%i, %i, %s, %s)" % (
- group_id, plugin_id, bool2str(hasUI), bool2str(hasInlineDisplay)))
-
- for group in canvas.group_list:
- if group.group_id == group_id:
- group.plugin_id = plugin_id
- group.plugin_ui = hasUI
- group.plugin_inline = hasInlineDisplay
- group.widgets[0].setAsPlugin(plugin_id, hasUI, hasInlineDisplay)
-
- if group.split and group.widgets[1]:
- group.widgets[1].setAsPlugin(plugin_id, hasUI, hasInlineDisplay)
-
- canvas.group_plugin_map[plugin_id] = group
- return
-
- qCritical("PatchCanvas::setGroupAsPlugin(%i, %i, %s, %s) - unable to find group to set as plugin" % (
- group_id, plugin_id, bool2str(hasUI), bool2str(hasInlineDisplay)))
-
- # ------------------------------------------------------------------------------------------------------------
-
- def focusGroupUsingPluginId(plugin_id):
- if canvas.debug:
- print("PatchCanvas::focusGroupUsingPluginId(%i)" % (plugin_id,))
-
- if plugin_id < 0 or plugin_id >= MAX_PLUGIN_ID_ALLOWED:
- return False
-
- for group in canvas.group_list:
- if group.plugin_id == plugin_id:
- item = group.widgets[0]
- canvas.scene.clearSelection()
- canvas.scene.getView().centerOn(item)
- item.setSelected(True)
- return True
-
- def focusGroupUsingGroupName(group_name):
- if canvas.debug:
- print("PatchCanvas::focusGroupUsingGroupName(%s)" % (group_name,))
-
- for group in canvas.group_list:
- if group.group_name == group_name:
- item = group.widgets[0]
- canvas.scene.clearSelection()
- canvas.scene.getView().centerOn(item)
- item.setSelected(True)
- return True
-
- # ------------------------------------------------------------------------------------------------------------
-
- def addPort(group_id, port_id, port_name, port_mode, port_type, is_alternate=False):
- if canvas.debug:
- print("PatchCanvas::addPort(%i, %i, %s, %s, %s, %s)" % (
- group_id, port_id, port_name.encode(),
- port_mode2str(port_mode), port_type2str(port_type), bool2str(is_alternate)))
-
- for port in canvas.port_list:
- if port.group_id == group_id and port.port_id == port_id:
- qWarning("PatchCanvas::addPort(%i, %i, %s, %s, %s) - port already exists" % (
- group_id, port_id, port_name.encode(), port_mode2str(port_mode), port_type2str(port_type)))
- return
-
- box_widget = None
- port_widget = None
-
- for group in canvas.group_list:
- if group.group_id == group_id:
- if group.split and group.widgets[0].getSplittedMode() != port_mode and group.widgets[1]:
- n = 1
- else:
- n = 0
- box_widget = group.widgets[n]
- port_widget = box_widget.addPortFromGroup(port_id, port_mode, port_type, port_name, is_alternate)
- break
-
- if not (box_widget and port_widget):
- qCritical("PatchCanvas::addPort(%i, %i, %s, %s, %s) - Unable to find parent group" % (
- group_id, port_id, port_name.encode(), port_mode2str(port_mode), port_type2str(port_type)))
- return
-
- port_dict = port_dict_t()
- port_dict.group_id = group_id
- port_dict.port_id = port_id
- port_dict.port_name = port_name
- port_dict.port_mode = port_mode
- port_dict.port_type = port_type
- port_dict.is_alternate = is_alternate
- port_dict.widget = port_widget
- canvas.port_list.append(port_dict)
-
- box_widget.updatePositions()
-
- if options.eyecandy == EYECANDY_FULL:
- CanvasItemFX(port_widget, True, False)
- return
-
- QTimer.singleShot(0, canvas.scene.update)
-
- def removePort(group_id, port_id):
- if canvas.debug:
- print("PatchCanvas::removePort(%i, %i)" % (group_id, port_id))
-
- for port in canvas.port_list:
- if port.group_id == group_id and port.port_id == port_id:
- item = port.widget
- item.parentItem().removePortFromGroup(port_id)
- canvas.scene.removeItem(item)
- canvas.port_list.remove(port)
- del item
-
- QTimer.singleShot(0, canvas.scene.update)
- return
-
- qCritical("PatchCanvas::removePort(%i, %i) - Unable to find port to remove" % (group_id, port_id))
-
- def renamePort(group_id, port_id, new_port_name):
- if canvas.debug:
- print("PatchCanvas::renamePort(%i, %i, %s)" % (group_id, port_id, new_port_name.encode()))
-
- for port in canvas.port_list:
- if port.group_id == group_id and port.port_id == port_id:
- port.port_name = new_port_name
- port.widget.setPortName(new_port_name)
- port.widget.parentItem().updatePositions()
-
- QTimer.singleShot(0, canvas.scene.update)
- return
-
- qCritical("PatchCanvas::renamePort(%i, %i, %s) - Unable to find port to rename" % (
- group_id, port_id, new_port_name.encode()))
-
- def connectPorts(connection_id, group_out_id, port_out_id, group_in_id, port_in_id):
- if canvas.last_connection_id >= connection_id:
- print("PatchCanvas::connectPorts(%i, %i, %i, %i, %i) - invalid connection id received" % (
- connection_id, group_out_id, port_out_id, group_in_id, port_in_id))
- return
-
- canvas.last_connection_id = connection_id
-
- if canvas.debug:
- print("PatchCanvas::connectPorts(%i, %i, %i, %i, %i)" % (
- connection_id, group_out_id, port_out_id, group_in_id, port_in_id))
-
- port_out = None
- port_in = None
- port_out_parent = None
- port_in_parent = None
-
- for port in canvas.port_list:
- if port.group_id == group_out_id and port.port_id == port_out_id:
- port_out = port.widget
- port_out_parent = port_out.parentItem()
- elif port.group_id == group_in_id and port.port_id == port_in_id:
- port_in = port.widget
- port_in_parent = port_in.parentItem()
-
- # FIXME
- if not (port_out and port_in):
- qCritical("PatchCanvas::connectPorts(%i, %i, %i, %i, %i) - unable to find ports to connect" % (
- connection_id, group_out_id, port_out_id, group_in_id, port_in_id))
- return
-
- connection_dict = connection_dict_t()
- connection_dict.connection_id = connection_id
- connection_dict.group_in_id = group_in_id
- connection_dict.port_in_id = port_in_id
- connection_dict.group_out_id = group_out_id
- connection_dict.port_out_id = port_out_id
-
- if options.use_bezier_lines:
- connection_dict.widget = CanvasBezierLine(port_out, port_in, None)
- else:
- connection_dict.widget = CanvasLine(port_out, port_in, None)
-
- canvas.scene.addItem(connection_dict.widget)
-
- port_out_parent.addLineFromGroup(connection_dict.widget, connection_id)
- port_in_parent.addLineFromGroup(connection_dict.widget, connection_id)
-
- canvas.last_z_value += 1
- port_out_parent.setZValue(canvas.last_z_value)
- port_in_parent.setZValue(canvas.last_z_value)
-
- canvas.last_z_value += 1
- connection_dict.widget.setZValue(canvas.last_z_value)
-
- canvas.connection_list.append(connection_dict)
-
- if options.eyecandy == EYECANDY_FULL:
- item = connection_dict.widget
- CanvasItemFX(item, True, False)
- return
-
- QTimer.singleShot(0, canvas.scene.update)
-
- def disconnectPorts(connection_id):
- if canvas.debug:
- print("PatchCanvas::disconnectPorts(%i)" % connection_id)
-
- line = None
- item1 = None
- item2 = None
- group1id = port1id = 0
- group2id = port2id = 0
-
- for connection in canvas.connection_list:
- if connection.connection_id == connection_id:
- group1id = connection.group_out_id
- group2id = connection.group_in_id
- port1id = connection.port_out_id
- port2id = connection.port_in_id
- line = connection.widget
- canvas.connection_list.remove(connection)
- break
-
- if not line:
- qCritical("PatchCanvas::disconnectPorts(%i) - unable to find connection ports" % connection_id)
- return
-
- for port in canvas.port_list:
- if port.group_id == group1id and port.port_id == port1id:
- item1 = port.widget
- break
-
- if not item1:
- qCritical("PatchCanvas::disconnectPorts(%i) - unable to find output port" % connection_id)
- return
-
- for port in canvas.port_list:
- if port.group_id == group2id and port.port_id == port2id:
- item2 = port.widget
- break
-
- if not item2:
- qCritical("PatchCanvas::disconnectPorts(%i) - unable to find input port" % connection_id)
- return
-
- item1.parentItem().removeLineFromGroup(connection_id)
- item2.parentItem().removeLineFromGroup(connection_id)
-
- if options.eyecandy == EYECANDY_FULL:
- CanvasItemFX(line, False, True)
- return
-
- canvas.scene.removeItem(line)
- del line
-
- QTimer.singleShot(0, canvas.scene.update)
-
- # ------------------------------------------------------------------------------------------------------------
-
- def arrange():
- if canvas.debug:
- print("PatchCanvas::arrange()")
-
- # ------------------------------------------------------------------------------------------------------------
-
- def updateZValues():
- if canvas.debug:
- print("PatchCanvas::updateZValues()")
-
- for group in canvas.group_list:
- group.widgets[0].resetLinesZValue()
-
- if group.split and group.widgets[1]:
- group.widgets[1].resetLinesZValue()
-
- # ------------------------------------------------------------------------------------------------------------
-
- def redrawPluginGroup(plugin_id):
- group = canvas.group_plugin_map.get(plugin_id, None)
-
- if group is None:
- #qCritical("PatchCanvas::redrawPluginGroup(%i) - unable to find group" % plugin_id)
- return
-
- group.widgets[0].redrawInlineDisplay()
-
- if group.split and group.widgets[1]:
- group.widgets[1].redrawInlineDisplay()
-
- def handlePluginRemoved(plugin_id):
- if canvas.debug:
- print("PatchCanvas::handlePluginRemoved(%i)" % plugin_id)
-
- canvas.scene.clearSelection()
-
- group = canvas.group_plugin_map.pop(plugin_id, None)
-
- if group is not None:
- group.plugin_id = -1
- group.plugin_ui = False
- group.plugin_inline = False
- group.widgets[0].removeAsPlugin()
-
- if group.split and group.widgets[1]:
- group.widgets[1].removeAsPlugin()
-
- for group in canvas.group_list:
- if group.plugin_id < plugin_id or group.plugin_id > MAX_PLUGIN_ID_ALLOWED:
- continue
-
- group.plugin_id -= 1
- group.widgets[0].m_plugin_id -= 1
-
- if group.split and group.widgets[1]:
- group.widgets[1].m_plugin_id -= 1
-
- canvas.group_plugin_map[plugin_id] = group
-
- def handleAllPluginsRemoved():
- if canvas.debug:
- print("PatchCanvas::handleAllPluginsRemoved()")
-
- canvas.group_plugin_map = {}
-
- for group in canvas.group_list:
- if group.plugin_id < 0:
- continue
- if group.plugin_id > MAX_PLUGIN_ID_ALLOWED:
- continue
-
- group.plugin_id = -1
- group.plugin_ui = False
- group.plugin_inline = False
- group.widgets[0].removeAsPlugin()
-
- if group.split and group.widgets[1]:
- group.widgets[1].removeAsPlugin()
-
- # ------------------------------------------------------------------------------------------------------------
|