start timer after message box is actually visible
[enigma2.git] / lib / python / Screens / MessageBox.py
index f13e14b5ef0405a43643db122d030174f55892e8..33d51b24212731d8058ee422e08a7bf0092de512 100644 (file)
@@ -4,7 +4,7 @@ from Components.Label import Label
 from Components.Button import Button
 from Components.Pixmap import Pixmap
 from Components.MenuList import MenuList
-from enigma import eSize, ePoint
+from enigma import eSize, ePoint, eTimer
 
 class MessageBox(Screen):
        TYPE_YESNO = 0
@@ -12,23 +12,35 @@ class MessageBox(Screen):
        TYPE_WARNING = 2
        TYPE_ERROR = 3
        
-       def __init__(self, session, text, type = TYPE_YESNO):
+       def __init__(self, session, text, type = TYPE_YESNO, timeout = -1, close_on_any_key = False):
                self.type = type
                Screen.__init__(self, session)
                
                self["text"] = Label(text)
                
+               self.text = text
+               self.close_on_any_key = close_on_any_key
+               
                self["ErrorPixmap"] = Pixmap()
                self["QuestionPixmap"] = Pixmap()
                self["InfoPixmap"] = Pixmap()
+               self.timerRunning = False
+               if timeout > 0:
+                       self.timer = eTimer()
+                       self.timer.timeout.get().append(self.timerTick)
+                       self.onExecBegin.append(self.startTimer)
+                       self.origTitle = None
+                       self.onShown.append(self.timerTick)
+                       self.timerRunning = True
+               self.timeout = timeout
                
                self.list = []
                if type != self.TYPE_ERROR:
-                       self.onShown.append(self["ErrorPixmap"].hideWidget)
-               elif type != self.TYPE_YESNO:
-                       self.onShown.append(self["QuestionPixmap"].hideWidget)
-               elif type != self.TYPE_INFO:
-                       self.onShown.append(self["InfoPixmap"].hideWidget)
+                       self["ErrorPixmap"].hide()
+               if type != self.TYPE_YESNO:
+                       self["QuestionPixmap"].hide()
+               if type != self.TYPE_INFO:
+                       self["InfoPixmap"].hide()
                        
                if type == self.TYPE_YESNO:
                        self.list = [ (_("yes"), 0), (_("no"), 1) ]
@@ -36,13 +48,37 @@ class MessageBox(Screen):
 
                self["list"] = MenuList(self.list)
                
-               self["actions"] = ActionMap(["MsgBoxActions"], 
+               self["actions"] = ActionMap(["MsgBoxActions", "DirectionActions"], 
                        {
                                "cancel": self.cancel,
                                "ok": self.ok,
-                               "alwaysOK": self.alwaysOK
-                       })
+                               "alwaysOK": self.alwaysOK,
+                               "up": self.up,
+                               "down": self.down,
+                               "left": self.left,
+                               "right": self.right,
+                               "upRepeated": self.up,
+                               "downRepeated": self.down,
+                               "leftRepeated": self.left,
+                               "rightRepeated": self.right
+                       }, -1)
+
+       def startTimer(self):
+               self.timer.start(1000)
+
+       def timerTick(self):
+               self.timeout -= 1
+               if self.origTitle is None:
+                       self.origTitle = self.instance.getTitle()
+               self.setTitle(self.origTitle + " (" + str(self.timeout) + ")")
+               if self.timeout == 0:
+                       self.timer.stop()
+                       self.timerRunning = False
+                       self.timeoutCallback()
                        
+       def timeoutCallback(self):
+               print "Timeout!"
+               self.ok()
        
        def cancel(self):
                self.close(False)
@@ -55,3 +91,28 @@ class MessageBox(Screen):
 
        def alwaysOK(self):
                self.close(True)
+
+       def up(self):
+               self.move(self["list"].instance.moveUp)
+               
+       def down(self):
+               self.move(self["list"].instance.moveDown)
+
+       def left(self):
+               self.move(self["list"].instance.pageUp)
+               
+       def right(self):
+               self.move(self["list"].instance.pageDown)
+
+       def move(self, direction):
+               if self.close_on_any_key:
+                       self.close(True)
+
+               self["list"].instance.moveSelection(direction)
+               if self.timerRunning:
+                       self.timer.stop()
+                       self.setTitle(self.origTitle)
+                       self.timerRunning = False
+
+       def __repr__(self):
+               return str(type(self)) + "(" + self.text + ")"