fix yesterday "infobar was not shown when a service was selected in
[enigma2.git] / lib / python / Screens / InfoBarGenerics.py
index 05a224d01125f3701f98f91f33d57b9ee9ea5978..efe2c78d150f4ed02455b5fec7c4f5aa4a2faaae 100644 (file)
@@ -16,8 +16,7 @@ from Components.Sources.FrontendStatus import FrontendStatus
 from Components.Sources.Boolean import Boolean
 from Components.Sources.Clock import Clock
 from Components.TimerList import TimerEntryComponent
-from Components.config import config, ConfigBoolean
-
+from Components.config import config, ConfigBoolean, ConfigClock
 from EpgSelection import EPGSelection
 from Plugins.Plugin import PluginDescriptor
 
@@ -33,6 +32,7 @@ from Screens.PictureInPicture import PictureInPicture
 from Screens.SubtitleDisplay import SubtitleDisplay
 from Screens.RdsDisplay import RdsInfoDisplay, RassInteractive
 from Screens.SleepTimerEdit import SleepTimerEdit
+from Screens.TimeDateInput import TimeDateInput
 from ServiceReference import ServiceReference
 
 from Tools import Notifications
@@ -41,7 +41,7 @@ from Tools.Directories import SCOPE_HDD, resolveFilename
 from enigma import eTimer, eServiceCenter, eDVBServicePMTHandler, iServiceInformation, \
        iPlayableService, eServiceReference, eDVBResourceManager, iFrontendInformation, eEPGCache
 
-from time import time
+from time import time, localtime, strftime
 from os import stat as os_stat
 from bisect import insort
 
@@ -70,8 +70,7 @@ class InfoBarShowHide:
 
                self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
                        {
-                               iPlayableService.evStart: self.__serviceStarted,
-                               iPlayableService.evUpdatedEventInfo: self.__eventInfoChanged
+                               iPlayableService.evStart: self.serviceStarted,
                        })
 
                self.__state = self.STATE_SHOWN
@@ -83,22 +82,9 @@ class InfoBarShowHide:
                
                self.onShow.append(self.__onShow)
                self.onHide.append(self.__onHide)
-               self.current_begin_time=0
 
-       def __eventInfoChanged(self):
+       def serviceStarted(self):
                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):
-               if self.execing:
-                       self.current_begin_time=0
                        if config.usage.show_infobar_on_zap.value:
                                self.doShow()
 
@@ -568,9 +554,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)
@@ -652,6 +638,7 @@ class InfoBarSeek:
                                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)
@@ -904,6 +891,10 @@ class InfoBarSeek:
        def __evEOF(self):
                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)
@@ -985,7 +976,7 @@ class InfoBarShowMovies:
 # Timeshift works the following way:
 #                                         demux0   demux1                    "TimeshiftActions" "TimeshiftActivateActions" "SeekActions"
 # - normal playback                       TUNER    unused      PLAY               enable                disable              disable
-# - user presses "yellow" button.         TUNER    record      PAUSE              enable                disable              enable
+# - user presses "yellow" button.         FILE     record      PAUSE              enable                disable              enable
 # - user presess pause again              FILE     record      PLAY               enable                disable              enable
 # - user fast forwards                    FILE     record      FF                 enable                disable              enable
 # - end of timeshift buffer reached       TUNER    record      PLAY               enable                enable               disable
@@ -1015,14 +1006,14 @@ 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=
                        {
@@ -1040,7 +1031,7 @@ 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?"
@@ -1052,7 +1043,8 @@ class InfoBarTimeshift:
                                #self.pvrStateDialog["timeshift"].setRelative(time.time())
 
                                # PAUSE.
-                               self.setSeekState(self.SEEK_STATE_PAUSE)
+                               #self.setSeekState(self.SEEK_STATE_PAUSE)
+                               self.activateTimeshiftEnd(False)
 
                                # enable the "TimeshiftEnableActions", which will override
                                # the startTimeshift actions
@@ -1084,7 +1076,7 @@ class InfoBarTimeshift:
                self.__seekableStatusChanged()
 
        # activates timeshift, and seeks to (almost) the end
-       def activateTimeshiftEnd(self):
+       def activateTimeshiftEnd(self, back = True):
                ts = self.getTimeshift()
                print "activateTimeshiftEnd"
 
@@ -1100,23 +1092,17 @@ class InfoBarTimeshift:
                        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):
                print "activateTimeshiftEndAndPause"
-               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()
+               #state = self.seekstate
+               self.activateTimeshiftEnd(False)
        
        def __seekableStatusChanged(self):
                enabled = False
@@ -1386,22 +1372,39 @@ class InfoBarInstantRecord:
                                self.changeDuration(0)
                        else:
                                self.session.openWithCallback(self.changeDuration, TimerSelection, list)
+               elif answer[1] == "changeendtime":
+                       if len(self.recording) == 1:
+                               self.setEndtime(0)
+                       else:
+                               self.session.openWithCallback(self.setEndTime, TimerSelection, list)
                elif answer[1] == "stop":
                        if len(self.recording) == 1:
                                self.stopCurrentRecording(0)
                        else:
                                self.session.openWithCallback(self.stopCurrentRecording, TimerSelection, list)
-               if answer[1] == "indefinitely" or answer[1] == "manualduration" or answer[1] == "event":
-                       limitEvent = False
-                       if answer[1] == "event":
-                               limitEvent = True
+               elif answer[1] in ( "indefinitely" , "manualduration", "manualendtime", "event"):
+                       self.startInstantRecording(limitEvent = answer[1] in ("event", "manualendtime") or False)
                        if answer[1] == "manualduration":
-                               self.selectedEntry = len(self.recording)
-                               self.session.openWithCallback(self.inputCallback, InputBox, title=_("How many minutes do you want to record?"), text="5", maxSize=False, type=Input.NUMBER)
-                       self.startInstantRecording(limitEvent = limitEvent)
-                       
+                               self.changeDuration(len(self.recording)-1)
+                       elif answer[1] == "manualendtime":
+                               self.setEndtime(len(self.recording)-1)
                print "after:\n", self.recording
 
+       def setEndtime(self, entry):
+               if entry is not None:
+                       self.selectedEntry = entry
+                       self.endtime=ConfigClock(default = self.recording[self.selectedEntry].end)
+                       dlg = self.session.openWithCallback(self.TimeDateInputClosed, TimeDateInput, self.endtime)
+                       dlg.setTitle(_("Please change recording endtime"))
+
+       def TimeDateInputClosed(self, ret):
+               if len(ret) > 1:
+                       if ret[0]:
+                               localendtime = localtime(ret[1])
+                               print "stopping recording at", strftime("%c", localendtime)
+                               self.recording[self.selectedEntry].end = ret[1]
+                               self.session.nav.RecordTimer.timeChanged(self.recording[self.selectedEntry])
+
        def changeDuration(self, entry):
                if entry is not None:
                        self.selectedEntry = entry
@@ -1425,9 +1428,11 @@ class InfoBarInstantRecord:
                                title=_("A recording is currently running.\nWhat do you want to do?"), \
                                list=[(_("stop recording"), "stop"), \
                                (_("change recording (duration)"), "changeduration"), \
+                               (_("change recording (endtime)"), "changeendtime"), \
                                (_("add recording (indefinitely)"), "indefinitely"), \
                                (_("add recording (stop after current event)"), "event"), \
                                (_("add recording (enter recording duration)"), "manualduration"), \
+                               (_("add recording (enter recording endtime)"), "manualendtime"), \
                                (_("do nothing"), "no")])
                else:
                        self.session.openWithCallback(self.recordQuestionCallback, ChoiceBox, \
@@ -1435,6 +1440,7 @@ class InfoBarInstantRecord:
                                list=[(_("add recording (indefinitely)"), "indefinitely"), \
                                (_("add recording (stop after current event)"), "event"), \
                                (_("add recording (enter recording duration)"), "manualduration"), \
+                               (_("add recording (enter recording endtime)"), "manualendtime"), \
                                (_("don't record"), "no")])
 
 from Tools.ISO639 import LanguageCodes
@@ -1919,6 +1925,7 @@ class InfoBarSubtitleSupport(object):
                                iPlayableService.evUpdatedInfo: self.__updatedInfo
                        })
                self.cached_subtitle_checked = False
+               self.__selected_subtitle = None
 
        def __serviceStopped(self):
                self.subtitle_window.hide()
@@ -1929,8 +1936,7 @@ class InfoBarSubtitleSupport(object):
                if not self.cached_subtitle_checked:
                        subtitle = self.getCurrentServiceSubtitle()
                        self.cached_subtitle_checked = True
-                       if subtitle:
-                               self.__selected_subtitle = subtitle.getCachedSubtitle()
+                       self.__selected_subtitle = subtitle and subtitle.getCachedSubtitle()
                        if self.__selected_subtitle:
                                subtitle.enableSubtitles(self.subtitle_window.instance, self.selected_subtitle)
                                self.subtitle_window.show()