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.

151 lines
5.5KB

  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, QLineF
  9. from PyQt5.QtGui import QLinearGradient, QPainter, QPen
  10. from PyQt5.QtWidgets import QGraphicsLineItem
  11. elif qt_config == 6:
  12. from PyQt6.QtCore import Qt, QLineF
  13. from PyQt6.QtGui import QLinearGradient, QPainter, QPen
  14. from PyQt6.QtWidgets import QGraphicsLineItem
  15. # ------------------------------------------------------------------------------------------------------------
  16. # Imports (Custom)
  17. from . import (
  18. canvas,
  19. options,
  20. CanvasLineType,
  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 CanvasLine(QGraphicsLineItem):
  32. def __init__(self, item1, item2, parent):
  33. QGraphicsLineItem.__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.setGraphicsEffect(None)
  40. self.updateLinePos()
  41. def isLocked(self):
  42. return self.m_locked
  43. def setLocked(self, yesno):
  44. self.m_locked = yesno
  45. def isLineSelected(self):
  46. return self.m_lineSelected
  47. def updateLineSelected(self):
  48. if self.m_locked:
  49. return
  50. yesno = self.item1.isSelected() or self.item2.isSelected()
  51. if yesno != self.m_lineSelected and options.eyecandy == EYECANDY_FULL:
  52. if yesno:
  53. self.setGraphicsEffect(CanvasPortGlow(self.item1.getPortType(), self.toGraphicsObject()))
  54. else:
  55. self.setGraphicsEffect(None)
  56. self.m_lineSelected = yesno
  57. self.updateLineGradient()
  58. def triggerDisconnect(self):
  59. for connection in canvas.connection_list:
  60. if (connection.port_out_id == self.item1.getPortId() and connection.port_in_id == self.item2.getPortId()):
  61. canvas.callback(ACTION_PORTS_DISCONNECT, connection.connection_id, 0, "")
  62. break
  63. def updateLinePos(self):
  64. if self.item1.getPortMode() == PORT_MODE_OUTPUT:
  65. rect1 = self.item1.sceneBoundingRect()
  66. rect2 = self.item2.sceneBoundingRect()
  67. line = QLineF(rect1.right(),
  68. rect1.top() + float(canvas.theme.port_height)/2,
  69. rect2.left(),
  70. rect2.top() + float(canvas.theme.port_height)/2)
  71. self.setLine(line)
  72. self.m_lineSelected = False
  73. self.updateLineGradient()
  74. def type(self):
  75. return CanvasLineType
  76. def updateLineGradient(self):
  77. pos_top = self.boundingRect().top()
  78. pos_bot = self.boundingRect().bottom()
  79. if self.item2.scenePos().y() >= self.item1.scenePos().y():
  80. pos1 = 0
  81. pos2 = 1
  82. else:
  83. pos1 = 1
  84. pos2 = 0
  85. port_type1 = self.item1.getPortType()
  86. port_type2 = self.item2.getPortType()
  87. port_gradient = QLinearGradient(0, pos_top, 0, pos_bot)
  88. if port_type1 == PORT_TYPE_AUDIO_JACK:
  89. port_gradient.setColorAt(pos1, canvas.theme.line_audio_jack_sel if self.m_lineSelected else canvas.theme.line_audio_jack)
  90. elif port_type1 == PORT_TYPE_MIDI_JACK:
  91. port_gradient.setColorAt(pos1, canvas.theme.line_midi_jack_sel if self.m_lineSelected else canvas.theme.line_midi_jack)
  92. elif port_type1 == PORT_TYPE_MIDI_ALSA:
  93. port_gradient.setColorAt(pos1, canvas.theme.line_midi_alsa_sel if self.m_lineSelected else canvas.theme.line_midi_alsa)
  94. elif port_type1 == PORT_TYPE_PARAMETER:
  95. port_gradient.setColorAt(pos1, canvas.theme.line_parameter_sel if self.m_lineSelected else canvas.theme.line_parameter)
  96. if port_type2 == PORT_TYPE_AUDIO_JACK:
  97. port_gradient.setColorAt(pos2, canvas.theme.line_audio_jack_sel if self.m_lineSelected else canvas.theme.line_audio_jack)
  98. elif port_type2 == PORT_TYPE_MIDI_JACK:
  99. port_gradient.setColorAt(pos2, canvas.theme.line_midi_jack_sel if self.m_lineSelected else canvas.theme.line_midi_jack)
  100. elif port_type2 == PORT_TYPE_MIDI_ALSA:
  101. port_gradient.setColorAt(pos2, canvas.theme.line_midi_alsa_sel if self.m_lineSelected else canvas.theme.line_midi_alsa)
  102. elif port_type2 == PORT_TYPE_PARAMETER:
  103. port_gradient.setColorAt(pos2, canvas.theme.line_parameter_sel if self.m_lineSelected else canvas.theme.line_parameter)
  104. self.setPen(QPen(port_gradient, 2.00001, Qt.SolidLine, Qt.RoundCap))
  105. def paint(self, painter, option, widget):
  106. painter.save()
  107. painter.setRenderHint(QPainter.Antialiasing, bool(options.antialiasing))
  108. pen = self.pen()
  109. cosm_pen = QPen(pen)
  110. cosm_pen.setCosmetic(True)
  111. cosm_pen.setWidthF(1.00001)
  112. QGraphicsLineItem.paint(self, painter, option, widget)
  113. painter.setPen(cosm_pen)
  114. painter.setBrush(Qt.NoBrush)
  115. painter.setOpacity(0.2)
  116. painter.drawLine(self.line())
  117. painter.restore()
  118. # ------------------------------------------------------------------------------------------------------------