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.

135 lines
4.4KB

  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 QPointF, QRectF
  9. from PyQt5.QtGui import QColor, QFont, QPainter, QPixmap
  10. from PyQt5.QtSvg import QSvgWidget
  11. from PyQt5.QtWidgets import QPushButton
  12. elif qt_config == 6:
  13. from PyQt6.QtCore import QPointF, QRectF
  14. from PyQt6.QtGui import QColor, QFont, QPainter, QPixmap
  15. from PyQt6.QtSvgWidgets import QSvgWidget
  16. from PyQt6.QtWidgets import QPushButton
  17. # ---------------------------------------------------------------------------------------------------------------------
  18. # Widget Class
  19. class ScalableButton(QPushButton):
  20. def __init__(self, parent):
  21. QPushButton.__init__(self, parent)
  22. self.fImageNormal = None
  23. self.fImageDown = None
  24. self.fImageHover = None
  25. self.fImageRect = QRectF()
  26. self.fIsHovered = False
  27. self.fTopText = ""
  28. self.fTopTextColor = QColor()
  29. self.fTopTextFont = QFont()
  30. self.setText("")
  31. def setPixmaps(self, normal, down, hover):
  32. self.fImageNormal = QPixmap()
  33. self.fImageDown = QPixmap()
  34. self.fImageHover = QPixmap()
  35. self._loadImages(normal, down, hover)
  36. def setSvgs(self, normal, down, hover):
  37. self.fImageNormal = QSvgWidget()
  38. self.fImageDown = QSvgWidget()
  39. self.fImageHover = QSvgWidget()
  40. self._loadImages(normal, down, hover)
  41. def _loadImages(self, normal, down, hover):
  42. self.fImageNormal.load(normal)
  43. self.fImageDown.load(down)
  44. self.fImageHover.load(hover)
  45. if isinstance(self.fImageNormal, QPixmap):
  46. width = self.fImageNormal.width()
  47. height = self.fImageNormal.height()
  48. else:
  49. width = self.fImageNormal.sizeHint().width()
  50. height = self.fImageNormal.sizeHint().height()
  51. self.fImageRect = QRectF(0, 0, width, height)
  52. self.setMinimumSize(width, height)
  53. self.setMaximumSize(width, height)
  54. def setTopText(self, text, color, font):
  55. self.fTopText = text
  56. self.fTopTextColor = color
  57. self.fTopTextFont = font
  58. def enterEvent(self, event):
  59. self.fIsHovered = True
  60. QPushButton.enterEvent(self, event)
  61. def leaveEvent(self, event):
  62. self.fIsHovered = False
  63. QPushButton.leaveEvent(self, event)
  64. def paintEvent(self, event):
  65. painter = QPainter(self)
  66. event.accept()
  67. if self.fImageNormal is None:
  68. return
  69. if isinstance(self.fImageNormal, QPixmap):
  70. self.paintEventPixmap(painter)
  71. else:
  72. self.paintEventSvg(painter)
  73. if not self.fTopText:
  74. return
  75. painter.save()
  76. painter.setPen(self.fTopTextColor)
  77. painter.setBrush(self.fTopTextColor)
  78. painter.setFont(self.fTopTextFont)
  79. painter.drawText(QPointF(10, 16), self.fTopText)
  80. painter.restore()
  81. def paintEventPixmap(self, painter):
  82. if not self.isEnabled():
  83. painter.save()
  84. painter.setOpacity(0.2)
  85. painter.drawPixmap(self.fImageRect, self.fImageNormal, self.fImageRect)
  86. painter.restore()
  87. elif self.isChecked() or self.isDown():
  88. painter.drawPixmap(self.fImageRect, self.fImageDown, self.fImageRect)
  89. elif self.fIsHovered:
  90. painter.drawPixmap(self.fImageRect, self.fImageHover, self.fImageRect)
  91. else:
  92. painter.drawPixmap(self.fImageRect, self.fImageNormal, self.fImageRect)
  93. def paintEventSvg(self, painter):
  94. if not self.isEnabled():
  95. painter.save()
  96. painter.setOpacity(0.2)
  97. self.fImageNormal.renderer().render(painter, self.fImageRect)
  98. painter.restore()
  99. elif self.isChecked() or self.isDown():
  100. self.fImageDown.renderer().render(painter, self.fImageRect)
  101. elif self.fIsHovered:
  102. self.fImageHover.renderer().render(painter, self.fImageRect)
  103. else:
  104. self.fImageNormal.renderer().render(painter, self.fImageRect)
  105. # ---------------------------------------------------------------------------------------------------------------------