Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
5.9KB

  1. #!/usr/bin/env python3
  2. # SPDX-FileCopyrightText: 2011-2024 Filipe Coelho <falktx@falktx.com>
  3. # SPDX-License-Identifier: GPL-2.0-or-later
  4. # ------------------------------------------------------------------------------------------------------------
  5. # Imports (Global)
  6. from qt_compat import qt_config
  7. if qt_config == 5:
  8. from PyQt5.QtCore import Qt, QPointF
  9. from PyQt5.QtGui import QColor, QLinearGradient, QPainter, QPainterPath, QPen
  10. from PyQt5.QtWidgets import QGraphicsPathItem
  11. elif qt_config == 6:
  12. from PyQt6.QtCore import Qt, QPointF
  13. from PyQt6.QtGui import QColor, QLinearGradient, QPainter, QPainterPath, QPen
  14. from PyQt6.QtWidgets import QGraphicsPathItem
  15. # ------------------------------------------------------------------------------------------------------------
  16. # Imports (Custom)
  17. from . import (
  18. canvas,
  19. options,
  20. CanvasBezierLineType,
  21. ACTION_PORTS_DISCONNECT,
  22. EYECANDY_FULL,
  23. PORT_MODE_OUTPUT,
  24. PORT_TYPE_AUDIO_JACK,
  25. PORT_TYPE_MIDI_ALSA,
  26. PORT_TYPE_MIDI_JACK,
  27. PORT_TYPE_PARAMETER,
  28. )
  29. from .canvasportglow import CanvasPortGlow
  30. # ------------------------------------------------------------------------------------------------------------
  31. class CanvasBezierLine(QGraphicsPathItem):
  32. def __init__(self, item1, item2, parent):
  33. QGraphicsPathItem.__init__(self)
  34. self.setParentItem(parent)
  35. self.item1 = item1
  36. self.item2 = item2
  37. self.m_locked = False
  38. self.m_lineSelected = False
  39. self.setBrush(QColor(0, 0, 0, 0))
  40. self.setGraphicsEffect(None)
  41. self.updateLinePos()
  42. def isLocked(self):
  43. return self.m_locked
  44. def setLocked(self, yesno):
  45. self.m_locked = yesno
  46. def isLineSelected(self):
  47. return self.m_lineSelected
  48. def updateLineSelected(self):
  49. if self.m_locked:
  50. return
  51. yesno = self.item1.isSelected() or self.item2.isSelected()
  52. if yesno != self.m_lineSelected and options.eyecandy == EYECANDY_FULL:
  53. if yesno:
  54. self.setGraphicsEffect(CanvasPortGlow(self.item1.getPortType(), self.toGraphicsObject()))
  55. else:
  56. self.setGraphicsEffect(None)
  57. self.m_lineSelected = yesno
  58. self.updateLineGradient()
  59. def triggerDisconnect(self):
  60. for connection in canvas.connection_list:
  61. if (connection.port_out_id == self.item1.getPortId() and connection.port_in_id == self.item2.getPortId()):
  62. canvas.callback(ACTION_PORTS_DISCONNECT, connection.connection_id, 0, "")
  63. break
  64. def updateLinePos(self):
  65. if self.item1.getPortMode() == PORT_MODE_OUTPUT:
  66. rect1 = self.item1.sceneBoundingRect()
  67. rect2 = self.item2.sceneBoundingRect()
  68. item1_x = rect1.right()
  69. item2_x = rect2.left()
  70. item1_y = rect1.top() + float(canvas.theme.port_height)/2
  71. item2_y = rect2.top() + float(canvas.theme.port_height)/2
  72. item1_new_x = item1_x + abs(item1_x - item2_x) / 2
  73. item2_new_x = item2_x - abs(item1_x - item2_x) / 2
  74. path = QPainterPath(QPointF(item1_x, item1_y))
  75. path.cubicTo(item1_new_x, item1_y, item2_new_x, item2_y, item2_x, item2_y)
  76. self.setPath(path)
  77. self.m_lineSelected = False
  78. self.updateLineGradient()
  79. def type(self):
  80. return CanvasBezierLineType
  81. def updateLineGradient(self):
  82. pos_top = self.boundingRect().top()
  83. pos_bot = self.boundingRect().bottom()
  84. if self.item2.scenePos().y() >= self.item1.scenePos().y():
  85. pos1 = 0
  86. pos2 = 1
  87. else:
  88. pos1 = 1
  89. pos2 = 0
  90. port_type1 = self.item1.getPortType()
  91. port_type2 = self.item2.getPortType()
  92. port_gradient = QLinearGradient(0, pos_top, 0, pos_bot)
  93. if port_type1 == PORT_TYPE_AUDIO_JACK:
  94. port_gradient.setColorAt(pos1, canvas.theme.line_audio_jack_sel if self.m_lineSelected else canvas.theme.line_audio_jack)
  95. elif port_type1 == PORT_TYPE_MIDI_JACK:
  96. port_gradient.setColorAt(pos1, canvas.theme.line_midi_jack_sel if self.m_lineSelected else canvas.theme.line_midi_jack)
  97. elif port_type1 == PORT_TYPE_MIDI_ALSA:
  98. port_gradient.setColorAt(pos1, canvas.theme.line_midi_alsa_sel if self.m_lineSelected else canvas.theme.line_midi_alsa)
  99. elif port_type1 == PORT_TYPE_PARAMETER:
  100. port_gradient.setColorAt(pos1, canvas.theme.line_parameter_sel if self.m_lineSelected else canvas.theme.line_parameter)
  101. if port_type2 == PORT_TYPE_AUDIO_JACK:
  102. port_gradient.setColorAt(pos2, canvas.theme.line_audio_jack_sel if self.m_lineSelected else canvas.theme.line_audio_jack)
  103. elif port_type2 == PORT_TYPE_MIDI_JACK:
  104. port_gradient.setColorAt(pos2, canvas.theme.line_midi_jack_sel if self.m_lineSelected else canvas.theme.line_midi_jack)
  105. elif port_type2 == PORT_TYPE_MIDI_ALSA:
  106. port_gradient.setColorAt(pos2, canvas.theme.line_midi_alsa_sel if self.m_lineSelected else canvas.theme.line_midi_alsa)
  107. elif port_type2 == PORT_TYPE_PARAMETER:
  108. port_gradient.setColorAt(pos2, canvas.theme.line_parameter_sel if self.m_lineSelected else canvas.theme.line_parameter)
  109. self.setPen(QPen(port_gradient, 2.00001, Qt.SolidLine, Qt.FlatCap))
  110. def paint(self, painter, option, widget):
  111. painter.save()
  112. painter.setRenderHint(QPainter.Antialiasing, bool(options.antialiasing))
  113. pen = self.pen()
  114. cosm_pen = QPen(pen)
  115. cosm_pen.setCosmetic(True)
  116. cosm_pen.setWidthF(1.00001)
  117. QGraphicsPathItem.paint(self, painter, option, widget)
  118. painter.setPen(cosm_pen)
  119. painter.setBrush(Qt.NoBrush)
  120. painter.setOpacity(0.2)
  121. painter.drawPath(self.path())
  122. painter.restore()
  123. # ------------------------------------------------------------------------------------------------------------