Refactor ScreenshotOverlay to improve selection rectangle handling and enhance paintEvent rendering

This commit is contained in:
2025-07-03 16:36:18 +02:00
parent acfc126bb1
commit 0814c5a66c
+19 -29
View File
@@ -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 background screenshot first. # Draw the semi-transparent dimming overlay
qp.drawPixmap(0, 0, self._bg)
# Prepare a path for the dimmed overlay.
dim_path = QtGui.QPainterPath()
dim_path.addRect(QtCore.QRectF(self.geometry()))
# If a selection is being made, subtract it from the dimmed path.
if self.start and self.end:
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.setBrush(QtGui.QColor(0, 0, 0, 120))
qp.setPen(QtCore.Qt.PenStyle.NoPen) qp.drawRect(self.rect())
qp.drawPath(dim_path)
# If a selection is being made, clear the dimmed area and draw a border
if self.start and self.end:
selection = QtCore.QRect(self.start, self.end).normalized()
# Redraw the original screenshot portion within the selection
qp.drawPixmap(selection, self._bg, selection)
# Draw the selection border
qp.setPen(QtGui.QPen(QtGui.QColor(0, 255, 0), 2))
qp.setBrush(QtCore.Qt.BrushStyle.NoBrush)
qp.drawRect(selection)
class MainWindow(QtWidgets.QMainWindow): class MainWindow(QtWidgets.QMainWindow):
def automation_loop(self): def automation_loop(self):