dont use onShown .. use onLayoutFinish for hide dish icon
[enigma2.git] / lib / python / Screens / InfoBarGenerics.py
index 13d61ae05f677fe11d27e2ed5f2fdf779ad69144..1a8f88bba55d974a1dcd5b4ad8e47e3c4b480aa5 100644 (file)
@@ -41,7 +41,7 @@ from Menu import MainMenu, mdom
 class InfoBarDish:
        def __init__(self):
                self.dishDialog = self.session.instantiateDialog(Dish)
-               self.onShown.append(self.dishDialog.show)
+               self.onLayoutFinish.append(self.dishDialog.show)
 
 class InfoBarShowHide:
        """ InfoBar show/hide control, accepts toggleShow and hide actions, might start
@@ -81,6 +81,10 @@ class InfoBarShowHide:
        def __onHide(self):
                self.__state = self.STATE_HIDDEN
 
+       def doShow(self):
+               self.show()
+               self.startHideTimer()
+
        def doTimerHide(self):
                self.hideTimer.stop()
                if self.__state == self.STATE_SHOWN:
@@ -212,7 +216,7 @@ class InfoBarNumberZap:
 #              print "You pressed number " + str(number)
                if number == 0:
                        self.servicelist.recallPrevService()
-                       self.show()
+                       self.doShow()
                else:
                        self.session.openWithCallback(self.numberEntered, NumberZap, number)
 
@@ -283,15 +287,21 @@ class InfoBarChannelSelection:
                self.servicelist.moveDown()
                self.session.execDialog(self.servicelist)
 
-       def     zapUp(self):
+       def zapUp(self):
+               if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes":
+                       if self.servicelist.inBouquet() and self.servicelist.atBegin():
+                               self.servicelist.prevBouquet()
                self.servicelist.moveUp()
                self.servicelist.zap()
-               self.show()
+               self.doShow()
 
-       def     zapDown(self):
-               self.servicelist.moveDown()
+       def zapDown(self):
+               if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes" and self.servicelist.inBouquet() and self.servicelist.atEnd():
+                       self.servicelist.nextBouquet()
+               else:
+                       self.servicelist.moveDown()
                self.servicelist.zap()
-               self.show()
+               self.doShow()
 
 class InfoBarMenu:
        """ Handles a menu action, to open the (main) menu """
@@ -523,14 +533,22 @@ class InfoBarSeek:
                del self.fwdKeyTimer
                del self.rwdKeyTimer
        
-       def isSeekable(self):
+       def getSeek(self):
                service = self.session.nav.getCurrentService()
                if service is None:
                        return False
-               if service.seek() is None:
+
+               seek = service.seek()
+
+               if seek is None or not seek.isCurrentlySeekable():
+                       return None
+               
+               return seek
+       
+       def isSeekable(self):
+               if self.getSeek() is None:
                        return False
-               else:
-                       return True
+               return True
 
        def __seekableStatusChanged(self):
                print "seekable status changed!"
@@ -551,7 +569,7 @@ class InfoBarSeek:
                if service is None:
                        return False
                
-               if service.seek() is None:
+               if not self.isSeekable():
                        if state not in [self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE]:
                                state = self.SEEK_STATE_PLAY
                
@@ -597,9 +615,10 @@ class InfoBarSeek:
                if service is None:
                        return
                
-               seekable = service.seek()
+               seekable = self.getSeek()
                if seekable is None:
                        return
+               
                seekable.seekTo(90 * seektime)
 
        def seekFwd(self):
@@ -670,13 +689,9 @@ class InfoBarSeek:
        def fwdSeekTo(self, minutes):
                print "Seek", minutes, "minutes forward"
                if minutes != 0:
-                       service = self.session.nav.getCurrentService()
-                       if service is None:
-                               return
-                       seekable = service.seek()
-                       if seekable is None:
-                               return
-                       seekable.seekRelative(1, minutes * 60 * 90000)
+                       seekable = self.getSeek()
+                       if seekable is not None:
+                               seekable.seekRelative(1, minutes * 60 * 90000)
        
        def rwdTimerFire(self):
                print "rwdTimerFire"
@@ -704,14 +719,12 @@ class InfoBarSeek:
        
        def __evSOF(self):
                self.setSeekState(self.SEEK_STATE_PLAY)
-               service = self.session.nav.getCurrentService()
-               if service is None:
-                       return
-               seekable = service.seek()
-               if seekable is None:
-                       return
-               seekable.seekRelative(0, 0)
-               
+               self.doSeek(0)
+
+       def seekRelative(self, diff):
+               seekable = self.getSeek()
+               if seekable is not None:
+                       seekable.seekRelative(0, diff)
 
 from Screens.PVRState import PVRState
 
@@ -783,7 +796,7 @@ class InfoBarTimeshift:
                        {
                                "timeshiftActivateEnd": self.activateTimeshiftEnd, # something like "pause key"
                                "timeshiftActivateEndAndPause": self.activateTimeshiftEndAndPause  # something like "backward key"
-                       })
+                       }, prio=-1) # priority over record
 
                self.timeshift_enabled = 0
                self.timeshift_state = 0
@@ -800,9 +813,6 @@ class InfoBarTimeshift:
                return service.timeshift()
 
        def startTimeshift(self):
-               # TODO: check for harddisk! (or do this in the interface? would make
-               # more sense... for example radio could be timeshifted in memory,
-               # and the decision can't be made here)
                print "enable timeshift"
                ts = self.getTimeshift()
                if ts is None:
@@ -825,12 +835,21 @@ class InfoBarTimeshift:
                        else:
                                print "timeshift failed"
 
-       # nyi
        def stopTimeshift(self):
                print "disable timeshift"
                ts = self.getTimeshift()
                if ts is None:
                        return
+               self.session.openWithCallback(self.stopTimeshiftConfirmed, MessageBox, _("Stop Timeshift?"), MessageBox.TYPE_YESNO)
+
+       def stopTimeshiftConfirmed(self, confirmed):
+               if not confirmed:
+                       return
+
+               ts = self.getTimeshift()
+               if ts is None:
+                       return
+
                ts.stopTimeshift()
                self.timeshift_enabled = 0
 
@@ -850,6 +869,7 @@ class InfoBarTimeshift:
                else:
                        self.setSeekState(self.SEEK_STATE_PLAY)
                        ts.activateTimeshift()
+                       self.seekRelative(0)
        
        # same as activateTimeshiftEnd, but pauses afterwards.
        def activateTimeshiftEndAndPause(self):
@@ -894,15 +914,14 @@ class InfoBarInstantRecord:
                                "instantRecord": (self.instantRecord, "Instant Record..."),
                        })
                self.recording = None
-               
                self["BlinkingPoint"] = BlinkingPixmapConditional()
-               self.onShown.append(self["BlinkingPoint"].hideWidget)
+               self.onLayoutFinish.append(self["BlinkingPoint"].hideWidget)
                self["BlinkingPoint"].setConnect(self.session.nav.RecordTimer.isRecording)
-               
+
        def stopCurrentRecording(self): 
                self.session.nav.RecordTimer.removeEntry(self.recording)
                self.recording = None
-                       
+
        def startInstantRecording(self):
                serviceref = self.session.nav.getCurrentlyPlayingServiceReference()
                
@@ -918,15 +937,8 @@ class InfoBarInstantRecord:
                
                if event is not None:
                        data = parseEvent(event)
-                       begin = data[0]
-                       if begin < time.time():
-                               begin = time.time()
-                       
-                       end = data[1]
-                       if end < begin:
-                               end = begin
-                       
-                       end += 3600 * 10
+                       begin = time.time()
+                       end = begin + 3600 * 10
                        
                        data = (begin, end, data[2], data[3], data[4])
                else: