Collection of tools useful for audio production
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.

172 lines
5.8KB

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Custom Mini Canvas Preview, a custom Qt4 widget
  4. # Copyright (C) 2011-2012 Filipe Coelho <falktx@falktx.com>
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU General Public License for more details.
  15. #
  16. # For a full copy of the GNU General Public License see the COPYING file
  17. # Imports (Global)
  18. from PyQt4.QtCore import Qt, QRectF, QTimer, SIGNAL, SLOT
  19. from PyQt4.QtGui import QBrush, QColor, QCursor, QFrame, QPainter, QPen
  20. iX = 0
  21. iY = 1
  22. iWidth = 2
  23. iHeight = 3
  24. # Widget Class
  25. class CanvasPreviewFrame(QFrame):
  26. def __init__(self, parent):
  27. QFrame.__init__(self, parent)
  28. self.m_mouseDown = False
  29. self.m_viewbrush = QBrush(QColor(75, 75, 255, 30))
  30. self.m_viewpen = QPen(Qt.blue, 1)
  31. self.scale = 1.0
  32. self.scene = None
  33. self.real_parent = None
  34. self.fake_width = 0
  35. self.fake_height = 0
  36. self.render_source = self.getRenderSource()
  37. self.render_target = QRectF(0, 0, 0, 0)
  38. self.view_pad_x = 0.0
  39. self.view_pad_y = 0.0
  40. self.view_rect = [0.0, 0.0, 10.0, 10.0]
  41. def init(self, scene, real_width, real_height):
  42. self.scene = scene
  43. self.fake_width = float(real_width) / 15
  44. self.fake_height = float(real_height) / 15
  45. self.setMinimumSize(self.fake_width, self.fake_height)
  46. self.setMaximumSize(self.fake_width * 4, self.fake_height)
  47. self.render_target.setWidth(real_width)
  48. self.render_target.setHeight(real_height)
  49. def setRealParent(self, parent):
  50. self.real_parent = parent
  51. def getRenderSource(self):
  52. x_pad = (self.width() - self.fake_width) / 2
  53. y_pad = (self.height() - self.fake_height) / 2
  54. return QRectF(x_pad, y_pad, self.fake_width, self.fake_height)
  55. def setViewPosX(self, xp):
  56. x = xp * self.fake_width
  57. x_ratio = (x / self.fake_width) * self.view_rect[iWidth] / self.scale
  58. self.view_rect[iX] = x - x_ratio + self.render_source.x()
  59. self.update()
  60. def setViewPosY(self, yp):
  61. y = yp * self.fake_height
  62. y_ratio = (y / self.fake_height) * self.view_rect[iHeight] / self.scale
  63. self.view_rect[iY] = y - y_ratio + self.render_source.y()
  64. self.update()
  65. def setViewScale(self, scale):
  66. self.scale = scale
  67. QTimer.singleShot(0, self.real_parent, SLOT("slot_miniCanvasCheckAll()"))
  68. def setViewSize(self, width_p, height_p):
  69. width = width_p * self.fake_width
  70. height = height_p * self.fake_height
  71. self.view_rect[iWidth] = width
  72. self.view_rect[iHeight] = height
  73. self.update()
  74. def setViewTheme(self, brushColor, penColor):
  75. brushColor.setAlpha(40)
  76. penColor.setAlpha(100)
  77. self.m_viewbrush = QBrush(brushColor)
  78. self.m_viewpen = QPen(penColor, 1)
  79. def handleMouseEvent(self, event_x, event_y):
  80. x = float(event_x) - self.render_source.x() - (self.view_rect[iWidth] / self.scale / 2)
  81. y = float(event_y) - self.render_source.y() - (self.view_rect[iHeight] / self.scale / 2)
  82. max_width = self.view_rect[iWidth] / self.scale
  83. max_height = self.view_rect[iHeight] / self.scale
  84. if max_width > self.fake_width:
  85. max_width = self.fake_width
  86. if max_height > self.fake_height:
  87. max_height = self.fake_height
  88. if x < 0.0:
  89. x = 0.0
  90. elif x > self.fake_width - max_width:
  91. x = self.fake_width - max_width
  92. if y < 0.0:
  93. y = 0.0
  94. elif y > self.fake_height - max_height:
  95. y = self.fake_height - max_height
  96. self.view_rect[iX] = x + self.render_source.x()
  97. self.view_rect[iY] = y + self.render_source.y()
  98. self.update()
  99. self.emit(SIGNAL("miniCanvasMoved(double, double)"), x * self.scale / self.fake_width, y * self.scale / self.fake_height)
  100. def mousePressEvent(self, event):
  101. if event.button() == Qt.LeftButton:
  102. self.m_mouseDown = True
  103. self.setCursor(QCursor(Qt.SizeAllCursor))
  104. self.handleMouseEvent(event.x(), event.y())
  105. event.accept()
  106. def mouseMoveEvent(self, event):
  107. if self.m_mouseDown:
  108. self.handleMouseEvent(event.x(), event.y())
  109. event.accept()
  110. def mouseReleaseEvent(self, event):
  111. if self.m_mouseDown:
  112. self.setCursor(QCursor(Qt.ArrowCursor))
  113. self.m_mouseDown = False
  114. QFrame.mouseReleaseEvent(self, event)
  115. def paintEvent(self, event):
  116. painter = QPainter(self)
  117. painter.setBrush(QBrush(Qt.darkBlue, Qt.DiagCrossPattern))
  118. painter.drawRect(0, 0, self.width(), self.height())
  119. self.scene.render(painter, self.render_source, self.render_target, Qt.KeepAspectRatio)
  120. max_width = self.view_rect[iWidth] / self.scale
  121. max_height = self.view_rect[iHeight] / self.scale
  122. if max_width > self.fake_width:
  123. max_width = self.fake_width
  124. if max_height > self.fake_height:
  125. max_height = self.fake_height
  126. painter.setBrush(self.m_viewbrush)
  127. painter.setPen(self.m_viewpen)
  128. painter.drawRect(self.view_rect[iX], self.view_rect[iY], max_width, max_height)
  129. QFrame.paintEvent(self, event)
  130. def resizeEvent(self, event):
  131. self.render_source = self.getRenderSource()
  132. if self.real_parent:
  133. QTimer.singleShot(0, self.real_parent, SLOT("slot_miniCanvasCheckAll()"))
  134. QFrame.resizeEvent(self, event)