#!/usr/bin/env python3 # -*- coding: utf-8 -*- # PatchBay Canvas engine using QGraphicsView/Scene # Copyright (C) 2010-2019 Filipe Coelho # # 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 qCritical, QPointF, QTimer # ------------------------------------------------------------------------------------------------------------ # Imports (Custom) from . import bool2str, canvas, CanvasBoxType from .canvasfadeanimation import CanvasFadeAnimation # ------------------------------------------------------------------------------------------------------------ def CanvasGetNewGroupPos(horizontal): if canvas.debug: print("PatchCanvas::CanvasGetNewGroupPos(%s)" % bool2str(horizontal)) new_pos = QPointF(canvas.initial_pos) items = canvas.scene.items() #break_loop = False while True: break_for = False for i, item in enumerate(items): if item and item.type() == CanvasBoxType: if item.sceneBoundingRect().adjusted(-5, -5, 5, 5).contains(new_pos): itemRect = item.boundingRect() if horizontal: new_pos += QPointF(itemRect.width() + 50, 0) else: itemHeight = itemRect.height() if itemHeight < 30: new_pos += QPointF(0, itemHeight + 50) else: new_pos.setY(item.scenePos().y() + itemHeight + 20) break_for = True break else: if not break_for: break #break_loop = True return new_pos def CanvasGetFullPortName(group_id, port_id): if canvas.debug: print("PatchCanvas::CanvasGetFullPortName(%i, %i)" % (group_id, port_id)) for port in canvas.port_list: if port.group_id == group_id and port.port_id == port_id: group_id = port.group_id for group in canvas.group_list: if group.group_id == group_id: return group.group_name + ":" + port.port_name break qCritical("PatchCanvas::CanvasGetFullPortName(%i, %i) - unable to find port" % (group_id, port_id)) return "" def CanvasGetPortConnectionList(group_id, port_id): if canvas.debug: print("PatchCanvas::CanvasGetPortConnectionList(%i, %i)" % (group_id, port_id)) conn_list = [] for connection in canvas.connection_list: if connection.group_out_id == group_id and connection.port_out_id == port_id: conn_list.append((connection.connection_id, connection.group_in_id, connection.port_in_id)) elif connection.group_in_id == group_id and connection.port_in_id == port_id: conn_list.append((connection.connection_id, connection.group_out_id, connection.port_out_id)) return conn_list def CanvasCallback(action, value1, value2, value_str): if canvas.debug: print("PatchCanvas::CanvasCallback(%i, %i, %i, %s)" % (action, value1, value2, value_str.encode())) canvas.callback(action, value1, value2, value_str) def CanvasItemFX(item, show, destroy): if canvas.debug: print("PatchCanvas::CanvasItemFX(%s, %s, %s)" % (item, bool2str(show), bool2str(destroy))) # Check if the item already has an animation for animation in canvas.animation_list: if animation.item() == item: animation.forceStop() canvas.animation_list.remove(animation) del animation break animation = CanvasFadeAnimation(item, show) animation.setDuration(750 if show else 500) if show: animation.finished.connect(canvas.qobject.AnimationFinishedShow) else: if destroy: animation.finished.connect(canvas.qobject.AnimationFinishedDestroy) else: animation.finished.connect(canvas.qobject.AnimationFinishedHide) canvas.animation_list.append(animation) animation.start() def CanvasRemoveItemFX(item): if canvas.debug: print("PatchCanvas::CanvasRemoveItemFX(%s)" % item) if item.type() == CanvasBoxType: item.removeIconFromScene() canvas.scene.removeItem(item) del item QTimer.singleShot(0, canvas.scene.update) # ------------------------------------------------------------------------------------------------------------