X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/2bec18885f585972d8a5a7e57a3d997c7c51a280..95c570d26ce81e3dd1e0610ff6c5c0b34d75ba5a:/lib/python/Screens/InfoBarGenerics.py diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index c2d60044..a85bcc97 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -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.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.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 @@ -44,8 +44,6 @@ import time import os import bisect -from Components.config import config, currentConfigSelectionElement - # 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: - 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 @@ -192,7 +192,8 @@ class InfoBarNumberZap: # 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) @@ -240,7 +241,7 @@ class InfoBarNumberZap: 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 @@ -249,7 +250,7 @@ class InfoBarChannelSelection: #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", @@ -277,7 +278,7 @@ class InfoBarChannelSelection: def firstRun(self): self.onShown.remove(self.firstRun) - config.misc.initialchannelselection.value = 0 + config.misc.initialchannelselection.value = False config.misc.initialchannelselection.save() self.switchChannelDown() @@ -304,7 +305,7 @@ class InfoBarChannelSelection: 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() @@ -314,7 +315,8 @@ class InfoBarChannelSelection: 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(): @@ -322,7 +324,7 @@ class InfoBarChannelSelection: 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() @@ -332,7 +334,8 @@ class InfoBarChannelSelection: 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 """ @@ -341,12 +344,21 @@ class InfoBarMenu: { "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'!" - 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 """ @@ -528,6 +540,11 @@ 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""" + def __init__(self): + self["RadioText"] = RadioText(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 - 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: @@ -827,6 +845,11 @@ class InfoBarSeek: 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: @@ -922,8 +945,8 @@ class InfoBarTimeshift: 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: @@ -1022,72 +1045,151 @@ class InfoBarTimeshift: from Screens.PiPSetup import PiPSetup class InfoBarExtensions: - def __init__(self, useServicePath = True): - self.session.pipshown = False - self.useServicePath = useServicePath + EXTENSION_SINGLE = 0 + EXTENSION_LIST = 1 + + def __init__(self): + self.list = [] self["InstantExtensionsActions"] = HelpableActionMap(self, "InfobarExtensions", { - "extensions": (self.extensions, _("view extensions...")), + "extensions": (self.showExtensionSelection, _("view extensions...")), }) - PIPON = 0 - PIPOFF = 1 - MOVEPIP = 2 - PIPSWAP = 3 - ENABLE_SUBTITLE = 4 + def addExtension(self, extension, key = None, type = EXTENSION_SINGLE): + self.list.append((type, extension, key)) + + def updateExtension(self, extension, key = None): + self.extensionsList.append(extension) + if key is not None: + if self.extensionKeys.has_key(key): + key = None + + if key is None: + for x in self.availableKeys: + if not self.extensionKeys.has_key(x): + key = x + break + + if key is not None: + self.extensionKeys[key] = len(self.extensionsList) - 1 + + def updateExtensions(self): + self.extensionsList = [] + self.availableKeys = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "red", "green", "yellow", "blue" ] + self.extensionKeys = {} + for x in self.list: + if x[0] == self.EXTENSION_SINGLE: + self.updateExtension(x[1], x[2]) + else: + for y in x[1](): + self.updateExtension(y[0], y[1]) + - def extensions(self): + def showExtensionSelection(self): + self.updateExtensions() + extensionsList = self.extensionsList[:] + keys = [] list = [] - if self.session.pipshown == False: - list.append((_("Activate Picture in Picture"), self.PIPON)) - elif self.session.pipshown == True: - list.append((_("Disable Picture in Picture"), self.PIPOFF)) - list.append((_("Move Picture in Picture"), self.MOVEPIP)) - list.append((_("Swap services"), self.PIPSWAP)) + for x in self.availableKeys: + if self.extensionKeys.has_key(x): + entry = self.extensionKeys[x] + extension = self.extensionsList[entry] + if extension[2](): + name = str(extension[0]()) + list.append((extension[0](), extension)) + keys.append(x) + extensionsList.remove(extension) + else: + extensionsList.remove(extension) + for x in extensionsList: + list.append((x[0](), x)) + keys += [""] * len(extensionsList) + self.session.openWithCallback(self.extensionCallback, ChoiceBox, title=_("Please choose an extension..."), list = list, keys = keys) + + def extensionCallback(self, answer): + if answer is not None: + answer[1][1]() + +from Tools.BoundFunction import boundFunction + +# depends on InfoBarExtensions +from Components.PluginComponent import plugins + +class InfoBarPlugins: + def __init__(self): + self.addExtension(extension = self.getPluginList, type = InfoBarExtensions.EXTENSION_LIST) - s = self.getCurrentServiceSubtitle() - l = s and s.getSubtitleList() or [ ] - for x in l: - list.append(("Enable Subtitles: " + x[0], self.ENABLE_SUBTITLE, x[1])) + def getPluginName(self, name): + return name - self.session.openWithCallback(self.extensionCallback, ChoiceBox, title=_("Please choose an extension..."), list = list) + def getPluginList(self): + list = [] + 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 - def extensionCallback(self, answer): - if answer is not None: - if answer[1] == self.PIPON: - self.session.pip = self.session.instantiateDialog(PictureInPicture) - newservice = self.session.nav.getCurrentlyPlayingServiceReference() - if self.session.pip.playService(newservice): - self.session.pipshown = True - if self.useServicePath: - self.session.pip.servicePath = self.servicelist.getCurrentServicePath() - else: - self.session.pipshown = False - del self.session.pip - self.session.nav.playService(newservice) - elif answer[1] == self.PIPOFF: - del self.session.pip + def runPlugin(self, plugin): + plugin(session = self.session) + +# depends on InfoBarExtensions +class InfoBarPiP: + def __init__(self): + self.session.pipshown = False + + 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 pipShown(self): + return self.session.pipshown + + def getShowHideName(self): + if self.session.pipshown: + return _("Disable Picture in Picture") + else: + return _("Activate Picture in Picture") + + def getSwapName(self): + return _("Swap Services") + + def getMoveName(self): + return _("Move Picture in Picture") + + def showPiP(self): + if self.session.pipshown: + del self.session.pip + self.session.pipshown = False + else: + self.session.pip = self.session.instantiateDialog(PictureInPicture) + newservice = self.session.nav.getCurrentlyPlayingServiceReference() + if self.session.pip.playService(newservice): + self.session.pipshown = True + self.session.pip.servicePath = self.servicelist.getCurrentServicePath() + else: self.session.pipshown = False - elif answer[1] == self.PIPSWAP: - swapservice = self.session.nav.getCurrentlyPlayingServiceReference() - if self.useServicePath: - if self.session.pip.servicePath: - servicepath = self.servicelist.getCurrentServicePath() - ref=servicepath[len(servicepath)-1] - pipref=self.session.pip.getCurrentService() - self.session.pip.playService(swapservice) - self.servicelist.setCurrentServicePath(self.session.pip.servicePath) - if pipref.toString() != ref.toString(): # is a subservice ? - self.session.nav.stopService() # stop portal - self.session.nav.playService(pipref) # start subservice - self.session.pip.servicePath=servicepath - elif answer[1] == self.MOVEPIP: - self.session.open(PiPSetup, pip = self.session.pip) - elif answer[1] == self.ENABLE_SUBTITLE: - self.selected_subtitle = answer[2] - self.subtitles_enabled = True + del self.session.pip + self.session.nav.playService(newservice) + + def swapPiP(self): + swapservice = self.session.nav.getCurrentlyPlayingServiceReference() + if self.session.pip.servicePath: + servicepath = self.servicelist.getCurrentServicePath() + ref=servicepath[len(servicepath)-1] + pipref=self.session.pip.getCurrentService() + self.session.pip.playService(swapservice) + self.servicelist.setCurrentServicePath(self.session.pip.servicePath) + if pipref.toString() != ref.toString(): # is a subservice ? + self.session.nav.stopService() # stop portal + self.session.nav.playService(pipref) # start subservice + self.session.pip.servicePath=servicepath + + def movePiP(self): + self.session.open(PiPSetup, pip = self.session.pip) from RecordTimer import parseEvent @@ -1287,7 +1389,6 @@ class InfoBarAudioSelection: self.audioChannel.selectChannel(mode[1]) del self.audioChannel - class InfoBarSubserviceSelection: def __init__(self): self["SubserviceSelectionAction"] = HelpableActionMap(self, "InfobarSubserviceSelectionActions", @@ -1337,6 +1438,8 @@ 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): @@ -1368,6 +1471,8 @@ 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]) class InfoBarAdditionalInfo: @@ -1598,10 +1703,10 @@ class InfoBarCueSheetSupport: class InfoBarSummary(Screen): skin = """ - + WithSeconds - + Name """ @@ -1645,14 +1750,24 @@ class InfoBarSubtitleSupport(object): self.__event_tracker = ServiceEventTracker(screen=self, eventmap= { iPlayableService.evStart: self.__serviceStarted, + iPlayableService.evUpdatedInfo: self.__updatedInfo }) def __serviceStarted(self): - # reenable if it was enabled - r = self.__subtitles_enabled + self.cached_subtitle_checked = False + self.subtitle_window.hide() self.__subtitles_enabled = False - self.__selected_subtitle = None - self.setSubtitlesEnable(r) + + def __updatedInfo(self): + if not self.cached_subtitle_checked: + subtitle = self.getCurrentServiceSubtitle() + self.cached_subtitle_checked = True + if subtitle: + self.__selected_subtitle = subtitle.getCachedSubtitle() + if self.__selected_subtitle: + subtitle.enableSubtitles(self.subtitle_window.instance, self.selected_subtitle) + self.subtitle_window.show() + self.__subtitles_enabled = True def getCurrentServiceSubtitle(self): service = self.session.nav.getCurrentService() @@ -1660,7 +1775,7 @@ class InfoBarSubtitleSupport(object): 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() @@ -1668,17 +1783,11 @@ class InfoBarSubtitleSupport(object): else: if subtitle: subtitle.disableSubtitles(self.subtitle_window.instance) - - self.subtitle_window.hide() self.__subtitles_enabled = False + self.subtitle_window.hide() def setSelectedSubtitle(self, subtitle): - if self.__selected_subtitle != subtitle and self.subtitles_enabled: - # kick - self.__selected_subtitle = subtitle - self.__serviceStarted() - else: - self.__selected_subtitle = subtitle + self.__selected_subtitle = subtitle subtitles_enabled = property(lambda self: self.__subtitles_enabled, setSubtitlesEnable) selected_subtitle = property(lambda self: self.__selected_subtitle, setSelectedSubtitle)