--- a/Snapshot/SnapWidget.py Sun Mar 31 16:22:00 2019 +0200 +++ b/Snapshot/SnapWidget.py Mon Apr 01 19:34:58 2019 +0200 @@ -29,6 +29,8 @@ import Globals from Globals import qVersionTuple +from .SnapshotModes import SnapshotModes + class SnapWidget(QWidget, Ui_SnapWidget): """ @@ -55,24 +57,37 @@ self.copyPreviewButton.setIcon(UI.PixmapCache.getIcon("editCopy.png")) self.setWindowIcon(UI.PixmapCache.getIcon("ericSnap.png")) - self.modeCombo.addItem(self.tr("Fullscreen"), - SnapWidget.ModeFullscreen) - if qVersionTuple() >= (5, 10, 0): - if len(QApplication.screens()) > 1: - self.modeCombo.addItem(self.tr("Current Screen"), - SnapWidget.ModeScreen) - else: - if QApplication.desktop().screenCount() > 1: - self.modeCombo.addItem(self.tr("Current Screen"), - SnapWidget.ModeScreen) - self.modeCombo.addItem(self.tr("Rectangular Selection"), - SnapWidget.ModeRectangle) - self.modeCombo.addItem(self.tr("Elliptical Selection"), - SnapWidget.ModeEllipse) - self.modeCombo.addItem(self.tr("Freehand Selection"), - SnapWidget.ModeFreehand) - self.__mode = int(Preferences.Prefs.settings.value("Snapshot/Mode", 0)) - index = self.modeCombo.findData(self.__mode) + from .SnapshotDefaultGrabber import SnapshotDefaultGrabber + self.__grabber = SnapshotDefaultGrabber(self) + self.__grabber.grabbed.connect(self.__captured) + supportedModes = self.__grabber.supportedModes() + + if SnapshotModes.Fullscreen in supportedModes: + self.modeCombo.addItem(self.tr("Fullscreen"), + SnapshotModes.Fullscreen) + if SnapshotModes.SelectedScreen in supportedModes: + if qVersionTuple() >= (5, 10, 0): + if len(QApplication.screens()) > 1: + self.modeCombo.addItem(self.tr("Selected Screen"), + SnapshotModes.SelectedScreen) + else: + if QApplication.desktop().screenCount() > 1: + self.modeCombo.addItem(self.tr("Selected Screen"), + SnapshotModes.SelectedScreen) + if SnapshotModes.SelectedWindow in supportedModes: + self.modeCombo.addItem(self.tr("Selected Window"), + SnapshotModes.SelectedWindow) + if SnapshotModes.Rectangle in supportedModes: + self.modeCombo.addItem(self.tr("Rectangular Selection"), + SnapshotModes.Rectangle) + if SnapshotModes.Ellipse in supportedModes: + self.modeCombo.addItem(self.tr("Elliptical Selection"), + SnapshotModes.Ellipse) + if SnapshotModes.Freehand in supportedModes: + self.modeCombo.addItem(self.tr("Freehand Selection"), + SnapshotModes.Freehand) + mode = int(Preferences.Prefs.settings.value("Snapshot/Mode", 0)) + index = self.modeCombo.findData(SnapshotModes(mode)) if index == -1: index = 0 self.modeCombo.setCurrentIndex(index) @@ -94,25 +109,16 @@ os.path.join(picturesLocation, self.tr("snapshot") + "1.png")) - self.__grabber = None self.__snapshot = QPixmap() self.__savedPosition = QPoint() self.__modified = False self.__locale = QLocale() - self.__grabberWidget = QWidget(None, Qt.X11BypassWindowManagerHint) - self.__grabberWidget.move(-10000, -10000) - self.__grabberWidget.installEventFilter(self) - self.__initFileFilters() - self.__initShortcuts() self.preview.startDrag.connect(self.__dragSnapshot) - from .SnapshotTimer import SnapshotTimer - self.__grabTimer = SnapshotTimer() - self.__grabTimer.timeout.connect(self.__grabTimerTimeout) self.__updateTimer = QTimer() self.__updateTimer.setSingleShot(True) self.__updateTimer.timeout.connect(self.__updatePreview) @@ -301,113 +307,14 @@ """ Private slot to take a snapshot. """ - self.__mode = self.modeCombo.itemData(self.modeCombo.currentIndex()) self.__delay = self.delaySpin.value() self.__savedPosition = self.pos() self.hide() - if self.__delay: - self.__grabTimer.start(self.__delay) - else: - QTimer.singleShot(200, self.__startUndelayedGrab) - - def __grabTimerTimeout(self): - """ - Private slot to perform a delayed grab operation. - """ - if self.__mode == SnapWidget.ModeRectangle: - self.__grabRectangle() - elif self.__mode == SnapWidget.ModeEllipse: - self.__grabEllipse() - elif self.__mode == SnapWidget.ModeFreehand: - self.__grabFreehand() - else: - self.__performGrab() - - def __startUndelayedGrab(self): - """ - Private slot to perform an undelayed grab operation. - """ - if self.__mode == SnapWidget.ModeRectangle: - self.__grabRectangle() - elif self.__mode == SnapWidget.ModeEllipse: - self.__grabEllipse() - elif self.__mode == SnapWidget.ModeFreehand: - self.__grabFreehand() - else: - if Globals.isMacPlatform(): - self.__performGrab() - else: - self.__grabberWidget.show() - self.__grabberWidget.grabMouse(Qt.CrossCursor) - - def __grabRectangle(self): - """ - Private method to grab a rectangular screen region. - """ - from .SnapshotRegionGrabber import SnapshotRegionGrabber - self.__grabber = SnapshotRegionGrabber( - mode=SnapshotRegionGrabber.Rectangle) - self.__grabber.grabbed.connect(self.__captured) - - def __grabEllipse(self): - """ - Private method to grab an elliptical screen region. - """ - from .SnapshotRegionGrabber import SnapshotRegionGrabber - self.__grabber = SnapshotRegionGrabber( - mode=SnapshotRegionGrabber.Ellipse) - self.__grabber.grabbed.connect(self.__captured) - - def __grabFreehand(self): - """ - Private method to grab a non-rectangular screen region. - """ - from .SnapshotFreehandGrabber import SnapshotFreehandGrabber - self.__grabber = SnapshotFreehandGrabber() - self.__grabber.grabbed.connect(self.__captured) - - def __performGrab(self): - """ - Private method to perform a screen grab other than a selected region. - """ - self.__grabberWidget.releaseMouse() - self.__grabberWidget.hide() - self.__grabTimer.stop() - - if self.__mode == SnapWidget.ModeFullscreen: - desktop = QApplication.desktop() - if qVersionTuple() >= (5, 0, 0): - self.__snapshot = QApplication.screens()[0].grabWindow( - desktop.winId(), desktop.x(), desktop.y(), - desktop.width(), desktop.height()) - else: - self.__snapshot = QPixmap.grabWindow( - desktop.winId(), desktop.x(), desktop.y(), - desktop.width(), desktop.height()) - elif self.__mode == SnapWidget.ModeScreen: - if qVersionTuple() >= (5, 10, 0): - screen = QApplication.screenAt(QCursor.pos()) - geom = screen.geometry() - else: - desktop = QApplication.desktop() - screenId = desktop.screenNumber(QCursor.pos()) - geom = desktop.screenGeometry(screenId) - x = geom.x() - y = geom.y() - if qVersionTuple() >= (5, 0, 0): - self.__snapshot = QApplication.screens()[0].grabWindow( - desktop.winId(), x, y, geom.width(), geom.height()) - else: - self.__snapshot = QPixmap.grabWindow( - desktop.winId(), x, y, geom.width(), geom.height()) - else: - self.__snapshot = QPixmap() - - self.__redisplay() - self.__modified = True - self.__updateCaption() + self.__grabber.grab( + self.modeCombo.itemData(self.modeCombo.currentIndex()), + self.delaySpin.value()) def __redisplay(self): """ @@ -445,12 +352,8 @@ @param pixmap pixmap of the snapshot (QPixmap) """ - self.__grabber.close() self.__snapshot = QPixmap(pixmap) - self.__grabber.grabbed.disconnect(self.__captured) - self.__grabber = None - self.__redisplay() self.__modified = True self.__updateCaption() @@ -486,23 +389,6 @@ drag.setPixmap(self.preview.pixmap()) drag.exec_(Qt.CopyAction) - def eventFilter(self, obj, evt): - """ - Public method to handle event for other objects. - - @param obj reference to the object (QObject) - @param evt reference to the event (QEvent) - @return flag indicating that the event should be filtered out (boolean) - """ - if obj == self.__grabberWidget and \ - evt.type() == QEvent.MouseButtonPress: - if QWidget.mouseGrabber() != self.__grabberWidget: - return False - if evt.button() == Qt.LeftButton: - self.__performGrab() - - return False - def closeEvent(self, evt): """ Protected method handling the close event. @@ -529,7 +415,7 @@ "Snapshot/Delay", self.delaySpin.value()) Preferences.Prefs.settings.setValue( "Snapshot/Mode", - self.modeCombo.itemData(self.modeCombo.currentIndex())) + self.modeCombo.itemData(self.modeCombo.currentIndex()).value) Preferences.Prefs.settings.setValue( "Snapshot/Filename", self.__filename) Preferences.Prefs.settings.sync()