Browse Source

Rename cursors; Cleanup CanvasPreviewFrame class

Signed-off-by: falkTX <falktx@falktx.com>
tags/v2.2.0-RC1
falkTX 4 years ago
parent
commit
9c710e50b3
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
16 changed files with 250 additions and 157 deletions
  1. +11
    -0
      .travis/script-pylint.sh
  2. +0
    -0
      resources/cursors/cut_black.png
  3. +0
    -0
      resources/cursors/cut_white.png
  4. +0
    -0
      resources/cursors/src/zoom.svg
  5. +7
    -7
      resources/cursors/update-pixmaps.sh
  6. +0
    -0
      resources/cursors/zoom-area_black.png
  7. +0
    -0
      resources/cursors/zoom-area_white.png
  8. +0
    -0
      resources/cursors/zoom-in_black.png
  9. +0
    -0
      resources/cursors/zoom-in_white.png
  10. +0
    -0
      resources/cursors/zoom-out_black.png
  11. +0
    -0
      resources/cursors/zoom-out_white.png
  12. +0
    -0
      resources/cursors/zoom_black.png
  13. +0
    -0
      resources/cursors/zoom_white.png
  14. +10
    -12
      resources/resources.qrc
  15. +2
    -2
      source/frontend/patchcanvas/scene.py
  16. +220
    -136
      source/frontend/widgets/canvaspreviewframe.py

+ 11
- 0
.travis/script-pylint.sh View File

@@ -4,12 +4,22 @@ set -e


make -C source/frontend make -C source/frontend


ln -sf ../patchcanvas source/frontend/widgets/

if which pylint3 >/dev/null; then if which pylint3 >/dev/null; then
pylint='pylint3' pylint='pylint3'
else else
pylint='pylint' pylint='pylint'
fi fi


# widget code, check all errors
${pylint} \
--extension-pkg-whitelist=PyQt5 \
--disable=\
bad-whitespace \
source/frontend/widgets/canvaspreviewframe.py

# main app code, ignore some errors
${pylint} \ ${pylint} \
--extension-pkg-whitelist=PyQt5 \ --extension-pkg-whitelist=PyQt5 \
--disable=\ --disable=\
@@ -34,6 +44,7 @@ unused-argument,\
wrong-import-position \ wrong-import-position \
source/frontend/carla_{app,backend,backend_qt,settings,shared,utils,widgets}.py source/frontend/carla_{app,backend,backend_qt,settings,shared,utils,widgets}.py


# code not updated yet
${pylint} \ ${pylint} \
--extension-pkg-whitelist=PyQt5 \ --extension-pkg-whitelist=PyQt5 \
-E \ -E \


resources/cursors/cut-black.png → resources/cursors/cut_black.png View File


resources/cursors/cut-white.png → resources/cursors/cut_white.png View File


resources/cursors/src/zoom-generic.svg → resources/cursors/src/zoom.svg View File


+ 7
- 7
resources/cursors/update-pixmaps.sh View File

@@ -1,10 +1,10 @@
#!/bin/sh #!/bin/sh


svgfiles="src/zoom-area.svg svgfiles="src/zoom-area.svg
src/zoom-generic.svg
src/zoom-in.svg
src/zoom-out.svg
src/cut.svg"
src/zoom.svg
src/zoom-in.svg
src/zoom-out.svg
src/cut.svg"


filter=Gaussian filter=Gaussian


@@ -14,14 +14,14 @@ for svgfile in ${svgfiles} ; do
# Imagemagick with rsvg support # Imagemagick with rsvg support
convert -background none -density 1200 \ convert -background none -density 1200 \
-define filter:blur=0.75 -filter ${filter} -resize 24x24 \ -define filter:blur=0.75 -filter ${filter} -resize 24x24 \
"${filename}.svg" "${filename}-black.png"
"${filename}.svg" "${filename}_black.png"
convert -background none \ convert -background none \
-resize 384x384 \ -resize 384x384 \
-channel red -negate \ -channel red -negate \
-channel green -negate \ -channel green -negate \
-channel blue -negate \ -channel blue -negate \
-define filter:blur=0.75 -filter ${filter} -resize 24x24 \ -define filter:blur=0.75 -filter ${filter} -resize 24x24 \
"${filename}.svg" "${filename}-white.png"
"${filename}.svg" "${filename}_white.png"


# Imagemagick without rsvg support # Imagemagick without rsvg support
#rsvg-convert -w 24 -h 24 "${filename}.svg" "${filename}-black-hd.png" #rsvg-convert -w 24 -h 24 "${filename}.svg" "${filename}-black-hd.png"
@@ -32,6 +32,6 @@ for svgfile in ${svgfiles} ; do
#convert -filter Sinc -background none -density 1200 -resize 24x24 "${filename}-black-hd.png" "${filename}-black.png" #convert -filter Sinc -background none -density 1200 -resize 24x24 "${filename}-black-hd.png" "${filename}-black.png"
#convert -filter Sinc -background none -density 1200 -resize 24x24 "${filename}-white-hd.png" "${filename}-white.png" #convert -filter Sinc -background none -density 1200 -resize 24x24 "${filename}-white-hd.png" "${filename}-white.png"


mv -f "${filename}-black.png" "${filename}-white.png" ./
mv -f "${filename}_black.png" "${filename}_white.png" ./
done done



resources/cursors/zoom-area-black.png → resources/cursors/zoom-area_black.png View File


resources/cursors/zoom-area-white.png → resources/cursors/zoom-area_white.png View File


resources/cursors/zoom-in-black.png → resources/cursors/zoom-in_black.png View File


resources/cursors/zoom-in-white.png → resources/cursors/zoom-in_white.png View File


resources/cursors/zoom-out-black.png → resources/cursors/zoom-out_black.png View File


resources/cursors/zoom-out-white.png → resources/cursors/zoom-out_white.png View File


resources/cursors/zoom-generic-black.png → resources/cursors/zoom_black.png View File


resources/cursors/zoom-generic-white.png → resources/cursors/zoom_white.png View File


+ 10
- 12
resources/resources.qrc View File

@@ -161,18 +161,16 @@
<file>scalable/pb_mplayer.svg</file> <file>scalable/pb_mplayer.svg</file>
<file>scalable/pb_vlc.svg</file> <file>scalable/pb_vlc.svg</file>




<file>cursors/zoom-generic-white.png</file>
<file>cursors/zoom-generic-black.png</file>
<file>cursors/zoom-in-white.png</file>
<file>cursors/zoom-in-black.png</file>
<file>cursors/zoom-out-white.png</file>
<file>cursors/zoom-out-black.png</file>
<file>cursors/zoom-area-white.png</file>
<file>cursors/zoom-area-black.png</file>
<file>cursors/cut-white.png</file>
<file>cursors/cut-black.png</file>
<file>cursors/zoom_white.png</file>
<file>cursors/zoom_black.png</file>
<file>cursors/zoom-in_white.png</file>
<file>cursors/zoom-in_black.png</file>
<file>cursors/zoom-out_white.png</file>
<file>cursors/zoom-out_black.png</file>
<file>cursors/zoom-area_white.png</file>
<file>cursors/zoom-area_black.png</file>
<file>cursors/cut_white.png</file>
<file>cursors/cut_black.png</file>


<file>fonts/uranium.ttf</file> <file>fonts/uranium.ttf</file>
</qresource> </qresource>


+ 2
- 2
source/frontend/patchcanvas/scene.py View File

@@ -134,8 +134,8 @@ class PatchScene(QGraphicsScene):
self.m_rubberband.setBrush(canvas.theme.rubberband_brush) self.m_rubberband.setBrush(canvas.theme.rubberband_brush)


cur_color = "black" if canvas.theme.canvas_bg.blackF() < 0.5 else "white" cur_color = "black" if canvas.theme.canvas_bg.blackF() < 0.5 else "white"
self.curCut = QCursor(QPixmap(":/cursors/cut-"+cur_color+".png"), 1, 1)
self.curZoomArea = QCursor(QPixmap(":/cursors/zoom-area-"+cur_color+".png"), 8, 7)
self.curCut = QCursor(QPixmap(":/cursors/cut_"+cur_color+".png"), 1, 1)
self.curZoomArea = QCursor(QPixmap(":/cursors/zoom-area_"+cur_color+".png"), 8, 7)


def zoom_fit(self): def zoom_fit(self):
min_x = min_y = max_x = max_y = None min_x = min_y = max_x = max_y = None


+ 220
- 136
source/frontend/widgets/canvaspreviewframe.py View File

@@ -2,7 +2,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-


# Custom Mini Canvas Preview, a custom Qt widget # Custom Mini Canvas Preview, a custom Qt widget
# Copyright (C) 2011-2019 Filipe Coelho <falktx@falktx.com>
# Copyright (C) 2011-2020 Filipe Coelho <falktx@falktx.com>
# #
# This program is free software; you can redistribute it and/or # This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as # modify it under the terms of the GNU General Public License as
@@ -16,33 +16,21 @@
# #
# For a full copy of the GNU General Public License see the doc/GPL.txt file. # For a full copy of the GNU General Public License see the doc/GPL.txt file.


# ------------------------------------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------------------------------------------
# Imports (Global) # Imports (Global)


from math import floor, ceil from math import floor, ceil


from PyQt5.QtCore import pyqtSignal, Qt, QRectF, QTimer, QEvent, QPoint from PyQt5.QtCore import pyqtSignal, Qt, QRectF, QTimer, QEvent, QPoint
from PyQt5.QtGui import QBrush, QColor, QCursor, QPainter, QPainterPath, QPen, QCursor, QPixmap
from PyQt5.QtWidgets import QFrame, QWidget
from PyQt5.QtGui import QBrush, QColor, QCursor, QPainter, QPainterPath, QPen, QPixmap
from PyQt5.QtWidgets import QFrame, QGraphicsScene


# ------------------------------------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------------------------------------------
# Antialiasing settings # Antialiasing settings


from patchcanvas import options, ANTIALIASING_FULL from patchcanvas import options, ANTIALIASING_FULL


# ------------------------------------------------------------------------------------------------------------
# Static Variables

iX = 0
iY = 1
iWidth = 2
iHeight = 3

MOUSE_MODE_NONE = 0
MOUSE_MODE_MOVE = 1
MOUSE_MODE_SCALE = 2

# ------------------------------------------------------------------------------------------------------------
# ---------------------------------------------------------------------------------------------------------------------
# Widget Class # Widget Class


class CanvasPreviewFrame(QFrame): class CanvasPreviewFrame(QFrame):
@@ -50,13 +38,30 @@ class CanvasPreviewFrame(QFrame):


# x = 2 # x = 2
# y = 2 # y = 2
# w = width-4
# h = height-3
# w = width - 4
# h = height - 3
# bounds -1 px # bounds -1 px


kInternalWidth = 210-6 # -4 for width + -1px*2 bounds
kInternalHeight = 162-5 # -3 for height + -1px*2 bounds
kInternalRatio = kInternalWidth / kInternalHeight
_kRectX = 0
_kRectY = 1
_kRectWidth = 2
_kRectHeight = 3

_kCursorName = 0
_kCursorZoom = 1
_kCursorZoomIn = 2
_kCursorZoomOut = 3
_kCursorZoomCount = 4

_MOUSE_MODE_NONE = 0
_MOUSE_MODE_MOVE = 1
_MOUSE_MODE_SCALE = 2

_RUBBERBAND_BLENDING_DEFAULT = 0
_RUBBERBAND_BLENDING_PLUS = 1
_RUBBERBAND_BLENDING_DIFF = 2

# -----------------------------------------------------------------------------------------------------------------


def __init__(self, parent): def __init__(self, parent):
QFrame.__init__(self, parent) QFrame.__init__(self, parent)
@@ -66,6 +71,9 @@ class CanvasPreviewFrame(QFrame):
#self.setMaximumHeight(162) #self.setMaximumHeight(162)


self.fRealParent = None self.fRealParent = None
self.fInternalWidth = 210-6 # -4 for width + -1px*2 bounds
self.fInternalHeight = 162-5 # -3 for height + -1px*2 bounds
self.fInternalRatio = self.fInternalWidth / self.fInternalHeight


self.fScene = None self.fScene = None
self.fRenderSource = QRectF(0.0, 0.0, 0.0, 0.0) self.fRenderSource = QRectF(0.0, 0.0, 0.0, 0.0)
@@ -82,39 +90,41 @@ class CanvasPreviewFrame(QFrame):
self.fViewPen = QPen(Qt.blue, 1) self.fViewPen = QPen(Qt.blue, 1)
self.fViewRect = [3.0, 3.0, 10.0, 10.0] self.fViewRect = [3.0, 3.0, 10.0, 10.0]


self.fMouseMode = MOUSE_MODE_NONE
self.fMouseMode = self._MOUSE_MODE_NONE
self.fMouseLeftDown = False self.fMouseLeftDown = False
self.fMouseRightDown = False self.fMouseRightDown = False
self.fMousePos = None
self.fMouseInitialZoomPos = None

self.fRubberBandBlending = self._RUBBERBAND_BLENDING_DEFAULT

self.fZoomCursors = [None for _ in range(self._kCursorZoomCount)]
self.fZoomCursors[self._kCursorName] = "black"
self.fZoomCursors[self._kCursorZoom] = QCursor(QPixmap(":/cursors/zoom_black.png"), 8, 7)
self.fZoomCursors[self._kCursorZoomIn] = QCursor(QPixmap(":/cursors/zoom-in_black.png"), 8, 7)
self.fZoomCursors[self._kCursorZoomOut] = QCursor(QPixmap(":/cursors/zoom-out_black.png"), 8, 7)


def init(self, scene, realWidth, realHeight, useCustomPaint = False):
realWidth,realHeight = float(realWidth),float(realHeight)
def init(self, scene: QGraphicsScene, realWidth: float, realHeight: float, useCustomPaint: bool = False):
# realWidth, realHeight = float(realWidth), float(realHeight)
self.fScene = scene self.fScene = scene
self.fRenderSource = QRectF(0.0, 0.0, realWidth, realHeight) self.fRenderSource = QRectF(0.0, 0.0, realWidth, realHeight)
self.kInternalRatio = realWidth / realHeight
self.updateStyle()
self.fInternalRatio = realWidth / realHeight
self._updateStyle()


if self.fUseCustomPaint != useCustomPaint: if self.fUseCustomPaint != useCustomPaint:
self.fUseCustomPaint = useCustomPaint self.fUseCustomPaint = useCustomPaint
self.repaint() self.repaint()


def updateStyle(self):
self.fFrameWidth = 1 if self.fUseCustomPaint else self.frameWidth()

def changeEvent(self, event):
if event.type() in (QEvent.StyleChange, QEvent.PaletteChange):
self.updateStyle()
QWidget.changeEvent(self, event)

def setRealParent(self, parent): def setRealParent(self, parent):
self.fRealParent = parent self.fRealParent = parent


# -----------------------------------------------------------------------------------------------------------------

def setViewPosX(self, xp): def setViewPosX(self, xp):
self.fViewRect[iX] = xp * (self.kInternalWidth - self.fViewRect[iWidth]/self.fScale)
self.fViewRect[self._kRectX] = xp * (self.fInternalWidth - self.fViewRect[self._kRectWidth]/self.fScale)
self.update() self.update()


def setViewPosY(self, yp): def setViewPosY(self, yp):
self.fViewRect[iY] = yp * (self.kInternalHeight - self.fViewRect[iHeight]/self.fScale)
self.fViewRect[self._kRectY] = yp * (self.fInternalHeight - self.fViewRect[self._kRectHeight]/self.fScale)
self.update() self.update()


def setViewScale(self, scale): def setViewScale(self, scale):
@@ -124,126 +134,108 @@ class CanvasPreviewFrame(QFrame):
QTimer.singleShot(0, self.fRealParent.slot_miniCanvasCheckAll) QTimer.singleShot(0, self.fRealParent.slot_miniCanvasCheckAll)


def setViewSize(self, width, height): def setViewSize(self, width, height):
self.fViewRect[iWidth] = width * self.kInternalWidth
self.fViewRect[iHeight] = height * self.kInternalHeight
self.fViewRect[self._kRectWidth] = width * self.fInternalWidth
self.fViewRect[self._kRectHeight] = height * self.fInternalHeight
self.update() self.update()


def setViewTheme(self, bgColor, brushColor, penColor): def setViewTheme(self, bgColor, brushColor, penColor):
bg_black = bgColor.blackF()
brush_black = brushColor.blackF()
r0,g0,b0,a = bgColor.getRgb()
r1,g1,b1,a = brushColor.getRgb()
bg_black = bgColor.blackF()
brush_black = brushColor.blackF()
r0, g0, b0, _ = bgColor.getRgb()
r1, g1, b1, _ = brushColor.getRgb()

if brush_black < bg_black: if brush_black < bg_black:
self.fRubberBandBlending = 1
self.fRubberBandBlending = self._RUBBERBAND_BLENDING_PLUS
brushColor = QColor(r1-r0, g1-g0, b1-b0, 40) brushColor = QColor(r1-r0, g1-g0, b1-b0, 40)
elif bg_black < brush_black: elif bg_black < brush_black:
self.fRubberBandBlending = -1
self.fRubberBandBlending = self._RUBBERBAND_BLENDING_DIFF
brushColor = QColor(r0-r1, g0-g1, b0-b1, 40) brushColor = QColor(r0-r1, g0-g1, b0-b1, 40)
else: else:
bgColor.setAlpha(40) bgColor.setAlpha(40)
self.fRubberBandBlending = 0
self.fRubberBandBlending = self._RUBBERBAND_BLENDING_DEFAULT

penColor.setAlpha(100) penColor.setAlpha(100)
self.fViewBg = bgColor self.fViewBg = bgColor
self.fViewBrush = QBrush(brushColor) self.fViewBrush = QBrush(brushColor)
self.fViewPen = QPen(penColor, 1) self.fViewPen = QPen(penColor, 1)


cur_color = "black" if bg_black < 0.5 else "white"
self.fScaleCursors = ( QCursor(QPixmap(":/cursors/zoom-generic-"+cur_color+".png"), 8, 7),
QCursor(QPixmap(":/cursors/zoom-in-"+cur_color+".png"), 8, 7),
QCursor(QPixmap(":/cursors/zoom-out-"+cur_color+".png"), 8, 7) )

def moveViewRect(self, x, y):
x = float(x) - self.fInitialX
y = float(y) - self.fInitialY

fixPos = False
rCentX = self.fViewRect[iWidth] / self.fScale / 2
rCentY = self.fViewRect[iHeight] / self.fScale / 2
if x < rCentX:
x = rCentX
fixPos = True
elif x > self.kInternalWidth - rCentX:
x = self.kInternalWidth - rCentX
fixPos = True

if y < rCentY:
y = rCentY
fixPos = True
elif y > self.kInternalHeight - rCentY:
y = self.kInternalHeight - rCentY
fixPos = True

if fixPos:
globalPos = self.mapToGlobal(QPoint(self.fInitialX + x, self.fInitialY + y))
self.cursor().setPos(globalPos)
cursorName = "black" if bg_black < 0.5 else "white"
if self.fZoomCursors[self._kCursorName] != cursorName:
prefix = ":/cursors/zoom"
self.fZoomCursors[self._kCursorName] = cursorName
self.fZoomCursors[self._kCursorZoom] = QCursor(QPixmap("{}_{}.png".format(prefix, cursorName)), 8, 7)
self.fZoomCursors[self._kCursorZoomIn] = QCursor(QPixmap("{}-in_{}.png".format(prefix, cursorName)), 8, 7)
self.fZoomCursors[self._kCursorZoomOut] = QCursor(QPixmap("{}-out_{}.png".format(prefix, cursorName)), 8, 7)


x = self.fRenderSource.width() * x / self.kInternalWidth
y = self.fRenderSource.height() * y / self.kInternalHeight
self.fScene.m_view.centerOn(x, y)
# -----------------------------------------------------------------------------------------------------------------


def updateMouseMode(self, event=None):
if self.fMouseLeftDown and self.fMouseRightDown:
self.fMousePos = event.globalPos()
self.setCursor(self.fScaleCursors[0])
self.fMouseMode = MOUSE_MODE_SCALE
elif self.fMouseLeftDown:
self.setCursor(QCursor(Qt.SizeAllCursor))
if self.fMouseMode == MOUSE_MODE_NONE:
self.moveViewRect(event.x(), event.y())
self.fMouseMode = MOUSE_MODE_MOVE
else:
self.unsetCursor()
self.fMouseMode = MOUSE_MODE_NONE
def changeEvent(self, event):
if event.type() in (QEvent.StyleChange, QEvent.PaletteChange):
self._updateStyle()
QFrame.changeEvent(self, event)


def mousePressEvent(self, event): def mousePressEvent(self, event):
if event.button() == Qt.LeftButton: if event.button() == Qt.LeftButton:
event.accept()
self.fMouseLeftDown = True self.fMouseLeftDown = True
self.updateMouseMode(event)
return event.accept()
elif event.button() == Qt.RightButton:
self._updateMouseMode(event)
return
if event.button() == Qt.RightButton:
event.accept()
self.fMouseRightDown = True self.fMouseRightDown = True
self.updateMouseMode(event)
return event.accept()
elif event.button() == Qt.MidButton:
self._updateMouseMode(event)
return
if event.button() == Qt.MidButton:
event.accept()
self.fMouseLeftDown = True self.fMouseLeftDown = True
self.fMouseRightDown = True self.fMouseRightDown = True
self.updateMouseMode(event)
return event.accept()
self._updateMouseMode(event)
return
QFrame.mouseMoveEvent(self, event) QFrame.mouseMoveEvent(self, event)


def mouseMoveEvent(self, event): def mouseMoveEvent(self, event):
if self.fMouseMode == MOUSE_MODE_MOVE:
self.moveViewRect(event.x(), event.y())
return event.accept()
if self.fMouseMode == MOUSE_MODE_SCALE:
dy = self.fMousePos.y() - event.globalY()
if dy != 0:
self.setCursor(self.fScaleCursors[1 if dy > 0 else 2])
self.fScene.zoom_wheel(dy)
self.cursor().setPos(self.fMousePos)
if self.fMouseMode == self._MOUSE_MODE_MOVE:
event.accept()
self._moveViewRect(event.x(), event.y())
return
if self.fMouseMode == self._MOUSE_MODE_SCALE:
event.accept()
self._scaleViewRect(event.globalY())
return
QFrame.mouseMoveEvent(self, event) QFrame.mouseMoveEvent(self, event)


def mouseReleaseEvent(self, event): def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton: if event.button() == Qt.LeftButton:
event.accept()
self.fMouseLeftDown = False self.fMouseLeftDown = False
self.updateMouseMode()
return event.accept()
elif event.button() == Qt.RightButton:
self._updateMouseMode()
return
if event.button() == Qt.RightButton:
event.accept()
self.fMouseRightDown = False self.fMouseRightDown = False
self.updateMouseMode(event)
return event.accept()
elif event.button() == Qt.MidButton:
self._updateMouseMode(event)
return
if event.button() == Qt.MidButton:
event.accept()
self.fMouseLeftDown = event.buttons() & Qt.LeftButton self.fMouseLeftDown = event.buttons() & Qt.LeftButton
self.fMouseRightDown = event.buttons() & Qt.RightButton self.fMouseRightDown = event.buttons() & Qt.RightButton
self.updateMouseMode(event)
return event.accept()
self._updateMouseMode(event)
return
QFrame.mouseReleaseEvent(self, event) QFrame.mouseReleaseEvent(self, event)


def wheelEvent(self, event): def wheelEvent(self, event):
if self.fScene is None:
QFrame.wheelEvent(self, event)
return

event.accept()
self.fScene.zoom_wheel(event.angleDelta().y()) self.fScene.zoom_wheel(event.angleDelta().y())
return event.accept()


def paintEvent(self, event): def paintEvent(self, event):
if self.fScene is None:
QFrame.paintEvent(self, event)
return

painter = QPainter(self) painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing, bool(options.antialiasing == ANTIALIASING_FULL)) painter.setRenderHint(QPainter.Antialiasing, bool(options.antialiasing == ANTIALIASING_FULL))


@@ -251,7 +243,7 @@ class CanvasPreviewFrame(QFrame):
bg_color = self.fViewBg bg_color = self.fViewBg
bg_black = bg_color.black() bg_black = bg_color.black()
bg_shade = -12 if bg_black < 127 else 12 bg_shade = -12 if bg_black < 127 else 12
r,g,b,a = bg_color.getRgb()
r,g,b,_ = bg_color.getRgb()
bg_color = QColor(r+bg_shade, g+bg_shade, b+bg_shade) bg_color = QColor(r+bg_shade, g+bg_shade, b+bg_shade)


frameWidth = self.fFrameWidth frameWidth = self.fFrameWidth
@@ -272,11 +264,17 @@ class CanvasPreviewFrame(QFrame):
rounding = 0.5 * use_rounding rounding = 0.5 * use_rounding
painter.setBrush(bg_color) painter.setBrush(bg_color)
painter.setPen(bg_color) painter.setPen(bg_color)
painter.drawRoundedRect(QRectF(0.5+frameWidth, 0.5+frameWidth, self.width()-1-frameWidth*2, self.height()-1-frameWidth*2), rounding, rounding)
painter.drawRoundedRect(QRectF(0.5+frameWidth,
0.5+frameWidth,
self.width()-1-frameWidth*2,
self.height()-1-frameWidth*2), rounding, rounding)


clipPath = QPainterPath() clipPath = QPainterPath()
rounding = 1.0 * use_rounding rounding = 1.0 * use_rounding
clipPath.addRoundedRect(QRectF(frameWidth, frameWidth, self.width()-frameWidth*2, self.height()-frameWidth*2), rounding, rounding)
clipPath.addRoundedRect(QRectF(frameWidth,
frameWidth,
self.width()-frameWidth*2,
self.height()-frameWidth*2), rounding, rounding)
painter.setClipPath(clipPath) painter.setClipPath(clipPath)


self.fScene.render(painter, self.fRenderTarget, self.fRenderSource, Qt.KeepAspectRatio) self.fScene.render(painter, self.fRenderTarget, self.fRenderSource, Qt.KeepAspectRatio)
@@ -284,13 +282,13 @@ class CanvasPreviewFrame(QFrame):
# Allow cursor frame to look joined with minicanvas frame # Allow cursor frame to look joined with minicanvas frame
painter.setClipping(False) painter.setClipping(False)


width = self.fViewRect[iWidth]/self.fScale
height = self.fViewRect[iHeight]/self.fScale
width = self.fViewRect[self._kRectWidth]/self.fScale
height = self.fViewRect[self._kRectHeight]/self.fScale


# cursor # cursor
lineHinting = self.fViewPen.widthF() / 2 lineHinting = self.fViewPen.widthF() / 2
x = self.fViewRect[iX]+self.fInitialX
y = self.fViewRect[iY]+self.fInitialY
x = self.fViewRect[self._kRectX]+self.fInitialX
y = self.fViewRect[self._kRectY]+self.fInitialY
scr_x = floor(x) scr_x = floor(x)
scr_y = floor(y) scr_y = floor(y)
rect = QRectF( rect = QRectF(
@@ -299,10 +297,11 @@ class CanvasPreviewFrame(QFrame):
ceil(width+x-scr_x)-lineHinting*2, ceil(width+x-scr_x)-lineHinting*2,
ceil(height+y-scr_y)-lineHinting*2 ) ceil(height+y-scr_y)-lineHinting*2 )


if self.fRubberBandBlending == 1:
if self.fRubberBandBlending == self._RUBBERBAND_BLENDING_PLUS:
painter.setCompositionMode(QPainter.CompositionMode_Plus) painter.setCompositionMode(QPainter.CompositionMode_Plus)
elif self.fRubberBandBlending == -1:
elif self.fRubberBandBlending == self._RUBBERBAND_BLENDING_DIFF:
painter.setCompositionMode(QPainter.CompositionMode_Difference) painter.setCompositionMode(QPainter.CompositionMode_Difference)

painter.setBrush(self.fViewBrush) painter.setBrush(self.fViewBrush)
painter.setPen(Qt.NoPen) painter.setPen(Qt.NoPen)
painter.drawRect(rect) painter.drawRect(rect)
@@ -322,20 +321,105 @@ class CanvasPreviewFrame(QFrame):
width = size.width() width = size.width()
height = size.height() height = size.height()
extRatio = (width - self.fFrameWidth * 2) / (height - self.fFrameWidth * 2) extRatio = (width - self.fFrameWidth * 2) / (height - self.fFrameWidth * 2)
if extRatio >= self.kInternalRatio:
self.kInternalHeight = floor(height - self.fFrameWidth * 2)
self.kInternalWidth = floor(self.kInternalHeight * self.kInternalRatio)
self.fInitialX = floor(float(width - self.kInternalWidth) / 2.0)
if extRatio >= self.fInternalRatio:
self.fInternalHeight = floor(height - self.fFrameWidth * 2)
self.fInternalWidth = floor(self.fInternalHeight * self.fInternalRatio)
self.fInitialX = floor(float(width - self.fInternalWidth) / 2.0)
self.fInitialY = self.fFrameWidth self.fInitialY = self.fFrameWidth
else: else:
self.kInternalWidth = floor(width - self.fFrameWidth * 2)
self.kInternalHeight = floor(self.kInternalWidth / self.kInternalRatio)
self.fInternalWidth = floor(width - self.fFrameWidth * 2)
self.fInternalHeight = floor(self.fInternalWidth / self.fInternalRatio)
self.fInitialX = self.fFrameWidth self.fInitialX = self.fFrameWidth
self.fInitialY = floor(float(height - self.kInternalHeight) / 2.0)
self.fInitialY = floor(float(height - self.fInternalHeight) / 2.0)


self.fRenderTarget = QRectF(self.fInitialX, self.fInitialY, float(self.kInternalWidth), float(self.kInternalHeight))
self.fRenderTarget = QRectF(self.fInitialX,
self.fInitialY,
float(self.fInternalWidth),
float(self.fInternalHeight))


if self.fRealParent is not None: if self.fRealParent is not None:
QTimer.singleShot(0, self.fRealParent.slot_miniCanvasCheckAll) QTimer.singleShot(0, self.fRealParent.slot_miniCanvasCheckAll)


QFrame.resizeEvent(self, event) QFrame.resizeEvent(self, event)

# -----------------------------------------------------------------------------------------------------------------

def _moveViewRect(self, x: float, y: float):
if self.fScene is None:
return

x -= self.fInitialX
y -= self.fInitialY

fixPos = False
rCentX = self.fViewRect[self._kRectWidth] / self.fScale / 2
rCentY = self.fViewRect[self._kRectHeight] / self.fScale / 2
if x < rCentX:
x = rCentX
fixPos = True
elif x > self.fInternalWidth - rCentX:
x = self.fInternalWidth - rCentX
fixPos = True

if y < rCentY:
y = rCentY
fixPos = True
elif y > self.fInternalHeight - rCentY:
y = self.fInternalHeight - rCentY
fixPos = True

if fixPos:
globalPos = self.mapToGlobal(QPoint(self.fInitialX + x, self.fInitialY + y))
self.cursor().setPos(globalPos)

x = self.fRenderSource.width() * x / self.fInternalWidth
y = self.fRenderSource.height() * y / self.fInternalHeight
self.fScene.m_view.centerOn(x, y)

def _scaleViewRect(self, globalY: int):
if self.fScene is None:
return

dy = self.fMouseInitialZoomPos.y() - globalY
if dy != 0:
self.setCursor(self.fZoomCursors[self._kCursorZoomIn if dy > 0 else self._kCursorZoomOut])
self.fScene.zoom_wheel(dy)

self.cursor().setPos(self.fMouseInitialZoomPos)

def _updateMouseMode(self, event=None):
if self.fMouseLeftDown and self.fMouseRightDown:
self.fMouseInitialZoomPos = event.globalPos()
self.setCursor(self.fZoomCursors[self._kCursorZoom])
self.fMouseMode = self._MOUSE_MODE_SCALE

elif self.fMouseLeftDown:
self.setCursor(QCursor(Qt.SizeAllCursor))
if self.fMouseMode == self._MOUSE_MODE_NONE:
self._moveViewRect(event.x(), event.y())
self.fMouseMode = self._MOUSE_MODE_MOVE

else:
self.unsetCursor()
self.fMouseMode = self._MOUSE_MODE_NONE

def _updateStyle(self):
self.fFrameWidth = 1 if self.fUseCustomPaint else self.frameWidth()

# ---------------------------------------------------------------------------------------------------------------------

if __name__ == '__main__':
# pylint: disable=unused-import
# pylint: disable=ungrouped-imports
import sys
import resources_rc
from PyQt5.QtWidgets import QApplication
# pylint: enable=unused-import
# pylint: enable=ungrouped-imports

app = QApplication(sys.argv)

gui = CanvasPreviewFrame(None)
gui.show()

sys.exit(app.exec_())

Loading…
Cancel
Save