--- 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)