no helpable actionmap for RdsActions
[enigma2.git] / lib / python / Screens / InfoBarGenerics.py
index 3feafaf64856bc7bdfbc464bc5b06f0427c60ae1..ef014568df9ce7dc05dd8292a595ae77bfafc48d 100644 (file)
@@ -83,21 +83,24 @@ class InfoBarShowHide:
                
                self.onShow.append(self.__onShow)
                self.onHide.append(self.__onHide)
+               self.current_begin_time=0
 
        def __eventInfoChanged(self):
-               old_begin_time = self.current_begin_time
-               service = self.session.nav.getCurrentService()
-               info = service and service.info()
-               ptr = info and info.getEvent(0)
-               self.current_begin_time = ptr and ptr.getBeginTime() or 0
-               if config.usage.show_infobar_on_event_change.value:
-                       if old_begin_time and old_begin_time != self.current_begin_time:
-                               self.doShow()
+               if self.execing:
+                       service = self.session.nav.getCurrentService()
+                       old_begin_time = self.current_begin_time
+                       info = service and service.info()
+                       ptr = info and info.getEvent(0)
+                       self.current_begin_time = ptr and ptr.getBeginTime() or 0
+                       if config.usage.show_infobar_on_event_change.value:
+                               if old_begin_time and old_begin_time != self.current_begin_time:
+                                       self.doShow()
 
        def __serviceStarted(self):
-               self.current_begin_time=0
-               if config.usage.show_infobar_on_zap.value:
-                       self.doShow()
+               if self.execing:
+                       self.current_begin_time=0
+                       if config.usage.show_infobar_on_zap.value:
+                               self.doShow()
 
        def __onShow(self):
                self.__state = self.STATE_SHOWN
@@ -565,9 +568,9 @@ class InfoBarRdsDecoder:
                                iPlayableService.evUpdatedRassSlidePic: self.RassSlidePicChanged
                        })
                
-               self["RdsActions"] = HelpableActionMap(self, "InfobarRdsActions",
+               self["RdsActions"] = ActionMap(["InfobarRdsActions"],
                {
-                       "startRassInteractive": (self.startRassInteractive, _("View Rass interactive..."))
+                       "startRassInteractive": self.startRassInteractive
                },-1)
 
                self["RdsActions"].setEnabled(False)
@@ -626,7 +629,9 @@ class InfoBarSeek:
        SEEK_STATE_SM_HALF = (0, 0, 2, "/2")
        SEEK_STATE_SM_QUARTER = (0, 0, 4, "/4")
        SEEK_STATE_SM_EIGHTH = (0, 0, 8, "/8")
-       
+
+       SEEK_STATE_EOF = (1, 0, 0, "END")
+
        def __init__(self):
                self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
                        {
@@ -643,9 +648,11 @@ class InfoBarSeek:
                                self.screen = screen
                                
                        def action(self, contexts, action):
+                               print "action:", action
                                if action[:5] == "seek:":
                                        time = int(action[5:])
                                        self.screen.seekRelative(time * 90000)
+                                       self.screen.doShow()
                                        return 1
                                else:
                                        return HelpableActionMap.action(self, contexts, action)
@@ -681,7 +688,7 @@ class InfoBarSeek:
                self.onPlayStateChanged = [ ]
                
                self.lockedBecauseOfSkipping = False
-       
+
        def up(self):
                pass
        
@@ -721,6 +728,7 @@ class InfoBarSeek:
 
        def __serviceStarted(self):
                self.seekstate = self.SEEK_STATE_PLAY
+               self.__seekableStatusChanged()
 
        def setSeekState(self, state):
                service = self.session.nav.getCurrentService()
@@ -731,23 +739,23 @@ class InfoBarSeek:
                if not self.isSeekable():
                        if state not in [self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE]:
                                state = self.SEEK_STATE_PLAY
-               
+
                pauseable = service.pause()
 
                if pauseable is None:
                        print "not pauseable."
                        state = self.SEEK_STATE_PLAY
-               
+
                oldstate = self.seekstate
                self.seekstate = state
-               
+
                for i in range(3):
                        if oldstate[i] != self.seekstate[i]:
                                (self.session.nav.pause, pauseable.setFastForward, pauseable.setSlowMotion)[i](self.seekstate[i])
 
                for c in self.onPlayStateChanged:
                        c(self.seekstate)
-               
+
                self.checkSkipShowHideLock()
 
                return True
@@ -821,7 +829,8 @@ class InfoBarSeek:
                                self.SEEK_STATE_BACK_128X: self.SEEK_STATE_BACK_64X,
                                self.SEEK_STATE_SM_HALF: self.SEEK_STATE_SM_HALF,
                                self.SEEK_STATE_SM_QUARTER: self.SEEK_STATE_SM_HALF,
-                               self.SEEK_STATE_SM_EIGHTH: self.SEEK_STATE_SM_QUARTER
+                               self.SEEK_STATE_SM_EIGHTH: self.SEEK_STATE_SM_QUARTER,
+                               self.SEEK_STATE_EOF: self.SEEK_STATE_EOF,
                        }
                self.setSeekState(lookup[self.seekstate])
        
@@ -848,7 +857,8 @@ class InfoBarSeek:
                                self.SEEK_STATE_BACK_128X: self.SEEK_STATE_BACK_128X,
                                self.SEEK_STATE_SM_HALF: self.SEEK_STATE_SM_QUARTER,
                                self.SEEK_STATE_SM_QUARTER: self.SEEK_STATE_SM_EIGHTH,
-                               self.SEEK_STATE_SM_EIGHTH: self.SEEK_STATE_PAUSE
+                               self.SEEK_STATE_SM_EIGHTH: self.SEEK_STATE_PAUSE,
+                               self.SEEK_STATE_EOF: self.SEEK_STATE_BACK_16X,
                        }
                self.setSeekState(lookup[self.seekstate])
                
@@ -893,13 +903,18 @@ class InfoBarSeek:
                                self.lockedBecauseOfSkipping = True
 
        def __evEOF(self):
-               if self.seekstate != self.SEEK_STATE_PLAY:
-                       self.setSeekState(self.SEEK_STATE_PAUSE)
-                       # HACK
-                       #self.getSeek().seekRelative(1, -90000)
-                       self.setSeekState(self.SEEK_STATE_PLAY)
+               if self.seekstate == self.SEEK_STATE_EOF:
+                       return
+               if self.seekstate[1] < 0: # SEEK_STATE_BACK_*X
+                       print "end of stream while seeking back, ignoring."
+                       return
+
+               # if we are seeking, we try to end up ~1s before the end, and pause there.
+               if not self.seekstate in [self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE]:
+                       self.setSeekState(self.SEEK_STATE_EOF)
+                       self.seekRelativeToEnd(-90000)
                else:
-                       self.setSeekState(self.SEEK_STATE_PAUSE)
+                       self.setSeekState(self.SEEK_STATE_EOF)
        
        def __evSOF(self):
                self.setSeekState(self.SEEK_STATE_PLAY)
@@ -908,7 +923,21 @@ class InfoBarSeek:
        def seekRelative(self, diff):
                seekable = self.getSeek()
                if seekable is not None:
-                       seekable.seekRelative(1, diff)
+                       print "seekRelative: res:", seekable.seekRelative(1, diff)
+               else:
+                       print "seek failed!"
+
+       def seekRelativeToEnd(self, diff):
+               assert diff <= 0, "diff is expected to be negative!"
+
+               # might sound like an evil hack, but:
+               # if we seekRelativeToEnd(0), we expect to be at the end, which is what we want,
+               # and we don't get that by passing 0 here (it would seek to begin).
+               if diff == 0:
+                       diff = -1
+
+               # relative-to-end seeking is implemented as absolutes seeks with negative time
+               self.seekAbsolute(diff)
 
        def seekAbsolute(self, abs):
                seekable = self.getSeek()
@@ -991,21 +1020,21 @@ class InfoBarTimeshift:
                        }, prio=1)
                self["TimeshiftActivateActions"] = ActionMap(["InfobarTimeshiftActivateActions"],
                        {
-                               "timeshiftActivateEnd": self.activateTimeshiftEnd, # something like "pause key"
-                               "timeshiftActivateEndAndPause": self.activateTimeshiftEndAndPause  # something like "backward key"
+                               "timeshiftActivateEnd": self.activateTimeshiftEnd, # something like "rewind key"
+                               "timeshiftActivateEndAndPause": self.activateTimeshiftEndAndPause  # something like "pause key"
                        }, prio=-1) # priority over record
 
                self.timeshift_enabled = 0
                self.timeshift_state = 0
-               self.ts_pause_timer = eTimer()
-               self.ts_pause_timer.timeout.get().append(self.pauseService)
+               self.ts_rewind_timer = eTimer()
+               self.ts_rewind_timer.timeout.get().append(self.rewindService)
 
                self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
                        {
                                iPlayableService.evStart: self.__serviceStarted,
                                iPlayableService.evSeekableStatusChanged: self.__seekableStatusChanged
                        })
-       
+
        def getTimeshift(self):
                service = self.session.nav.getCurrentService()
                return service and service.timeshift()
@@ -1016,8 +1045,8 @@ class InfoBarTimeshift:
                if ts is None:
                        self.session.open(MessageBox, _("Timeshift not possible!"), MessageBox.TYPE_ERROR)
                        print "no ts interface"
-                       return 0;
-               
+                       return 0
+
                if self.timeshift_enabled:
                        print "hu, timeshift already enabled?"
                else:
@@ -1026,10 +1055,10 @@ class InfoBarTimeshift:
 
                                # we remove the "relative time" for now.
                                #self.pvrStateDialog["timeshift"].setRelative(time.time())
-                                       
+
                                # PAUSE.
                                self.setSeekState(self.SEEK_STATE_PAUSE)
-                               
+
                                # enable the "TimeshiftEnableActions", which will override
                                # the startTimeshift actions
                                self.__seekableStatusChanged()
@@ -1058,38 +1087,35 @@ class InfoBarTimeshift:
 
                # disable actions
                self.__seekableStatusChanged()
-       
+
        # activates timeshift, and seeks to (almost) the end
-       def activateTimeshiftEnd(self):
+       def activateTimeshiftEnd(self, back = True):
                ts = self.getTimeshift()
-               
+               print "activateTimeshiftEnd"
+
                if ts is None:
                        return
-               
+
                if ts.isTimeshiftActive():
                        print "!! activate timeshift called - but shouldn't this be a normal pause?"
                        self.pauseService()
                else:
-                       self.setSeekState(self.SEEK_STATE_PLAY)
-                       ts.activateTimeshift()
-                       self.seekRelative(0)
-       
+                       print "play, ..."
+                       ts.activateTimeshift() # activate timeshift will automatically pause
+                       self.setSeekState(self.SEEK_STATE_PAUSE)
+                       self.seekRelativeToEnd(-90000) # seek approx. 1 sec before end
+
+               if back:
+                       self.ts_rewind_timer.start(200, 1)
+
+       def rewindService(self):
+               self.setSeekState(self.SEEK_STATE_BACK_16X)
+
        # same as activateTimeshiftEnd, but pauses afterwards.
        def activateTimeshiftEndAndPause(self):
-               state = self.seekstate
-               self.activateTimeshiftEnd()
-               
-               # well, this is "andPause", but it could be pressed from pause,
-               # when pausing on the (fake-)"live" picture, so an un-pause
-               # is perfectly ok.
-               
-               print "now, pauseService"
-               if state == self.SEEK_STATE_PLAY:
-                       print "is PLAYING, start pause timer"
-                       self.ts_pause_timer.start(200, 1)
-               else:
-                       print "unpause"
-                       self.unPauseService()
+               print "activateTimeshiftEndAndPause"
+               #state = self.seekstate
+               self.activateTimeshiftEnd(False)
        
        def __seekableStatusChanged(self):
                enabled = False