Snapshot/SnapWidget.py

branch
screenshot
changeset 6914
5ae038f273c4
parent 6911
8f4a050c6895
child 6916
76810bef8425
diff -r 03264dcdd83e -r 5ae038f273c4 Snapshot/SnapWidget.py
--- 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()

eric ide

mercurial