|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119 |
- #!/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 utils 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
- group_pos = None
- 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
- group_pos = item.pos()
- 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.group_id == group_id and 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.group_in_id == group_id and connection.port_in_id in port_list_ids) or \
- (connection.group_out_id == group_id and connection.port_out_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, True)
-
- if group is not None:
- pos1 = group.widgets[0].pos()
- pos2 = group.widgets[1].pos()
- group2_pos = QPointF(group_pos.x() + group.widgets[1].boundingRect().width() * 3/2, group_pos.y())
- group.widgets[0].blockSignals(True)
- group.widgets[0].setPos(group_pos)
- group.widgets[0].blockSignals(False)
- group.widgets[1].blockSignals(True)
- group.widgets[1].setPos(group2_pos)
- group.widgets[1].checkItemPos()
- group.widgets[1].blockSignals(False)
- valueStr = "%i:%i:%i:%i" % (group_pos.x(), group_pos.y(), group2_pos.x(), group2_pos.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
- group_pos = None
- 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
- group_pos = item.pos()
- 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.group_id == group_id and 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.group_in_id == group_id and connection.port_in_id in port_list_ids) or \
- (connection.group_out_id == group_id and connection.port_out_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, True)
-
- if group is not None:
- group.widgets[0].blockSignals(True)
- group.widgets[0].setPos(group_pos)
- group.widgets[0].checkItemPos()
- group.widgets[0].blockSignals(False)
- valueStr = "%i:%i:%i:%i" % (group_pos.x(), group_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].getSplitMode() != 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
- try:
- pitem = item.parentItem()
- canvas.scene.removeItem(item)
- except RuntimeError:
- pass
- else:
- pitem.removePortFromGroup(port_id)
- 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, fromSplitOrJoin = False):
- if canvas.last_connection_id >= connection_id and not fromSplitOrJoin:
- print("PatchCanvas::connectPorts(%i, %i, %i, %i, %i) - invalid connection id received (last: %i)" % (
- connection_id, group_out_id, port_out_id, group_in_id, port_in_id, canvas.last_connection_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
-
- item1p = item1.parentItem()
- item2p = item2.parentItem()
- if item1p:
- item1p.removeLineFromGroup(connection_id)
- if item2p:
- item2p.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()
-
- # ------------------------------------------------------------------------------------------------------------
|