eric6/E5Gui/E5OverrideCursor.py

changeset 7771
787a6b3f8c9f
child 7774
9eed155411f0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/E5Gui/E5OverrideCursor.py	Sat Oct 10 12:20:51 2020 +0200
@@ -0,0 +1,139 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2020 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a context manager class for an override cursor and a
+QProcess class controlling an override cursor.
+"""
+
+import contextlib
+
+from PyQt5.QtCore import pyqtSlot, Qt, QProcess, QEventLoop
+from PyQt5.QtGui import QCursor, QGuiApplication
+
+
+# TODO: add similar class for QMutexLocker
+class E5OverrideCursor(contextlib.AbstractContextManager):
+    """
+    Class implementing a context manager class for an override cursor.
+    """
+    def __init__(self, cursorShape=Qt.WaitCursor):
+        """
+        Constructor
+        
+        @param cursorShape shape of the override cursor
+        @type Qt.CursorShape
+        """
+        self.__cursorShape = cursorShape
+    
+    def __enter__(self):
+        """
+        Special method called when entering the runtime ccontext.
+        
+        @return reference to the context manager object
+        @rtype E5OverrideCursor
+        """
+        QGuiApplication.setOverrideCursor(QCursor(self.__cursorShape))
+        QGuiApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
+        
+        return self
+    
+    def __exit__(self, exc_type, exc_value, traceback):
+        """
+        Special method called when exiting the runtime ccontext.
+        
+        @param exc_type type of an exception raised in the runtime context
+        @param exc_value value of an exception raised in the runtime context
+        @param traceback traceback of an exception raised in the runtime
+            context
+        @return always returns None to not suppress any exception
+        @rtype None
+        """
+        QGuiApplication.restoreOverrideCursor()
+        QGuiApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
+        
+        return None
+
+
+class E5OverridenCursor(contextlib.AbstractContextManager):
+    """
+    Class implementing a context manager class for an overriden cursor.
+    
+    The cursor is reset upon entering the runtime context and restored
+    upon exiting it.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        self.__cursor = None
+    
+    def __enter__(self):
+        """
+        Special method called when entering the runtime ccontext.
+        
+        @return reference to the context manager object
+        @rtype E5OverrideCursor
+        """
+        self.__cursor = QGuiApplication.overrideCursor()
+        if self.__cursor is not None:
+            QGuiApplication.restoreOverrideCursor()
+            QGuiApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
+        
+        return self
+    
+    def __exit__(self, exc_type, exc_value, traceback):
+        """
+        Special method called when exiting the runtime ccontext.
+        
+        @param exc_type type of an exception raised in the runtime context
+        @param exc_value value of an exception raised in the runtime context
+        @param traceback traceback of an exception raised in the runtime
+            context
+        @return always returns None to not suppress any exception
+        @rtype None
+        """
+        if self.__cursor is not None:
+            QGuiApplication.setOverrideCursor(self.__cursor)
+            QGuiApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
+        
+        return None
+
+
+class E5OverrideCursorProcess(QProcess):
+    """
+    Class implementing a QProcess subclass controlling an override cursor.
+    """
+    def __init__(self, parent=None, cursorShape=Qt.WaitCursor):
+        """
+        Constructor
+        
+        @param parent reference to the parent object
+        @type QObject
+        @param cursorShape shape of the override cursor
+        @type Qt.CursorShape
+        """
+        super(E5OverrideCursorProcess, self).__init__(parent)
+        
+        self.__cursorShape = cursorShape
+        
+        self.started.connect(self.__processStarted)
+        self.finished.connect(self.__processFinished)
+    
+    @pyqtSlot()
+    def __processStarted(self):
+        """
+        Private slot setting the cursor after the process has started.
+        """
+        QGuiApplication.setOverrideCursor(QCursor(self.__cursorShape))
+        QGuiApplication.processEvents(QEventLoop.ExcludeUserInputEvents)
+    
+    @pyqtSlot()
+    def __processFinished(self):
+        """
+        Private slot resetting the cursor when the process finished.
+        """
+        QGuiApplication.restoreOverrideCursor()
+        QGuiApplication.processEvents(QEventLoop.ExcludeUserInputEvents)

eric ide

mercurial