src/eric7/Utilities/AutoSaver.py

branch
eric7
changeset 9209
b99e7fd55fd3
parent 8881
54e42bc2437a
child 9221
bf71ee032bb4
diff -r 3fc8dfeb6ebe -r b99e7fd55fd3 src/eric7/Utilities/AutoSaver.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/eric7/Utilities/AutoSaver.py	Thu Jul 07 11:23:56 2022 +0200
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2009 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing an auto saver class.
+"""
+
+from PyQt6.QtCore import QObject, QBasicTimer, QTime
+
+
+class AutoSaver(QObject):
+    """
+    Class implementing the auto saver.
+    """
+    AUTOSAVE_IN = 1000 * 3
+    MAXWAIT = 1000 * 15
+    
+    def __init__(self, parent, save):
+        """
+        Constructor
+        
+        @param parent reference to the parent object (QObject)
+        @param save slot to be called to perform the save operation
+        @exception RuntimeError raised, if no parent is given
+        """
+        super().__init__(parent)
+        
+        if parent is None:
+            raise RuntimeError("AutoSaver: parent must not be None.")
+        
+        self.__save = save
+        
+        self.__timer = QBasicTimer()
+        self.__firstChange = None
+    
+    def changeOccurred(self):
+        """
+        Public slot handling a change.
+        """
+        if self.__firstChange is None:
+            self.__firstChange = QTime.currentTime()
+        
+        if self.__firstChange.msecsTo(QTime.currentTime()) > self.MAXWAIT:
+            self.saveIfNeccessary()
+        else:
+            self.__timer.start(self.AUTOSAVE_IN, self)
+    
+    def timerEvent(self, evt):
+        """
+        Protected method handling timer events.
+        
+        @param evt reference to the timer event (QTimerEvent)
+        """
+        if evt.timerId() == self.__timer.timerId():
+            self.saveIfNeccessary()
+        else:
+            super().timerEvent(evt)
+    
+    def saveIfNeccessary(self):
+        """
+        Public method to activate the save operation.
+        """
+        if not self.__timer.isActive():
+            return
+        
+        self.__timer.stop()
+        self.__firstChange = None
+        self.__save()

eric ide

mercurial