Snapshot/SnapWidget.py

changeset 6926
519145f2ba79
parent 6913
be170600edcd
parent 6921
4783b00711d5
diff -r b5d830bdea12 -r 519145f2ba79 Snapshot/SnapWidget.py
--- a/Snapshot/SnapWidget.py	Fri Apr 05 18:59:36 2019 +0200
+++ b/Snapshot/SnapWidget.py	Fri Apr 05 19:19:43 2019 +0200
@@ -16,8 +16,8 @@
 import os
 
 from PyQt5.QtCore import pyqtSlot, QFile, QFileInfo, QTimer, QPoint, \
-    QMimeData, Qt, QEvent, QRegExp, QLocale, PYQT_VERSION_STR
-from PyQt5.QtGui import QImageWriter, QPixmap, QCursor, QDrag, QKeySequence
+    QMimeData, Qt, QRegExp, QLocale, PYQT_VERSION_STR
+from PyQt5.QtGui import QImageWriter, QPixmap, QDrag, QKeySequence
 from PyQt5.QtWidgets import QWidget, QApplication, QShortcut
 
 from E5Gui import E5FileDialog, E5MessageBox
@@ -27,19 +27,14 @@
 import UI.PixmapCache
 import Preferences
 import Globals
-from Globals import qVersionTuple
+
+from .SnapshotModes import SnapshotModes
 
 
 class SnapWidget(QWidget, Ui_SnapWidget):
     """
     Class implementing the snapshot widget.
     """
-    ModeFullscreen = 0
-    ModeScreen = 1
-    ModeRectangle = 2
-    ModeFreehand = 3
-    ModeEllipse = 4
-    
     def __init__(self, parent=None):
         """
         Constructor
@@ -55,31 +50,49 @@
         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("Select Screen"),
-                                       SnapWidget.ModeScreen)
+        if Globals.isWaylandSession():
+            from .SnapshotWaylandGrabber import SnapshotWaylandGrabber
+            self.__grabber = SnapshotWaylandGrabber(self)
         else:
-            if QApplication.desktop().screenCount() > 1:
-                self.modeCombo.addItem(self.tr("Select 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.decorationsCheckBox.hide()
+            self.mouseCursorCheckBox.hide()
+        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 Globals.qVersionTuple() >= (5, 10, 0):
+                if len(QApplication.screens()) > 1:
+                    self.modeCombo.addItem(self.tr("Select Screen"),
+                                           SnapshotModes.SelectedScreen)
+            else:
+                if QApplication.desktop().screenCount() > 1:
+                    self.modeCombo.addItem(self.tr("Select Screen"),
+                                           SnapshotModes.SelectedScreen)
+        if SnapshotModes.SelectedWindow in supportedModes:
+            self.modeCombo.addItem(self.tr("Select 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)
         
-        self.__delay = int(
-            Preferences.Prefs.settings.value("Snapshot/Delay", 0))
-        self.delaySpin.setValue(self.__delay)
+        delay = int(Preferences.Prefs.settings.value("Snapshot/Delay", 0))
+        self.delaySpin.setValue(delay)
         
         if PYQT_VERSION_STR >= "5.0.0":
             from PyQt5.QtCore import QStandardPaths
@@ -94,25 +107,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 +305,15 @@
         """
         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:
-            desktop = QApplication.desktop()
-            if qVersionTuple() >= (5, 10, 0):
-                screen = QApplication.screenAt(QCursor.pos())
-                geom = screen.geometry()
-            else:
-                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(),
+            self.mouseCursorCheckBox.isChecked(),
+            self.decorationsCheckBox.isChecked(),
+        )
     
     def __redisplay(self):
         """
@@ -445,14 +351,10 @@
         
         @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.__modified = not pixmap.isNull()
         self.__updateCaption()
     
     def __updatePreview(self):
@@ -486,23 +388,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.
@@ -527,9 +412,11 @@
         
         Preferences.Prefs.settings.setValue(
             "Snapshot/Delay", self.delaySpin.value())
-        Preferences.Prefs.settings.setValue(
-            "Snapshot/Mode",
-            self.modeCombo.itemData(self.modeCombo.currentIndex()))
+        modeData = self.modeCombo.itemData(self.modeCombo.currentIndex())
+        if modeData is not None:
+            Preferences.Prefs.settings.setValue(
+                "Snapshot/Mode",
+                modeData.value)
         Preferences.Prefs.settings.setValue(
             "Snapshot/Filename", self.__filename)
         Preferences.Prefs.settings.sync()
@@ -543,3 +430,19 @@
             self.tr("eric6 Snapshot")))
         self.setWindowModified(self.__modified)
         self.pathNameEdit.setText(os.path.dirname(self.__filename))
+    
+    @pyqtSlot(int)
+    def on_modeCombo_currentIndexChanged(self, index):
+        """
+        Private slot handling the selection of a screenshot mode.
+        
+        @param index index of the selection
+        @type int
+        """
+        isWindowMode = False
+        if index >= 0:
+            mode = self.modeCombo.itemData(index)
+            isWindowMode = (mode == SnapshotModes.SelectedWindow)
+        
+        self.decorationsCheckBox.setEnabled(isWindowMode)
+        self.decorationsCheckBox.setChecked(isWindowMode)

eric ide

mercurial