move subtitles selection to mainmenu, some subtitle fixes
[enigma2.git] / lib / python / Screens / InfoBarGenerics.py
index f2516c4b56d02237c2b92ec28453e39ecb0cc0fd..b69ef4e1e0981f4f18d06be215468f396d2b0416 100644 (file)
@@ -12,12 +12,12 @@ from Components.ProgressBar import *
 from Components.ServiceEventTracker import ServiceEventTracker
 from Components.Sources.CurrentService import CurrentService
 from Components.Sources.EventInfo import EventInfo
 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
 from Components.TimerList import TimerEntryComponent
 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, configElement, ConfigSubsection, configSequence, configElementBoolean, configSelection, configElement_nonSave, getConfigListEntry
-from Components.config import configfile, configsequencearg
+from Components.config import config, ConfigBoolean
 
 from EpgSelection import EPGSelection
 from Plugins.Plugin import PluginDescriptor
 
 from EpgSelection import EPGSelection
 from Plugins.Plugin import PluginDescriptor
@@ -44,8 +44,6 @@ import time
 import os
 import bisect
 
 import os
 import bisect
 
-from Components.config import config, currentConfigSelectionElement
-
 # hack alert!
 from Menu import MainMenu, mdom
 
 # hack alert!
 from Menu import MainMenu, mdom
 
@@ -87,7 +85,9 @@ class InfoBarShowHide:
        
        def startHideTimer(self):
                if self.__state == self.STATE_SHOWN and not self.__locked:
        
        def startHideTimer(self):
                if self.__state == self.STATE_SHOWN and not self.__locked:
-                       self.hideTimer.start(5000, True)
+                       idx = config.usage.infobar_timeout.index
+                       if idx:
+                               self.hideTimer.start(idx*1000, True)
 
        def __onHide(self):
                self.__state = self.STATE_HIDDEN
 
        def __onHide(self):
                self.__state = self.STATE_HIDDEN
@@ -192,7 +192,8 @@ class InfoBarNumberZap:
 #              print "You pressed number " + str(number)
                if number == 0:
                        self.servicelist.recallPrevService()
 #              print "You pressed number " + str(number)
                if number == 0:
                        self.servicelist.recallPrevService()
-                       self.doShow()
+                       if config.usage.show_infobar_on_zap.value:
+                               self.doShow()
                else:
                        self.session.openWithCallback(self.numberEntered, NumberZap, number)
 
                else:
                        self.session.openWithCallback(self.numberEntered, NumberZap, number)
 
@@ -240,7 +241,7 @@ class InfoBarNumberZap:
                        self.servicelist.setCurrentSelection(service) #select the service in servicelist
                        self.servicelist.zap()
 
                        self.servicelist.setCurrentSelection(service) #select the service in servicelist
                        self.servicelist.zap()
 
-config.misc.initialchannelselection = configElementBoolean("config.misc.initialchannelselection", 1);
+config.misc.initialchannelselection = ConfigBoolean(default = True)
 
 class InfoBarChannelSelection:
        """ ChannelSelection - handles the channelSelection dialog and the initial 
 
 class InfoBarChannelSelection:
        """ ChannelSelection - handles the channelSelection dialog and the initial 
@@ -249,7 +250,7 @@ class InfoBarChannelSelection:
                #instantiate forever
                self.servicelist = self.session.instantiateDialog(ChannelSelection)
                
                #instantiate forever
                self.servicelist = self.session.instantiateDialog(ChannelSelection)
                
-               if config.misc.initialchannelselection.value == 1:
+               if config.misc.initialchannelselection.value:
                        self.onShown.append(self.firstRun)
 
                self["ChannelSelectActions"] = HelpableActionMap(self, "InfobarChannelSelection",
                        self.onShown.append(self.firstRun)
 
                self["ChannelSelectActions"] = HelpableActionMap(self, "InfobarChannelSelection",
@@ -277,7 +278,7 @@ class InfoBarChannelSelection:
 
        def firstRun(self):
                self.onShown.remove(self.firstRun)
 
        def firstRun(self):
                self.onShown.remove(self.firstRun)
-               config.misc.initialchannelselection.value = 0
+               config.misc.initialchannelselection.value = False
                config.misc.initialchannelselection.save()
                self.switchChannelDown()
 
                config.misc.initialchannelselection.save()
                self.switchChannelDown()
 
@@ -304,7 +305,7 @@ class InfoBarChannelSelection:
                        if prev:
                                prev = prev.toString()
                                while True:
                        if prev:
                                prev = prev.toString()
                                while True:
-                                       if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes":
+                                       if config.usage.quickzap_bouquet_change.value:
                                                if self.servicelist.atBegin():
                                                        self.servicelist.prevBouquet()
                                        self.servicelist.moveUp()
                                                if self.servicelist.atBegin():
                                                        self.servicelist.prevBouquet()
                                        self.servicelist.moveUp()
@@ -314,7 +315,8 @@ class InfoBarChannelSelection:
                else:
                        self.servicelist.moveUp()
                self.servicelist.zap()
                else:
                        self.servicelist.moveUp()
                self.servicelist.zap()
-               self.doShow()
+               if config.usage.show_infobar_on_zap.value:
+                       self.doShow()
 
        def zapDown(self):
                if self.servicelist.inBouquet():
 
        def zapDown(self):
                if self.servicelist.inBouquet():
@@ -322,7 +324,7 @@ class InfoBarChannelSelection:
                        if prev:
                                prev = prev.toString()
                                while True:
                        if prev:
                                prev = prev.toString()
                                while True:
-                                       if currentConfigSelectionElement(config.usage.quickzap_bouquet_change) == "yes" and self.servicelist.atEnd():
+                                       if config.usage.quickzap_bouquet_change.value and self.servicelist.atEnd():
                                                self.servicelist.nextBouquet()
                                        else:
                                                self.servicelist.moveDown()
                                                self.servicelist.nextBouquet()
                                        else:
                                                self.servicelist.moveDown()
@@ -332,7 +334,8 @@ class InfoBarChannelSelection:
                else:
                        self.servicelist.moveDown()
                self.servicelist.zap()
                else:
                        self.servicelist.moveDown()
                self.servicelist.zap()
-               self.doShow()
+               if config.usage.show_infobar_on_zap.value:
+                       self.doShow()
 
 class InfoBarMenu:
        """ Handles a menu action, to open the (main) menu """
 
 class InfoBarMenu:
        """ Handles a menu action, to open the (main) menu """
@@ -341,12 +344,21 @@ class InfoBarMenu:
                        {
                                "mainMenu": (self.mainMenu, _("Enter main menu...")),
                        })
                        {
                                "mainMenu": (self.mainMenu, _("Enter main menu...")),
                        })
+               self.session.infobar = None
 
        def mainMenu(self):
                print "loading mainmenu XML..."
                menu = mdom.childNodes[0]
                assert menu.tagName == "menu", "root element in menu must be 'menu'!"
 
        def mainMenu(self):
                print "loading mainmenu XML..."
                menu = mdom.childNodes[0]
                assert menu.tagName == "menu", "root element in menu must be 'menu'!"
-               self.session.open(MainMenu, menu, menu.childNodes)
+
+               self.session.infobar = self
+               # so we can access the currently active infobar from screens opened from within the mainmenu
+               # at the moment used from the SubserviceSelection
+
+               self.session.openWithCallback(self.mainMenuClosed, MainMenu, menu, menu.childNodes)
+
+       def mainMenuClosed(self, *val):
+               self.session.infobar = None
 
 class InfoBarSimpleEventView:
        """ Opens the Eventview for now/next """
 
 class InfoBarSimpleEventView:
        """ Opens the Eventview for now/next """
@@ -528,6 +540,11 @@ class InfoBarEvent:
                self["Event_Now"] = EventInfo(self.session.nav, EventInfo.NOW)
                self["Event_Next"] = EventInfo(self.session.nav, EventInfo.NEXT)
 
                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"""
+       def __init__(self):
+               self["RadioText"] = RadioText(self.session.nav)
+
 class InfoBarServiceName:
        def __init__(self):
                self["CurrentService"] = CurrentService(self.session.nav)
 class InfoBarServiceName:
        def __init__(self):
                self["CurrentService"] = CurrentService(self.session.nav)
@@ -801,13 +818,14 @@ class InfoBarSeek:
        def checkSkipShowHideLock(self):
                wantlock = self.seekstate != self.SEEK_STATE_PLAY
                
        def checkSkipShowHideLock(self):
                wantlock = self.seekstate != self.SEEK_STATE_PLAY
                
-               if self.lockedBecauseOfSkipping and not wantlock:
-                       self.unlockShow()
-                       self.lockedBecauseOfSkipping = False
+               if config.usage.show_infobar_on_zap.value:
+                       if self.lockedBecauseOfSkipping and not wantlock:
+                               self.unlockShow()
+                               self.lockedBecauseOfSkipping = False
                
                
-               if wantlock and not self.lockedBecauseOfSkipping:
-                       self.lockShow()
-                       self.lockedBecauseOfSkipping = True
+                       if wantlock and not self.lockedBecauseOfSkipping:
+                               self.lockShow()
+                               self.lockedBecauseOfSkipping = True
 
        def __evEOF(self):
                if self.seekstate != self.SEEK_STATE_PLAY:
 
        def __evEOF(self):
                if self.seekstate != self.SEEK_STATE_PLAY:
@@ -827,6 +845,11 @@ class InfoBarSeek:
                if seekable is not None:
                        seekable.seekRelative(1, diff)
 
                if seekable is not None:
                        seekable.seekRelative(1, diff)
 
+       def seekAbsolute(self, abs):
+               seekable = self.getSeek()
+               if seekable is not None:
+                       seekable.seekTo(abs)
+
 from Screens.PVRState import PVRState, TimeshiftState
 
 class InfoBarPVRState:
 from Screens.PVRState import PVRState, TimeshiftState
 
 class InfoBarPVRState:
@@ -922,8 +945,8 @@ class InfoBarTimeshift:
                print "enable timeshift"
                ts = self.getTimeshift()
                if ts is None:
                print "enable timeshift"
                ts = self.getTimeshift()
                if ts is None:
-#                      self.session.open(MessageBox, _("Timeshift not possible!"), MessageBox.TYPE_ERROR)
-#                      print "no ts interface"
+                       self.session.open(MessageBox, _("Timeshift not possible!"), MessageBox.TYPE_ERROR)
+                       print "no ts interface"
                        return 0;
                
                if self.timeshift_enabled:
                        return 0;
                
                if self.timeshift_enabled:
@@ -1090,47 +1113,34 @@ class InfoBarExtensions:
 
 from Tools.BoundFunction import boundFunction
 
 
 from Tools.BoundFunction import boundFunction
 
-# depends on InfoBarExtensions and InfoBarSubtitleSupport
-class InfoBarSubtitles:
+# depends on InfoBarExtensions
+from Components.PluginComponent import plugins
+
+class InfoBarPlugins:
        def __init__(self):
        def __init__(self):
-               self.addExtension((self.getDisableSubtitleName, self.disableSubtitles, self.subtitlesEnabled), "4")
-               self.addExtension(extension = self.getSubtitleList, type = InfoBarExtensions.EXTENSION_LIST)
+               self.addExtension(extension = self.getPluginList, type = InfoBarExtensions.EXTENSION_LIST)
                
                
-       def getDisableSubtitleName(self):
-               return _("Disable subtitles")
-
-       def getSubtitleList(self):
+               
+       def getPluginName(self, name):
+               return name
+               
+       def getPluginList(self):
                list = []
                list = []
-               s = self.getCurrentServiceSubtitle()
-               l = s and s.getSubtitleList() or [ ]
-
-               for x in l:
-                       list.append(((boundFunction(self.getSubtitleEntryName, x[0]), boundFunction(self.enableSubtitle, x[1]), lambda: True), None))
+               for p in plugins.getPlugins(where = PluginDescriptor.WHERE_EXTENSIONSMENU):
+                       list.append(((boundFunction(self.getPluginName, p.name), boundFunction(self.runPlugin, p), lambda: True), None))
                return list
                return list
-       
-       def getSubtitleEntryName(self, name):
-               return "Enable Subtitles: " + name
 
 
-       def enableSubtitle(self, subtitles):
-               print "enable subitles", subtitles
-               self.selected_subtitle = subtitles
-               self.subtitles_enabled = True
-               
-       def subtitlesEnabled(self):
-               return self.subtitles_enabled
-               
-       def disableSubtitles(self):
-               self.subtitles_enabled = False
+       def runPlugin(self, plugin):
+               plugin(session = self.session)
 
 # depends on InfoBarExtensions
 class InfoBarPiP:
        def __init__(self):
                self.session.pipshown = False
 
 # depends on InfoBarExtensions
 class InfoBarPiP:
        def __init__(self):
                self.session.pipshown = False
-               
-               self.addExtension((self.getShowHideName, self.showPiP, self.available), "1")
-               self.addExtension((self.getMoveName, self.movePiP, self.pipShown), "2")
-               self.addExtension((self.getSwapName, self.swapPiP, self.pipShown), "3")
 
 
+               self.addExtension((self.getShowHideName, self.showPiP, self.available), "blue")
+               self.addExtension((self.getMoveName, self.movePiP, self.pipShown), "green")
+               self.addExtension((self.getSwapName, self.swapPiP, self.pipShown), "yellow")
        
        def available(self):
                return True
        
        def available(self):
                return True
@@ -1379,7 +1389,6 @@ class InfoBarAudioSelection:
                        self.audioChannel.selectChannel(mode[1])
                del self.audioChannel
 
                        self.audioChannel.selectChannel(mode[1])
                del self.audioChannel
 
-               
 class InfoBarSubserviceSelection:
        def __init__(self):
                self["SubserviceSelectionAction"] = HelpableActionMap(self, "InfobarSubserviceSelectionActions",
 class InfoBarSubserviceSelection:
        def __init__(self):
                self["SubserviceSelectionAction"] = HelpableActionMap(self, "InfobarSubserviceSelectionActions",
@@ -1429,6 +1438,8 @@ class InfoBarSubserviceSelection:
                                if newservice.valid():
                                        del subservices
                                        del service
                                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):
                                        self.session.nav.playService(newservice)
 
        def subserviceSelection(self):
@@ -1460,6 +1471,8 @@ class InfoBarSubserviceSelection:
                                        self.session.open(SubservicesQuickzap, service[2])
                        else:
                                self["SubserviceQuickzapAction"].setEnabled(True)
                                        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])
 
 class InfoBarAdditionalInfo:
                                self.session.nav.playService(service[1])
 
 class InfoBarAdditionalInfo:
@@ -1690,10 +1703,10 @@ class InfoBarCueSheetSupport:
 class InfoBarSummary(Screen):
        skin = """
        <screen position="0,0" size="132,64">
 class InfoBarSummary(Screen):
        skin = """
        <screen position="0,0" size="132,64">
-               <widget source="CurrentTime" render="Label" position="50,46" size="82,18" font="Regular;16" >
+               <widget source="CurrentTime" render="Label" position="56,46" size="82,18" font="Regular;16" >
                        <convert type="ClockToText">WithSeconds</convert>
                </widget>
                        <convert type="ClockToText">WithSeconds</convert>
                </widget>
-               <widget source="CurrentService" render="Label" position="0,4" size="132,42" font="Regular;18" >
+               <widget source="CurrentService" render="Label" position="6,4" size="120,42" font="Regular;18" >
                        <convert type="ServiceName">Name</convert>
                </widget>
        </screen>"""
                        <convert type="ServiceName">Name</convert>
                </widget>
        </screen>"""
@@ -1752,7 +1765,7 @@ class InfoBarSubtitleSupport(object):
        
        def setSubtitlesEnable(self, enable=True):
                subtitle = self.getCurrentServiceSubtitle()
        
        def setSubtitlesEnable(self, enable=True):
                subtitle = self.getCurrentServiceSubtitle()
-               if enable and self.__selected_subtitle:
+               if enable and self.__selected_subtitle is not None:
                        if subtitle and not self.__subtitles_enabled:
                                subtitle.enableSubtitles(self.subtitle_window.instance, self.selected_subtitle)
                                self.subtitle_window.show()
                        if subtitle and not self.__subtitles_enabled:
                                subtitle.enableSubtitles(self.subtitle_window.instance, self.selected_subtitle)
                                self.subtitle_window.show()