eric6/Snapshot/SnapshotRegionGrabber.py

changeset 8143
2c730d5fd177
parent 7966
3afa7b9e51b0
child 8218
7c09585bd960
equal deleted inserted replaced
8141:27f636beebad 8143:2c730d5fd177
29 clip = QRegion(rect) 29 clip = QRegion(rect)
30 clip = clip.subtracted(QRegion(rect.adjusted(1, 1, -1, -1))) 30 clip = clip.subtracted(QRegion(rect.adjusted(1, 1, -1, -1)))
31 31
32 painter.save() 32 painter.save()
33 painter.setClipRegion(clip) 33 painter.setClipRegion(clip)
34 painter.setPen(Qt.NoPen) 34 painter.setPen(Qt.PenStyle.NoPen)
35 painter.setBrush(outline) 35 painter.setBrush(outline)
36 painter.drawRect(rect) 36 painter.drawRect(rect)
37 if fill is not None and fill.isValid(): 37 if fill is not None and fill.isValid():
38 painter.setClipping(False) 38 painter.setClipping(False)
39 painter.setBrush(fill) 39 painter.setBrush(fill)
64 @exception ValueError raised to indicate a bad value for the 'mode' 64 @exception ValueError raised to indicate a bad value for the 'mode'
65 parameter 65 parameter
66 """ 66 """
67 super(SnapshotRegionGrabber, self).__init__( 67 super(SnapshotRegionGrabber, self).__init__(
68 None, 68 None,
69 Qt.X11BypassWindowManagerHint | Qt.WindowStaysOnTopHint | 69 Qt.WindowType.X11BypassWindowManagerHint |
70 Qt.FramelessWindowHint | Qt.Tool) 70 Qt.WindowType.WindowStaysOnTopHint |
71 Qt.WindowType.FramelessWindowHint |
72 Qt.WindowType.Tool
73 )
71 74
72 if mode not in [SnapshotRegionGrabber.Rectangle, 75 if mode not in [SnapshotRegionGrabber.Rectangle,
73 SnapshotRegionGrabber.Ellipse]: 76 SnapshotRegionGrabber.Ellipse]:
74 raise ValueError("Bad value for 'mode' parameter.") 77 raise ValueError("Bad value for 'mode' parameter.")
75 self.__mode = mode 78 self.__mode = mode
128 geom = screen.availableVirtualGeometry() 131 geom = screen.availableVirtualGeometry()
129 self.__pixmap = screen.grabWindow( 132 self.__pixmap = screen.grabWindow(
130 0, geom.x(), geom.y(), geom.width(), geom.height()) 133 0, geom.x(), geom.y(), geom.width(), geom.height())
131 self.resize(self.__pixmap.size()) 134 self.resize(self.__pixmap.size())
132 self.move(geom.x(), geom.y()) 135 self.move(geom.x(), geom.y())
133 self.setCursor(Qt.CrossCursor) 136 self.setCursor(Qt.CursorShape.CrossCursor)
134 self.show() 137 self.show()
135 138
136 self.grabMouse() 139 self.grabMouse()
137 self.grabKeyboard() 140 self.grabKeyboard()
138 self.activateWindow() 141 self.activateWindow()
148 151
149 painter = QPainter(self) 152 painter = QPainter(self)
150 pal = QPalette(QToolTip.palette()) 153 pal = QPalette(QToolTip.palette())
151 font = QToolTip.font() 154 font = QToolTip.font()
152 155
153 handleColor = pal.color(QPalette.Active, QPalette.Highlight) 156 handleColor = pal.color(QPalette.ColorGroup.Active,
157 QPalette.ColorRole.Highlight)
154 handleColor.setAlpha(160) 158 handleColor.setAlpha(160)
155 overlayColor = QColor(0, 0, 0, 160) 159 overlayColor = QColor(0, 0, 0, 160)
156 textColor = pal.color(QPalette.Active, QPalette.Text) 160 textColor = pal.color(QPalette.ColorGroup.Active,
157 textBackgroundColor = pal.color(QPalette.Active, QPalette.Base) 161 QPalette.ColorRole.Text)
162 textBackgroundColor = pal.color(QPalette.ColorGroup.Active,
163 QPalette.ColorRole.Base)
158 painter.drawPixmap(0, 0, self.__pixmap) 164 painter.drawPixmap(0, 0, self.__pixmap)
159 painter.setFont(font) 165 painter.setFont(font)
160 166
161 r = QRect(self.__selection) 167 r = QRect(self.__selection)
162 if not self.__selection.isNull(): 168 if not self.__selection.isNull():
163 grey = QRegion(self.rect()) 169 grey = QRegion(self.rect())
164 if self.__mode == SnapshotRegionGrabber.Ellipse: 170 if self.__mode == SnapshotRegionGrabber.Ellipse:
165 reg = QRegion(r, QRegion.Ellipse) 171 reg = QRegion(r, QRegion.RegionType.Ellipse)
166 else: 172 else:
167 reg = QRegion(r) 173 reg = QRegion(r)
168 grey = grey.subtracted(reg) 174 grey = grey.subtracted(reg)
169 painter.setClipRegion(grey) 175 painter.setClipRegion(grey)
170 painter.setPen(Qt.NoPen) 176 painter.setPen(Qt.PenStyle.NoPen)
171 painter.setBrush(overlayColor) 177 painter.setBrush(overlayColor)
172 painter.drawRect(self.rect()) 178 painter.drawRect(self.rect())
173 painter.setClipRect(self.rect()) 179 painter.setClipRect(self.rect())
174 drawRect(painter, r, handleColor) 180 drawRect(painter, r, handleColor)
175 181
176 if self.__showHelp: 182 if self.__showHelp:
177 painter.setPen(textColor) 183 painter.setPen(textColor)
178 painter.setBrush(textBackgroundColor) 184 painter.setBrush(textBackgroundColor)
179 self.__helpTextRect = painter.boundingRect( 185 self.__helpTextRect = painter.boundingRect(
180 self.rect().adjusted(2, 2, -2, -2), 186 self.rect().adjusted(2, 2, -2, -2),
181 Qt.TextWordWrap, self.__helpText).translated(0, 0) 187 Qt.TextFlag.TextWordWrap, self.__helpText).translated(0, 0)
182 self.__helpTextRect.adjust(-2, -2, 4, 2) 188 self.__helpTextRect.adjust(-2, -2, 4, 2)
183 drawRect(painter, self.__helpTextRect, textColor, 189 drawRect(painter, self.__helpTextRect, textColor,
184 textBackgroundColor) 190 textBackgroundColor)
185 painter.drawText( 191 painter.drawText(
186 self.__helpTextRect.adjusted(3, 3, -3, -3), 192 self.__helpTextRect.adjusted(3, 3, -3, -3),
187 Qt.TextWordWrap, self.__helpText) 193 Qt.TextFlag.TextWordWrap, self.__helpText)
188 194
189 if self.__selection.isNull(): 195 if self.__selection.isNull():
190 return 196 return
191 197
192 # The grabbed region is everything which is covered by the drawn 198 # The grabbed region is everything which is covered by the drawn
196 self.__locale.toString(self.__selection.x()), 202 self.__locale.toString(self.__selection.x()),
197 self.__locale.toString(self.__selection.y()), 203 self.__locale.toString(self.__selection.y()),
198 self.__locale.toString(self.__selection.width()), 204 self.__locale.toString(self.__selection.width()),
199 self.__locale.toString(self.__selection.height()) 205 self.__locale.toString(self.__selection.height())
200 ) 206 )
201 textRect = painter.boundingRect(self.rect(), Qt.AlignLeft, txt) 207 textRect = painter.boundingRect(self.rect(),
208 Qt.AlignmentFlag.AlignLeft, txt)
202 boundingRect = textRect.adjusted(-4, 0, 0, 0) 209 boundingRect = textRect.adjusted(-4, 0, 0, 0)
203 210
204 if ( 211 if (
205 textRect.width() < r.width() - 2 * self.__handleSize and 212 textRect.width() < r.width() - 2 * self.__handleSize and
206 textRect.height() < r.height() - 2 * self.__handleSize and 213 textRect.height() < r.height() - 2 * self.__handleSize and
234 textRect.moveBottomLeft(QPoint(r.right() + 5, r.bottom())) 241 textRect.moveBottomLeft(QPoint(r.right() + 5, r.bottom()))
235 242
236 # If the above didn't catch it, you are running on a very 243 # If the above didn't catch it, you are running on a very
237 # tiny screen... 244 # tiny screen...
238 drawRect(painter, boundingRect, textColor, textBackgroundColor) 245 drawRect(painter, boundingRect, textColor, textBackgroundColor)
239 painter.drawText(textRect, Qt.AlignHCenter, txt) 246 painter.drawText(textRect, Qt.AlignmentFlag.AlignHCenter, txt)
240 247
241 if ( 248 if (
242 (r.height() > self.__handleSize * 2 and 249 (r.height() > self.__handleSize * 2 and
243 r.width() > self.__handleSize * 2) or 250 r.width() > self.__handleSize * 2) or
244 not self.__mouseDown 251 not self.__mouseDown
245 ): 252 ):
246 self.__updateHandles() 253 self.__updateHandles()
247 painter.setPen(Qt.NoPen) 254 painter.setPen(Qt.PenStyle.NoPen)
248 painter.setBrush(handleColor) 255 painter.setBrush(handleColor)
249 painter.setClipRegion( 256 painter.setClipRegion(
250 self.__handleMask(SnapshotRegionGrabber.StrokeMask)) 257 self.__handleMask(SnapshotRegionGrabber.StrokeMask))
251 painter.drawRect(self.rect()) 258 painter.drawRect(self.rect())
252 handleColor.setAlpha(60) 259 handleColor.setAlpha(60)
278 Protected method to handle mouse button presses. 285 Protected method to handle mouse button presses.
279 286
280 @param evt mouse press event (QMouseEvent) 287 @param evt mouse press event (QMouseEvent)
281 """ 288 """
282 self.__showHelp = not self.__helpTextRect.contains(evt.pos()) 289 self.__showHelp = not self.__helpTextRect.contains(evt.pos())
283 if evt.button() == Qt.LeftButton: 290 if evt.button() == Qt.MouseButton.LeftButton:
284 self.__mouseDown = True 291 self.__mouseDown = True
285 self.__dragStartPoint = evt.pos() 292 self.__dragStartPoint = evt.pos()
286 self.__selectionBeforeDrag = QRect(self.__selection) 293 self.__selectionBeforeDrag = QRect(self.__selection)
287 if not self.__selection.contains(evt.pos()): 294 if not self.__selection.contains(evt.pos()):
288 self.__newSelection = True 295 self.__newSelection = True
289 self.__selection = QRect() 296 self.__selection = QRect()
290 else: 297 else:
291 self.setCursor(Qt.ClosedHandCursor) 298 self.setCursor(Qt.CursorShape.ClosedHandCursor)
292 elif evt.button() == Qt.RightButton: 299 elif evt.button() == Qt.MouseButton.RightButton:
293 self.__newSelection = False 300 self.__newSelection = False
294 self.__selection = QRect() 301 self.__selection = QRect()
295 self.setCursor(Qt.CrossCursor) 302 self.setCursor(Qt.CursorShape.CrossCursor)
296 self.update() 303 self.update()
297 304
298 def mouseMoveEvent(self, evt): 305 def mouseMoveEvent(self, evt):
299 """ 306 """
300 Protected method to handle mouse movements. 307 Protected method to handle mouse movements.
362 break 369 break
363 370
364 if not found: 371 if not found:
365 self.__mouseOverHandle = None 372 self.__mouseOverHandle = None
366 if self.__selection.contains(evt.pos()): 373 if self.__selection.contains(evt.pos()):
367 self.setCursor(Qt.OpenHandCursor) 374 self.setCursor(Qt.CursorShape.OpenHandCursor)
368 else: 375 else:
369 self.setCursor(Qt.CrossCursor) 376 self.setCursor(Qt.CursorShape.CrossCursor)
370 else: 377 else:
371 if self.__mouseOverHandle in [self.__TLHandle, 378 if self.__mouseOverHandle in [self.__TLHandle,
372 self.__BRHandle]: 379 self.__BRHandle]:
373 self.setCursor(Qt.SizeFDiagCursor) 380 self.setCursor(Qt.CursorShape.SizeFDiagCursor)
374 elif self.__mouseOverHandle in [self.__TRHandle, 381 elif self.__mouseOverHandle in [self.__TRHandle,
375 self.__BLHandle]: 382 self.__BLHandle]:
376 self.setCursor(Qt.SizeBDiagCursor) 383 self.setCursor(Qt.CursorShape.SizeBDiagCursor)
377 elif self.__mouseOverHandle in [self.__LHandle, 384 elif self.__mouseOverHandle in [self.__LHandle,
378 self.__RHandle]: 385 self.__RHandle]:
379 self.setCursor(Qt.SizeHorCursor) 386 self.setCursor(Qt.CursorShape.SizeHorCursor)
380 elif self.__mouseOverHandle in [self.__THandle, 387 elif self.__mouseOverHandle in [self.__THandle,
381 self.__BHandle]: 388 self.__BHandle]:
382 self.setCursor(Qt.SizeVerCursor) 389 self.setCursor(Qt.CursorShape.SizeVerCursor)
383 390
384 def mouseReleaseEvent(self, evt): 391 def mouseReleaseEvent(self, evt):
385 """ 392 """
386 Protected method to handle mouse button releases. 393 Protected method to handle mouse button releases.
387 394
391 self.__newSelection = False 398 self.__newSelection = False
392 if ( 399 if (
393 self.__mouseOverHandle is None and 400 self.__mouseOverHandle is None and
394 self.__selection.contains(evt.pos()) 401 self.__selection.contains(evt.pos())
395 ): 402 ):
396 self.setCursor(Qt.OpenHandCursor) 403 self.setCursor(Qt.CursorShape.OpenHandCursor)
397 self.update() 404 self.update()
398 405
399 def mouseDoubleClickEvent(self, evt): 406 def mouseDoubleClickEvent(self, evt):
400 """ 407 """
401 Protected method to handle mouse double clicks. 408 Protected method to handle mouse double clicks.
408 """ 415 """
409 Protected method to handle key presses. 416 Protected method to handle key presses.
410 417
411 @param evt key press event (QKeyEvent) 418 @param evt key press event (QKeyEvent)
412 """ 419 """
413 if evt.key() == Qt.Key_Escape: 420 if evt.key() == Qt.Key.Key_Escape:
414 self.grabbed.emit(QPixmap()) 421 self.grabbed.emit(QPixmap())
415 elif evt.key() in [Qt.Key_Enter, Qt.Key_Return]: 422 elif evt.key() in [Qt.Key.Key_Enter, Qt.Key.Key_Return]:
416 self.__grabRect() 423 self.__grabRect()
417 else: 424 else:
418 evt.ignore() 425 evt.ignore()
419 426
420 def __updateHandles(self): 427 def __updateHandles(self):
502 def __grabRect(self): 509 def __grabRect(self):
503 """ 510 """
504 Private method to grab the selected rectangle (i.e. do the snapshot). 511 Private method to grab the selected rectangle (i.e. do the snapshot).
505 """ 512 """
506 if self.__mode == SnapshotRegionGrabber.Ellipse: 513 if self.__mode == SnapshotRegionGrabber.Ellipse:
507 ell = QRegion(self.__selection, QRegion.Ellipse) 514 ell = QRegion(self.__selection, QRegion.RegionType.Ellipse)
508 if not ell.isEmpty(): 515 if not ell.isEmpty():
509 self.__grabbing = True 516 self.__grabbing = True
510 517
511 xOffset = self.__pixmap.rect().x() - ell.boundingRect().x() 518 xOffset = self.__pixmap.rect().x() - ell.boundingRect().x()
512 yOffset = self.__pixmap.rect().y() - ell.boundingRect().y() 519 yOffset = self.__pixmap.rect().y() - ell.boundingRect().y()
513 translatedEll = ell.translated(xOffset, yOffset) 520 translatedEll = ell.translated(xOffset, yOffset)
514 521
515 pixmap2 = QPixmap(ell.boundingRect().size()) 522 pixmap2 = QPixmap(ell.boundingRect().size())
516 pixmap2.fill(Qt.transparent) 523 pixmap2.fill(Qt.GlobalColor.transparent)
517 524
518 pt = QPainter() 525 pt = QPainter()
519 pt.begin(pixmap2) 526 pt.begin(pixmap2)
520 if pt.paintEngine().hasFeature(QPaintEngine.PorterDuff): 527 if pt.paintEngine().hasFeature(
528 QPaintEngine.PaintEngineFeature.PorterDuff
529 ):
521 pt.setRenderHints( 530 pt.setRenderHints(
522 QPainter.Antialiasing | 531 QPainter.RenderHint.Antialiasing |
523 QPainter.HighQualityAntialiasing | 532 QPainter.RenderHint.HighQualityAntialiasing |
524 QPainter.SmoothPixmapTransform, 533 QPainter.RenderHint.SmoothPixmapTransform,
525 True) 534 True)
526 pt.setBrush(Qt.black) 535 pt.setBrush(Qt.GlobalColor.black)
527 pt.setPen(QPen(QBrush(Qt.black), 0.5)) 536 pt.setPen(QPen(QBrush(Qt.GlobalColor.black), 0.5))
528 pt.drawEllipse(translatedEll.boundingRect()) 537 pt.drawEllipse(translatedEll.boundingRect())
529 pt.setCompositionMode(QPainter.CompositionMode_SourceIn) 538 pt.setCompositionMode(
539 QPainter.CompositionMode.CompositionMode_SourceIn)
530 else: 540 else:
531 pt.setClipRegion(translatedEll) 541 pt.setClipRegion(translatedEll)
532 pt.setCompositionMode(QPainter.CompositionMode_Source) 542 pt.setCompositionMode(
543 QPainter.CompositionMode.CompositionMode_Source)
533 544
534 pt.drawPixmap(pixmap2.rect(), self.__pixmap, 545 pt.drawPixmap(pixmap2.rect(), self.__pixmap,
535 ell.boundingRect()) 546 ell.boundingRect())
536 pt.end() 547 pt.end()
537 548

eric ide

mercurial