mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-01 16:34:53 +01:00
Publisher: Fix screenshot widget (#5615)
* fix called super method name * remove fade animation * use paths to draw background * use same opacity for lines * add render hints * minor cleanup
This commit is contained in:
parent
93fb76f359
commit
8729cf023c
1 changed files with 17 additions and 27 deletions
|
|
@ -26,14 +26,6 @@ class ScreenMarquee(QtWidgets.QDialog):
|
||||||
self.setCursor(QtCore.Qt.CrossCursor)
|
self.setCursor(QtCore.Qt.CrossCursor)
|
||||||
self.setMouseTracking(True)
|
self.setMouseTracking(True)
|
||||||
|
|
||||||
fade_anim = QtCore.QVariantAnimation()
|
|
||||||
fade_anim.setStartValue(0)
|
|
||||||
fade_anim.setEndValue(50)
|
|
||||||
fade_anim.setDuration(200)
|
|
||||||
fade_anim.setEasingCurve(QtCore.QEasingCurve.OutCubic)
|
|
||||||
|
|
||||||
fade_anim.valueChanged.connect(self._on_fade_anim)
|
|
||||||
|
|
||||||
app = QtWidgets.QApplication.instance()
|
app = QtWidgets.QApplication.instance()
|
||||||
if hasattr(app, "screenAdded"):
|
if hasattr(app, "screenAdded"):
|
||||||
app.screenAdded.connect(self._on_screen_added)
|
app.screenAdded.connect(self._on_screen_added)
|
||||||
|
|
@ -45,12 +37,10 @@ class ScreenMarquee(QtWidgets.QDialog):
|
||||||
for screen in QtWidgets.QApplication.screens():
|
for screen in QtWidgets.QApplication.screens():
|
||||||
screen.geometryChanged.connect(self._fit_screen_geometry)
|
screen.geometryChanged.connect(self._fit_screen_geometry)
|
||||||
|
|
||||||
self._opacity = fade_anim.startValue()
|
self._opacity = 50
|
||||||
self._click_pos = None
|
self._click_pos = None
|
||||||
self._capture_rect = None
|
self._capture_rect = None
|
||||||
|
|
||||||
self._fade_anim = fade_anim
|
|
||||||
|
|
||||||
def get_captured_pixmap(self):
|
def get_captured_pixmap(self):
|
||||||
if self._capture_rect is None:
|
if self._capture_rect is None:
|
||||||
return QtGui.QPixmap()
|
return QtGui.QPixmap()
|
||||||
|
|
@ -67,28 +57,33 @@ class ScreenMarquee(QtWidgets.QDialog):
|
||||||
click_pos = self.mapFromGlobal(self._click_pos)
|
click_pos = self.mapFromGlobal(self._click_pos)
|
||||||
|
|
||||||
painter = QtGui.QPainter(self)
|
painter = QtGui.QPainter(self)
|
||||||
|
painter.setRenderHints(
|
||||||
|
QtGui.QPainter.Antialiasing
|
||||||
|
| QtGui.QPainter.SmoothPixmapTransform
|
||||||
|
)
|
||||||
|
|
||||||
# Draw background. Aside from aesthetics, this makes the full
|
# Draw background. Aside from aesthetics, this makes the full
|
||||||
# tool region accept mouse events.
|
# tool region accept mouse events.
|
||||||
painter.setBrush(QtGui.QColor(0, 0, 0, self._opacity))
|
painter.setBrush(QtGui.QColor(0, 0, 0, self._opacity))
|
||||||
painter.setPen(QtCore.Qt.NoPen)
|
painter.setPen(QtCore.Qt.NoPen)
|
||||||
painter.drawRect(event.rect())
|
rect = event.rect()
|
||||||
|
fill_path = QtGui.QPainterPath()
|
||||||
|
fill_path.addRect(rect)
|
||||||
|
|
||||||
# Clear the capture area
|
# Clear the capture area
|
||||||
if click_pos is not None:
|
if click_pos is not None:
|
||||||
|
sub_path = QtGui.QPainterPath()
|
||||||
capture_rect = QtCore.QRect(click_pos, mouse_pos)
|
capture_rect = QtCore.QRect(click_pos, mouse_pos)
|
||||||
painter.setCompositionMode(
|
sub_path.addRect(capture_rect)
|
||||||
QtGui.QPainter.CompositionMode_Clear)
|
fill_path = fill_path.subtracted(sub_path)
|
||||||
painter.drawRect(capture_rect)
|
|
||||||
painter.setCompositionMode(
|
|
||||||
QtGui.QPainter.CompositionMode_SourceOver)
|
|
||||||
|
|
||||||
pen_color = QtGui.QColor(255, 255, 255, 64)
|
painter.drawPath(fill_path)
|
||||||
|
|
||||||
|
pen_color = QtGui.QColor(255, 255, 255, self._opacity)
|
||||||
pen = QtGui.QPen(pen_color, 1, QtCore.Qt.DotLine)
|
pen = QtGui.QPen(pen_color, 1, QtCore.Qt.DotLine)
|
||||||
painter.setPen(pen)
|
painter.setPen(pen)
|
||||||
|
|
||||||
# Draw cropping markers at click position
|
# Draw cropping markers at click position
|
||||||
rect = event.rect()
|
|
||||||
if click_pos is not None:
|
if click_pos is not None:
|
||||||
painter.drawLine(
|
painter.drawLine(
|
||||||
rect.left(), click_pos.y(),
|
rect.left(), click_pos.y(),
|
||||||
|
|
@ -108,6 +103,7 @@ class ScreenMarquee(QtWidgets.QDialog):
|
||||||
mouse_pos.x(), rect.top(),
|
mouse_pos.x(), rect.top(),
|
||||||
mouse_pos.x(), rect.bottom()
|
mouse_pos.x(), rect.bottom()
|
||||||
)
|
)
|
||||||
|
painter.end()
|
||||||
|
|
||||||
def mousePressEvent(self, event):
|
def mousePressEvent(self, event):
|
||||||
"""Mouse click event"""
|
"""Mouse click event"""
|
||||||
|
|
@ -138,13 +134,13 @@ class ScreenMarquee(QtWidgets.QDialog):
|
||||||
if event.key() == QtCore.Qt.Key_Escape:
|
if event.key() == QtCore.Qt.Key_Escape:
|
||||||
self._click_pos = None
|
self._click_pos = None
|
||||||
self._capture_rect = None
|
self._capture_rect = None
|
||||||
|
event.accept()
|
||||||
self.close()
|
self.close()
|
||||||
return
|
return
|
||||||
return super(ScreenMarquee, self).mousePressEvent(event)
|
return super(ScreenMarquee, self).keyPressEvent(event)
|
||||||
|
|
||||||
def showEvent(self, event):
|
def showEvent(self, event):
|
||||||
self._fit_screen_geometry()
|
self._fit_screen_geometry()
|
||||||
self._fade_anim.start()
|
|
||||||
|
|
||||||
def _fit_screen_geometry(self):
|
def _fit_screen_geometry(self):
|
||||||
# Compute the union of all screen geometries, and resize to fit.
|
# Compute the union of all screen geometries, and resize to fit.
|
||||||
|
|
@ -153,12 +149,6 @@ class ScreenMarquee(QtWidgets.QDialog):
|
||||||
workspace_rect = workspace_rect.united(screen.geometry())
|
workspace_rect = workspace_rect.united(screen.geometry())
|
||||||
self.setGeometry(workspace_rect)
|
self.setGeometry(workspace_rect)
|
||||||
|
|
||||||
def _on_fade_anim(self):
|
|
||||||
"""Animation callback for opacity."""
|
|
||||||
|
|
||||||
self._opacity = self._fade_anim.currentValue()
|
|
||||||
self.repaint()
|
|
||||||
|
|
||||||
def _on_screen_added(self):
|
def _on_screen_added(self):
|
||||||
for screen in QtGui.QGuiApplication.screens():
|
for screen in QtGui.QGuiApplication.screens():
|
||||||
screen.geometryChanged.connect(self._fit_screen_geometry)
|
screen.geometryChanged.connect(self._fit_screen_geometry)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue