better fix for previous commit
[enigma2.git] / lib / python / Screens / InfoBarGenerics.py
index 646419c3fb387319e731ac9766f148fb58e03990..f1141923b543cc437f58ba1ecede5990e60024de 100644 (file)
@@ -12,7 +12,6 @@ from Components.ProgressBar import *
 from Components.ServiceEventTracker import ServiceEventTracker
 from Components.Sources.CurrentService import CurrentService
 from Components.Sources.EventInfo import EventInfo
-from Components.Sources.RadioText import RadioText
 from Components.Sources.FrontendStatus import FrontendStatus
 from Components.Sources.Boolean import Boolean
 from Components.Sources.Clock import Clock
@@ -32,6 +31,7 @@ from Screens.MinuteInput import MinuteInput
 from Screens.TimerSelection import TimerSelection
 from Screens.PictureInPicture import PictureInPicture
 from Screens.SubtitleDisplay import SubtitleDisplay
+from Screens.RdsDisplay import RdsInfoDisplay, RassInteractive
 from Screens.SleepTimerEdit import SleepTimerEdit
 from ServiceReference import ServiceReference
 
@@ -39,7 +39,7 @@ from Tools import Notifications
 from Tools.Directories import SCOPE_HDD, resolveFilename
 
 from enigma import eTimer, eServiceCenter, eDVBServicePMTHandler, iServiceInformation, \
-       iPlayableService, eServiceReference, eDVBResourceManager, iFrontendInformation
+       iPlayableService, eServiceReference, eDVBResourceManager, iFrontendInformation, eEPGCache
 
 from time import time
 from os import stat as os_stat
@@ -66,19 +66,41 @@ class InfoBarShowHide:
                        {
                                "toggleShow": self.toggleShow,
                                "hide": self.hide,
+                       }, 1) # lower prio to make it possible to override ok and cancel..
+
+               self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+                       {
+                               iPlayableService.evStart: self.__serviceStarted,
+                               iPlayableService.evUpdatedEventInfo: self.__eventInfoChanged
                        })
 
                self.__state = self.STATE_SHOWN
                self.__locked = 0
                
-               self.onExecBegin.append(self.show)
-               
                self.hideTimer = eTimer()
                self.hideTimer.timeout.get().append(self.doTimerHide)
                self.hideTimer.start(5000, True)
                
                self.onShow.append(self.__onShow)
                self.onHide.append(self.__onHide)
+               self.current_begin_time=0
+
+       def __eventInfoChanged(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()
 
        def __onShow(self):
                self.__state = self.STATE_SHOWN
@@ -193,8 +215,6 @@ class InfoBarNumberZap:
 #              print "You pressed number " + str(number)
                if number == 0:
                        self.servicelist.recallPrevService()
-                       if config.usage.show_infobar_on_zap.value:
-                               self.doShow()
                else:
                        self.session.openWithCallback(self.numberEntered, NumberZap, number)
 
@@ -227,7 +247,7 @@ class InfoBarNumberZap:
                        bouquetlist = serviceHandler.list(bouquet)
                        if not bouquetlist is None:
                                while number:
-                                       bouquet = self.servicelist.appendDVBTypes(bouquetlist.getNext())
+                                       bouquet = bouquetlist.getNext()
                                        if not bouquet.valid(): #check end of list
                                                break
                                        if bouquet.flags & eServiceReference.isDirectory:
@@ -315,8 +335,6 @@ class InfoBarChannelSelection:
                else:
                        self.servicelist.moveUp()
                self.servicelist.zap()
-               if config.usage.show_infobar_on_zap.value:
-                       self.doShow()
 
        def zapDown(self):
                if self.servicelist.inBouquet():
@@ -334,8 +352,6 @@ class InfoBarChannelSelection:
                else:
                        self.servicelist.moveDown()
                self.servicelist.zap()
-               if config.usage.show_infobar_on_zap.value:
-                       self.doShow()
 
 class InfoBarMenu:
        """ Handles a menu action, to open the (main) menu """
@@ -540,10 +556,53 @@ class InfoBarEvent:
                self["Event_Now"] = EventInfo(self.session.nav, EventInfo.NOW)
                self["Event_Next"] = EventInfo(self.session.nav, EventInfo.NEXT)
 
-class InfoBarRadioText:
-       """provides radio (RDS) text info display"""
+class InfoBarRdsDecoder:
+       """provides RDS and Rass support/display"""
        def __init__(self):
-               self["RadioText"] = RadioText(self.session.nav)
+               self.rds_display = self.session.instantiateDialog(RdsInfoDisplay)
+               self.rass_interactive = None
+               
+               self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+                       {
+                               iPlayableService.evEnd: self.__serviceStopped,
+                               iPlayableService.evUpdatedRassSlidePic: self.RassSlidePicChanged
+                       })
+               
+               self["RdsActions"] = HelpableActionMap(self, "InfobarRdsActions",
+               {
+                       "startRassInteractive": (self.startRassInteractive, _("View Rass interactive..."))
+               },-1)
+
+               self["RdsActions"].setEnabled(False)
+
+               self.onLayoutFinish.append(self.rds_display.show)
+               self.rds_display.onRassInteractivePossibilityChanged.append(self.RassInteractivePossibilityChanged)
+
+       def RassInteractivePossibilityChanged(self, state):
+               self["RdsActions"].setEnabled(state)
+
+       def RassSlidePicChanged(self):
+               if not self.rass_interactive:
+                       service = self.session.nav.getCurrentService()
+                       decoder = service and service.rdsDecoder()
+                       if decoder:
+                               decoder.showRassSlidePicture()
+
+       def __serviceStopped(self):
+               if self.rass_interactive is not None:
+                       rass_interactive = self.rass_interactive
+                       self.rass_interactive = None
+                       rass_interactive.close()
+
+       def startRassInteractive(self):
+               self.rds_display.hide()
+               self.rass_interactive = self.session.openWithCallback(self.RassInteractiveClosed, RassInteractive)
+
+       def RassInteractiveClosed(self, *val):
+               if self.rass_interactive is not None:
+                       self.rass_interactive = None
+                       self.RassSlidePicChanged()
+               self.rds_display.show()
 
 class InfoBarServiceName:
        def __init__(self):
@@ -596,6 +655,7 @@ class InfoBarSeek:
 
                self["SeekActions"] = InfoBarSeekActionMap(self, "InfobarSeekActions", 
                        {
+                               "playpauseService": (self.playpauseService, _("pause")),
                                "pauseService": (self.pauseService, _("pause")),
                                "unPauseService": (self.unPauseService, _("continue")),
                                
@@ -608,6 +668,8 @@ class InfoBarSeek:
                        }, prio=-1)
                        # give them a little more priority to win over color buttons
 
+               self["SeekActions"].setEnabled(False)
+
                self.seekstate = self.SEEK_STATE_PLAY
                self.onClose.append(self.delTimer)
                
@@ -692,6 +754,12 @@ class InfoBarSeek:
                self.checkSkipShowHideLock()
 
                return True
+       
+       def playpauseService(self):
+               if self.seekstate != self.SEEK_STATE_PLAY:
+                       self.unPauseService()
+               else:
+                       self.pauseService()
 
        def pauseService(self):
                if self.seekstate == self.SEEK_STATE_PAUSE:
@@ -856,22 +924,26 @@ class InfoBarPVRState:
        def __init__(self, screen=PVRState):
                self.onPlayStateChanged.append(self.__playStateChanged)
                self.pvrStateDialog = self.session.instantiateDialog(screen)
-               self.onShow.append(self.__mayShow)
+               self.onShow.append(self._mayShow)
                self.onHide.append(self.pvrStateDialog.hide)
-       
-       def __mayShow(self):
-               if self.seekstate != self.SEEK_STATE_PLAY and self.execing:
+
+       def _mayShow(self):
+               if self.execing and self.seekstate != self.SEEK_STATE_PLAY:
                        self.pvrStateDialog.show()
 
        def __playStateChanged(self, state):
                playstateString = state[3]
                self.pvrStateDialog["state"].setText(playstateString)
-               self.__mayShow()
+               self._mayShow()
 
 class InfoBarTimeshiftState(InfoBarPVRState):
        def __init__(self):
                InfoBarPVRState.__init__(self, screen=TimeshiftState)
 
+       def _mayShow(self):
+               if self.execing and self.timeshift_enabled:
+                       self.pvrStateDialog.show()
+
 class InfoBarShowMovies:
 
        # i don't really like this class. 
@@ -1314,7 +1386,7 @@ class InfoBarInstantRecord:
        def inputCallback(self, value):
                if value is not None:
                        print "stopping recording after", int(value), "minutes."
-                       self.recording[self.selectedEntry].end = time.time() + 60 * int(value)
+                       self.recording[self.selectedEntry].end = time() + 60 * int(value)
                        self.session.nav.RecordTimer.timeChanged(self.recording[self.selectedEntry])
 
        def instantRecord(self):
@@ -1325,9 +1397,21 @@ class InfoBarInstantRecord:
                        return
 
                if self.isInstantRecordRunning():
-                       self.session.openWithCallback(self.recordQuestionCallback, ChoiceBox, title=_("A recording is currently running.\nWhat do you want to do?"), list=[(_("stop recording"), "stop"), (_("change recording (duration)"), "changeduration"), (_("add recording (indefinitely)"), "indefinitely"), (_("add recording (stop after current event)"), "event"), (_("add recording (enter recording duration)"), "manualduration"), (_("do nothing"), "no")])
+                       self.session.openWithCallback(self.recordQuestionCallback, ChoiceBox, \
+                               title=_("A recording is currently running.\nWhat do you want to do?"), \
+                               list=[(_("stop recording"), "stop"), \
+                               (_("change recording (duration)"), "changeduration"), \
+                               (_("add recording (indefinitely)"), "indefinitely"), \
+                               (_("add recording (stop after current event)"), "event"), \
+                               (_("add recording (enter recording duration)"), "manualduration"), \
+                               (_("do nothing"), "no")])
                else:
-                       self.session.openWithCallback(self.recordQuestionCallback, ChoiceBox, title=_("Start recording?"), list=[(_("add recording (indefinitely)"), "indefinitely"), (_("add recording (stop after current event)"), "event"), (_("add recording (enter recording duration)"), "manualduration"),(_("don't record"), "no")])
+                       self.session.openWithCallback(self.recordQuestionCallback, ChoiceBox, \
+                               title=_("Start recording?"), \
+                               list=[(_("add recording (indefinitely)"), "indefinitely"), \
+                               (_("add recording (stop after current event)"), "event"), \
+                               (_("add recording (enter recording duration)"), "manualduration"), \
+                               (_("don't record"), "no")])
 
 from Tools.ISO639 import LanguageCodes
 
@@ -1451,8 +1535,6 @@ class InfoBarSubserviceSelection:
                                if newservice.valid():
                                        del subservices
                                        del service
-                                       if config.usage.show_infobar_on_zap.value:
-                                               self.doShow()
                                        self.session.nav.playService(newservice)
 
        def subserviceSelection(self):
@@ -1493,8 +1575,6 @@ class InfoBarSubserviceSelection:
                                        self.session.open(SubservicesQuickzap, service[2])
                        else:
                                self["SubserviceQuickzapAction"].setEnabled(True)
-                               if config.usage.show_infobar_on_zap.value:
-                                       self.doShow()
                                self.session.nav.playService(service[1])
 
        def addSubserviceToBouquetCallback(self, service):
@@ -1550,7 +1630,7 @@ class InfoBarAdditionalInfo:
                        self["NimB_Active"].hide()
 
        def checkTunerState(self, service):
-               info = service.frontendInfo()
+               info = service and service.frontendInfo()
                feNumber = info and info.getFrontendInfo(iFrontendInformation.frontendNumber)
                if feNumber is None:
                        self["NimA"].hide()
@@ -1564,7 +1644,7 @@ class InfoBarAdditionalInfo:
 
        def gotServiceEvent(self, ev):
                service = self.session.nav.getCurrentService()
-               if ev == iPlayableService.evStart:
+               if ev == iPlayableService.evUpdatedInfo or ev == iPlayableService.evEnd:
                        self.checkTunerState(service)
 
 class InfoBarNotifications:
@@ -1586,6 +1666,11 @@ class InfoBarNotifications:
                        
                        Notifications.notifications = Notifications.notifications[1:]
                        cb = n[0]
+
+                       if n[3].has_key("onSessionOpenCallback"):
+                               n[3]["onSessionOpenCallback"]()
+                               del n[3]["onSessionOpenCallback"]
+
                        if cb is not None:
                                dlg = self.session.openWithCallback(cb, n[1], *n[2], **n[3])
                        else:
@@ -1884,12 +1969,9 @@ class InfoBarServiceErrorPopupSupport:
                        eDVBServicePMTHandler.eventSOF: None,
                        eDVBServicePMTHandler.eventEOF: None
                }
-               
-               if error not in errors:
-                       error = None
 
-               error = error and errors[error]
-               
+               error = errors.get(error) #this returns None when the key not exist in the dict
+
                if error is not None:
                        Notifications.AddPopup(text = error, type = MessageBox.TYPE_ERROR, timeout = 5, id = "ZapError")
                else: