diff --git a/main.py b/main.py index 039fb3f..3064d7c 100644 --- a/main.py +++ b/main.py @@ -78,7 +78,7 @@ class ScreenshotOverlay(QtWidgets.QWidget): self.setCursor(QtGui.QCursor(QtCore.Qt.CursorShape.CrossCursor)) self.start = None self.end = None - self.rect = None + self.selection_rect = None self._bg = self._grab_bg() def _grab_bg(self): @@ -102,39 +102,29 @@ class ScreenshotOverlay(QtWidgets.QWidget): def mouseReleaseEvent(self, event): logger.debug('ScreenshotOverlay: Mouse release event.') self.end = event.pos() - self.rect = QtCore.QRect(self.start, self.end).normalized() - logger.info(f'ScreenshotOverlay: Region selected: {self.rect}') - self.region_selected.emit(self.rect) + self.selection_rect = QtCore.QRect(self.start, self.end).normalized() + logger.info(f'ScreenshotOverlay: Region selected: {self.selection_rect}') + self.region_selected.emit(self.selection_rect) self.close() def paintEvent(self, event): qp = QtGui.QPainter(self) - if not self._bg: - return + if self._bg: + # 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. - 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.setPen(QtCore.Qt.PenStyle.NoPen) - 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): def automation_loop(self):