E5Gui/E5SideBar.py

changeset 2624
e04b5d53281e
parent 2302
f29e9405c851
child 2677
3d4277929fb3
child 2824
858412c29c34
--- a/E5Gui/E5SideBar.py	Fri Apr 26 19:48:36 2013 +0200
+++ b/E5Gui/E5SideBar.py	Sat Apr 27 13:56:42 2013 +0200
@@ -7,7 +7,7 @@
 Module implementing a sidebar class.
 """
 
-from PyQt4.QtCore import QEvent, QSize, Qt, QByteArray, QDataStream, QIODevice
+from PyQt4.QtCore import QEvent, QSize, Qt, QByteArray, QDataStream, QIODevice, QTimer
 from PyQt4.QtGui import QTabBar, QWidget, QStackedWidget, QBoxLayout, QToolButton, \
     QSizePolicy
 
@@ -28,11 +28,12 @@
     South = 2
     West = 3
     
-    def __init__(self, orientation=None, parent=None):
+    def __init__(self, orientation=None, delay=200, parent=None):
         """
         Constructor
         
         @param orientation orientation of the sidebar widget (North, East, South, West)
+        @param delay value for the expand/shrink delay in milliseconds (integer)
         @param parent parent widget (QWidget)
         """
         super().__init__(parent)
@@ -61,6 +62,13 @@
         self.layout.addWidget(self.__stackedWidget)
         self.setLayout(self.layout)
         
+        # initialize the delay timer
+        self.__actionMethod = None
+        self.__delayTimer = QTimer(self)
+        self.__delayTimer.setSingleShot(True)
+        self.__delayTimer.setInterval(delay)
+        self.__delayTimer.timeout.connect(self.__delayedAction)
+        
         self.__minimized = False
         self.__minSize = 0
         self.__maxSize = 0
@@ -105,9 +113,47 @@
         if self.splitter:
             self.splitterSizes = self.splitter.sizes()
     
+    def __delayedAction(self):
+        """
+        Private slot to handle the firing of the delay timer.
+        """
+        if self.__actionMethod is not None:
+            self.__actionMethod()
+    
+    def setDelay(self, delay):
+        """
+        Public method to set the delay value for the expand/shrink delay in milliseconds.
+        
+        @param delay value for the expand/shrink delay in milliseconds (integer)
+        """
+        self.__delayTimer.setInterval(delay)
+    
+    def delay(self):
+        """
+        Public method to get the delay value for the expand/shrink delay in milliseconds.
+        
+        @return value for the expand/shrink delay in milliseconds (integer)
+        """
+        return self.__delayTimer.interval()
+    
+    def __cancelDelayTimer(self):
+        """
+        Private method to cancel the current delay timer.
+        """
+        self.__delayTimer.stop()
+        self.__actionMethod = None
+    
     def shrink(self):
         """
-        Public method to shrink the sidebar.
+        Public method to record a shrink request.
+        """
+        self.__delayTimer.stop()
+        self.__actionMethod = self.__shrinkIt
+        self.__delayTimer.start()
+   
+    def __shrinkIt(self):
+        """
+        Private method to shrink the sidebar.
         """
         self.__minimized = True
         self.__bigSize = self.size()
@@ -126,10 +172,20 @@
             self.setFixedHeight(self.__tabBar.minimumSizeHint().height())
         else:
             self.setFixedWidth(self.__tabBar.minimumSizeHint().width())
+        
+        self.__actionMethod = None
     
     def expand(self):
         """
-        Public method to expand the sidebar.
+        Public method to record a expand request.
+        """
+        self.__delayTimer.stop()
+        self.__actionMethod = self.__expandIt
+        self.__delayTimer.start()
+    
+    def __expandIt(self):
+        """
+        Private method to expand the sidebar.
         """
         self.__minimized = False
         self.__stackedWidget.show()
@@ -144,6 +200,8 @@
             self.setMaximumWidth(self.__maxSize)
         if self.splitter:
             self.splitter.setSizes(self.splitterSizes)
+        
+        self.__actionMethod = None
     
     def isMinimized(self):
         """
@@ -585,6 +643,8 @@
         """
         if self.__autoHide and self.isMinimized():
             self.expand()
+        else:
+            self.__cancelDelayTimer()
     
     def leaveEvent(self, event):
         """
@@ -594,6 +654,8 @@
         """
         if self.__autoHide and not self.__hasFocus and not self.isMinimized():
             self.shrink()
+        else:
+            self.__cancelDelayTimer()
     
     def shutdown(self):
         """

eric ide

mercurial