#!/usr/bin/env python3 # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho # SPDX-License-Identifier: GPL-2.0-or-later # ------------------------------------------------------------------------------------------------------------ # Imports (Global) from qt_compat import qt_config if qt_config == 5: from PyQt5.QtCore import Qt, QLineF from PyQt5.QtGui import QLinearGradient, QPainter, QPen from PyQt5.QtWidgets import QGraphicsLineItem elif qt_config == 6: from PyQt6.QtCore import Qt, QLineF from PyQt6.QtGui import QLinearGradient, QPainter, QPen from PyQt6.QtWidgets import QGraphicsLineItem # ------------------------------------------------------------------------------------------------------------ # Imports (Custom) from . import ( canvas, options, CanvasLineType, ACTION_PORTS_DISCONNECT, EYECANDY_FULL, PORT_MODE_OUTPUT, PORT_TYPE_AUDIO_JACK, PORT_TYPE_MIDI_ALSA, PORT_TYPE_MIDI_JACK, PORT_TYPE_PARAMETER, ) from .canvasportglow import CanvasPortGlow # ------------------------------------------------------------------------------------------------------------ class CanvasLine(QGraphicsLineItem): def __init__(self, item1, item2, parent): QGraphicsLineItem.__init__(self) self.setParentItem(parent) self.item1 = item1 self.item2 = item2 self.m_locked = False self.m_lineSelected = False self.setGraphicsEffect(None) self.updateLinePos() def isLocked(self): return self.m_locked def setLocked(self, yesno): self.m_locked = yesno def isLineSelected(self): return self.m_lineSelected def updateLineSelected(self): if self.m_locked: return yesno = self.item1.isSelected() or self.item2.isSelected() if yesno != self.m_lineSelected and options.eyecandy == EYECANDY_FULL: if yesno: self.setGraphicsEffect(CanvasPortGlow(self.item1.getPortType(), self.toGraphicsObject())) else: self.setGraphicsEffect(None) self.m_lineSelected = yesno self.updateLineGradient() def triggerDisconnect(self): for connection in canvas.connection_list: if (connection.port_out_id == self.item1.getPortId() and connection.port_in_id == self.item2.getPortId()): canvas.callback(ACTION_PORTS_DISCONNECT, connection.connection_id, 0, "") break def updateLinePos(self): if self.item1.getPortMode() == PORT_MODE_OUTPUT: rect1 = self.item1.sceneBoundingRect() rect2 = self.item2.sceneBoundingRect() line = QLineF(rect1.right(), rect1.top() + float(canvas.theme.port_height)/2, rect2.left(), rect2.top() + float(canvas.theme.port_height)/2) self.setLine(line) self.m_lineSelected = False self.updateLineGradient() def type(self): return CanvasLineType def updateLineGradient(self): pos_top = self.boundingRect().top() pos_bot = self.boundingRect().bottom() if self.item2.scenePos().y() >= self.item1.scenePos().y(): pos1 = 0 pos2 = 1 else: pos1 = 1 pos2 = 0 port_type1 = self.item1.getPortType() port_type2 = self.item2.getPortType() port_gradient = QLinearGradient(0, pos_top, 0, pos_bot) if port_type1 == PORT_TYPE_AUDIO_JACK: port_gradient.setColorAt(pos1, canvas.theme.line_audio_jack_sel if self.m_lineSelected else canvas.theme.line_audio_jack) elif port_type1 == PORT_TYPE_MIDI_JACK: port_gradient.setColorAt(pos1, canvas.theme.line_midi_jack_sel if self.m_lineSelected else canvas.theme.line_midi_jack) elif port_type1 == PORT_TYPE_MIDI_ALSA: port_gradient.setColorAt(pos1, canvas.theme.line_midi_alsa_sel if self.m_lineSelected else canvas.theme.line_midi_alsa) elif port_type1 == PORT_TYPE_PARAMETER: port_gradient.setColorAt(pos1, canvas.theme.line_parameter_sel if self.m_lineSelected else canvas.theme.line_parameter) if port_type2 == PORT_TYPE_AUDIO_JACK: port_gradient.setColorAt(pos2, canvas.theme.line_audio_jack_sel if self.m_lineSelected else canvas.theme.line_audio_jack) elif port_type2 == PORT_TYPE_MIDI_JACK: port_gradient.setColorAt(pos2, canvas.theme.line_midi_jack_sel if self.m_lineSelected else canvas.theme.line_midi_jack) elif port_type2 == PORT_TYPE_MIDI_ALSA: port_gradient.setColorAt(pos2, canvas.theme.line_midi_alsa_sel if self.m_lineSelected else canvas.theme.line_midi_alsa) elif port_type2 == PORT_TYPE_PARAMETER: port_gradient.setColorAt(pos2, canvas.theme.line_parameter_sel if self.m_lineSelected else canvas.theme.line_parameter) self.setPen(QPen(port_gradient, 2.00001, Qt.SolidLine, Qt.RoundCap)) def paint(self, painter, option, widget): painter.save() painter.setRenderHint(QPainter.Antialiasing, bool(options.antialiasing)) pen = self.pen() cosm_pen = QPen(pen) cosm_pen.setCosmetic(True) cosm_pen.setWidthF(1.00001) QGraphicsLineItem.paint(self, painter, option, widget) painter.setPen(cosm_pen) painter.setBrush(Qt.NoBrush) painter.setOpacity(0.2) painter.drawLine(self.line()) painter.restore() # ------------------------------------------------------------------------------------------------------------