Refactor ScreenshotOverlay to improve selection rectangle handling and enhance paintEvent rendering
This commit is contained in:
@@ -78,7 +78,7 @@ class ScreenshotOverlay(QtWidgets.QWidget):
|
|||||||
self.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.CrossCursor))
|
self.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.CrossCursor))
|
||||||
self.start = None
|
self.start = None
|
||||||
self.end = None
|
self.end = None
|
||||||
self.rect = None
|
self.selection_rect = None
|
||||||
self._bg = self._grab_bg()
|
self._bg = self._grab_bg()
|
||||||
|
|
||||||
def _grab_bg(self):
|
def _grab_bg(self):
|
||||||
@@ -102,39 +102,29 @@ class ScreenshotOverlay(QtWidgets.QWidget):
|
|||||||
def mouseReleaseEvent(self, event):
|
def mouseReleaseEvent(self, event):
|
||||||
logger.debug('ScreenshotOverlay: Mouse release event.')
|
logger.debug('ScreenshotOverlay: Mouse release event.')
|
||||||
self.end = event.pos()
|
self.end = event.pos()
|
||||||
self.rect = QtCore.QRect(self.start, self.end).normalized()
|
self.selection_rect = QtCore.QRect(self.start, self.end).normalized()
|
||||||
logger.info(f'ScreenshotOverlay: Region selected: {self.rect}')
|
logger.info(f'ScreenshotOverlay: Region selected: {self.selection_rect}')
|
||||||
self.region_selected.emit(self.rect)
|
self.region_selected.emit(self.selection_rect)
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
def paintEvent(self, event):
|
def paintEvent(self, event):
|
||||||
qp = QtGui.QPainter(self)
|
qp = QtGui.QPainter(self)
|
||||||
if not self._bg:
|
if self._bg:
|
||||||
return
|
# Draw the background screenshot
|
||||||
|
qp.drawPixmap(self.rect(), self._bg)
|
||||||
|
# Draw the semi-transparent dimming overlay
|
||||||
|
qp.setBrush(QtGui.QColor(0, 0, 0, 120))
|
||||||
|
qp.drawRect(self.rect())
|
||||||
|
|
||||||
# Draw the background screenshot first.
|
# If a selection is being made, clear the dimmed area and draw a border
|
||||||
qp.drawPixmap(0, 0, self._bg)
|
if self.start and self.end:
|
||||||
|
selection = QtCore.QRect(self.start, self.end).normalized()
|
||||||
# Prepare a path for the dimmed overlay.
|
# Redraw the original screenshot portion within the selection
|
||||||
dim_path = QtGui.QPainterPath()
|
qp.drawPixmap(selection, self._bg, selection)
|
||||||
dim_path.addRect(QtCore.QRectF(self.geometry()))
|
# Draw the selection border
|
||||||
|
qp.setPen(QtGui.QPen(QtGui.QColor(0, 255, 0), 2))
|
||||||
# If a selection is being made, subtract it from the dimmed path.
|
qp.setBrush(QtCore.Qt.BrushStyle.NoBrush)
|
||||||
if self.start and self.end:
|
qp.drawRect(selection)
|
||||||
selection_rect = QtCore.QRect(self.start, self.end).normalized()
|
|
||||||
selection_path = QtGui.QPainterPath()
|
|
||||||
selection_path.addRect(QtCore.QRectF(selection_rect))
|
|
||||||
dim_path = dim_path.subtracted(selection_path)
|
|
||||||
|
|
||||||
# Draw the border of the selection.
|
|
||||||
qp.setBrush(QtCore.Qt.BrushStyle.NoBrush)
|
|
||||||
qp.setPen(QtGui.QPen(QtGui.QColor(0, 255, 0), 2))
|
|
||||||
qp.drawRect(selection_rect)
|
|
||||||
|
|
||||||
# Fill the dimmed area (the path that excludes the selection).
|
|
||||||
qp.setBrush(QtGui.QColor(0, 0, 0, 120))
|
|
||||||
qp.setPen(QtCore.Qt.PenStyle.NoPen)
|
|
||||||
qp.drawPath(dim_path)
|
|
||||||
|
|
||||||
class MainWindow(QtWidgets.QMainWindow):
|
class MainWindow(QtWidgets.QMainWindow):
|
||||||
def automation_loop(self):
|
def automation_loop(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user