X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/2d0415e7e8866d056d245f76d32b991828a3b3c8..a9589a258f6173fc8af17d802def10d0d918bc16:/lib/python/Screens/InfoBarGenerics.py diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index 9e0e50af..1594b3a5 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -369,25 +369,53 @@ class InfoBarSimpleEventView: }) def openEventView(self): - self.epglist = [ ] + epglist = [ ] + self.epglist = epglist service = self.session.nav.getCurrentService() ref = self.session.nav.getCurrentlyPlayingServiceReference() info = service.info() ptr=info.getEvent(0) if ptr: - self.epglist.append(ptr) + epglist.append(ptr) ptr=info.getEvent(1) if ptr: - self.epglist.append(ptr) - if len(self.epglist) > 0: - self.session.open(EventViewSimple, self.epglist[0], ServiceReference(ref), self.eventViewCallback) + epglist.append(ptr) + if epglist: + self.session.open(EventViewSimple, epglist[0], ServiceReference(ref), self.eventViewCallback) def eventViewCallback(self, setEvent, setService, val): #used for now/next displaying - if len(self.epglist) > 1: - tmp = self.epglist[0] - self.epglist[0]=self.epglist[1] - self.epglist[1]=tmp - setEvent(self.epglist[0]) + epglist = self.epglist + if len(epglist) > 1: + tmp = epglist[0] + epglist[0] = epglist[1] + epglist[1] = tmp + setEvent(epglist[0]) + +class SimpleServicelist: + def __init__(self, services): + self.services = services + self.length = len(services) + self.current = 0 + + def selectService(self, service): + self.current = 0 + while self.services[self.current].ref != service: + self.current += 1 + + def nextService(self): + if self.current+1 < self.length: + self.current += 1 + else: + self.current = 0 + + def prevService(self): + if self.current-1 > -1: + self.current -= 1 + else: + self.current = self.length - 1 + + def currentService(self): + return self.services[self.current] class InfoBarEPG: """ EPG - Opens an EPG list when the showEPGList action fires """ @@ -440,7 +468,7 @@ class InfoBarEPG: def openBouquetEPG(self, bouquet, withCallback=True): services = self.getBouquetServices(bouquet) - if len(services): + if services: self.epg_bouquet = bouquet if withCallback: self.dlg_stack.append(self.session.openWithCallback(self.closed, EPGSelection, services, self.zapToService, None, self.changeBouquetCB)) @@ -455,7 +483,7 @@ class InfoBarEPG: self.bouquetSel.up() bouquet = self.bouquetSel.getCurrent() services = self.getBouquetServices(bouquet) - if len(services): + if services: self.epg_bouquet = bouquet epg.setServices(services) @@ -485,15 +513,33 @@ class InfoBarEPG: elif cnt == 1: self.openBouquetEPG(bouquets[0][1], withCallback) + def changeServiceCB(self, direction, epg): + if self.serviceSel: + if direction > 0: + self.serviceSel.nextService() + else: + self.serviceSel.prevService() + epg.setService(self.serviceSel.currentService()) + + def SingleServiceEPGClosed(self, ret=False): + self.serviceSel = None + def openSingleServiceEPG(self): ref=self.session.nav.getCurrentlyPlayingServiceReference() - self.session.open(EPGSelection, ref) + if ref: + if self.servicelist.getMutableList() is not None: # bouquet in channellist + current_path = self.servicelist.getRoot() + services = self.getBouquetServices(current_path) + self.serviceSel = SimpleServicelist(services) + self.serviceSel.selectService(ref) + self.session.openWithCallback(self.SingleServiceEPGClosed, EPGSelection, ref, serviceChangeCB = self.changeServiceCB) + else: + self.session.open(EPGSelection, ref) def showEventInfoPlugins(self): - list = [] - for p in plugins.getPlugins(where = PluginDescriptor.WHERE_EVENTINFO): - list.append((p.name, boundFunction(self.runPlugin, p))) - if len(list): + list = [(p.name, boundFunction(self.runPlugin, p)) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_EVENTINFO)] + + if list: list.append((_("show single service EPG..."), self.openSingleServiceEPG)) self.session.openWithCallback(self.EventInfoPluginChosen, ChoiceBox, title=_("Please choose an extension..."), list = list) else: @@ -510,38 +556,40 @@ class InfoBarEPG: self.session.open(EPGSelection, refstr, None, eventid) def getNowNext(self): - self.epglist = [ ] + epglist = [ ] service = self.session.nav.getCurrentService() info = service and service.info() ptr = info and info.getEvent(0) if ptr: - self.epglist.append(ptr) + epglist.append(ptr) ptr = info and info.getEvent(1) if ptr: - self.epglist.append(ptr) + epglist.append(ptr) + self.epglist = epglist def __evEventInfoChanged(self): if self.is_now_next and len(self.dlg_stack) == 1: self.getNowNext() assert self.eventView - if len(self.epglist): + if self.epglist: self.eventView.setEvent(self.epglist[0]) def openEventView(self): ref = self.session.nav.getCurrentlyPlayingServiceReference() self.getNowNext() - if len(self.epglist) == 0: + epglist = self.epglist + if not epglist: self.is_now_next = False epg = eEPGCache.getInstance() ptr = ref and ref.valid() and epg.lookupEventTime(ref, -1) if ptr: - self.epglist.append(ptr) + epglist.append(ptr) ptr = epg.lookupEventTime(ref, ptr.getBeginTime(), +1) if ptr: - self.epglist.append(ptr) + epglist.append(ptr) else: self.is_now_next = True - if len(self.epglist) > 0: + if epglist: self.eventView = self.session.openWithCallback(self.closed, EventViewEPGSelect, self.epglist[0], ServiceReference(ref), self.eventViewCallback, self.openSingleServiceEPG, self.openMultiServiceEPG, self.openSimilarList) self.dlg_stack.append(self.eventView) else: @@ -549,11 +597,12 @@ class InfoBarEPG: self.openMultiServiceEPG(False) def eventViewCallback(self, setEvent, setService, val): #used for now/next displaying - if len(self.epglist) > 1: - tmp = self.epglist[0] - self.epglist[0]=self.epglist[1] - self.epglist[1]=tmp - setEvent(self.epglist[0]) + epglist = self.epglist + if len(epglist) > 1: + tmp = epglist[0] + epglist[0]=epglist[1] + epglist[1]=tmp + setEvent(epglist[0]) class InfoBarRdsDecoder: """provides RDS and Rass support/display""" @@ -640,9 +689,9 @@ class InfoBarSeek: return 1 elif action[:8] == "seekdef:": key = int(action[8:]) - time = [-config.seek.selfdefined_13.value, False, config.seek.selfdefined_13.value, + time = (-config.seek.selfdefined_13.value, False, config.seek.selfdefined_13.value, -config.seek.selfdefined_46.value, False, config.seek.selfdefined_46.value, - -config.seek.selfdefined_79.value, False, config.seek.selfdefined_79.value][key-1] + -config.seek.selfdefined_79.value, False, config.seek.selfdefined_79.value)[key-1] self.screen.doSeekRelative(time * 90000) return 1 else: @@ -712,7 +761,7 @@ class InfoBarSeek: return False def getLower(self, n, lst): - lst = lst+[] + lst = lst[:] lst.reverse() for x in lst: if x < n: @@ -770,7 +819,7 @@ class InfoBarSeek: return False if not self.isSeekable(): - if state not in [self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE]: + if state not in (self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE): state = self.SEEK_STATE_PLAY pauseable = service.pause() @@ -782,7 +831,7 @@ class InfoBarSeek: oldstate = self.seekstate self.seekstate = state - for i in range(3): + for i in (0, 1, 2): if oldstate[i] != self.seekstate[i]: (self.session.nav.pause, pauseable.setFastForward, pauseable.setSlowMotion)[i](self.seekstate[i]) @@ -883,30 +932,31 @@ class InfoBarSeek: self.setSeekState(self.makeStateSlowMotion(speed)) def seekBack(self): - if self.seekstate == self.SEEK_STATE_PLAY: + seekstate = self.seekstate + if seekstate == self.SEEK_STATE_PLAY: self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value))) - elif self.seekstate == self.SEEK_STATE_EOF: + elif seekstate == self.SEEK_STATE_EOF: self.setSeekState(self.makeStateBackward(int(config.seek.enter_backward.value))) self.doSeekRelative(-6) - elif self.seekstate == self.SEEK_STATE_PAUSE: + elif seekstate == self.SEEK_STATE_PAUSE: self.doSeekRelative(-3) - elif self.isStateForward(self.seekstate): - speed = self.seekstate[1] - if self.seekstate[2]: - speed /= self.seekstate[2] + elif self.isStateForward(seekstate): + speed = seekstate[1] + if seekstate[2]: + speed /= seekstate[2] speed = self.getLower(speed, config.seek.speeds_forward.value) if speed: self.setSeekState(self.makeStateForward(speed)) else: self.setSeekState(self.SEEK_STATE_PLAY) - elif self.isStateBackward(self.seekstate): - speed = -self.seekstate[1] - if self.seekstate[2]: - speed /= self.seekstate[2] + elif self.isStateBackward(seekstate): + speed = -seekstate[1] + if seekstate[2]: + speed /= seekstate[2] speed = self.getHigher(speed, config.seek.speeds_backward.value) or config.seek.speeds_backward.value[-1] self.setSeekState(self.makeStateBackward(speed)) - elif self.isStateSlowMotion(self.seekstate): - speed = self.getHigher(self.seekstate[2], config.seek.speeds_slowmotion.value) + elif self.isStateSlowMotion(seekstate): + speed = self.getHigher(seekstate[2], config.seek.speeds_slowmotion.value) if speed: self.setSeekState(self.makeStateSlowMotion(speed)) else: @@ -992,7 +1042,7 @@ class InfoBarSeek: self.eofState = 0 if not self.seekstate == self.SEEK_STATE_PAUSE: self.setSeekState(self.SEEK_STATE_EOF) - if eofstate == -1 or not seekstate in [self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE]: + if eofstate == -1 or not seekstate in (self.SEEK_STATE_PLAY, self.SEEK_STATE_PAUSE): seekable = self.getSeek() if seekable is not None: seekable.seekTo(-1) @@ -1011,11 +1061,12 @@ class InfoBarSeek: from Screens.PVRState import PVRState, TimeshiftState class InfoBarPVRState: - def __init__(self, screen=PVRState): + def __init__(self, screen=PVRState, force_show = False): self.onPlayStateChanged.append(self.__playStateChanged) self.pvrStateDialog = self.session.instantiateDialog(screen) self.onShow.append(self._mayShow) self.onHide.append(self.pvrStateDialog.hide) + self.force_show = force_show def _mayShow(self): if self.execing and self.seekstate != self.SEEK_STATE_PLAY: @@ -1026,7 +1077,7 @@ class InfoBarPVRState: self.pvrStateDialog["state"].setText(playstateString) # if we return into "PLAY" state, ensure that the dialog gets hidden if there will be no infobar displayed - if not config.usage.show_infobar_on_skip.value and self.seekstate == self.SEEK_STATE_PLAY: + if not config.usage.show_infobar_on_skip.value and self.seekstate == self.SEEK_STATE_PLAY and not self.force_show: self.pvrStateDialog.hide() else: self._mayShow() @@ -1034,7 +1085,7 @@ class InfoBarPVRState: class InfoBarTimeshiftState(InfoBarPVRState): def __init__(self): - InfoBarPVRState.__init__(self, screen=TimeshiftState) + InfoBarPVRState.__init__(self, screen=TimeshiftState, force_show = True) def _mayShow(self): if self.execing and self.timeshift_enabled and self.seekstate != self.SEEK_STATE_PLAY: @@ -1221,7 +1272,7 @@ class InfoBarExtensions: self["InstantExtensionsActions"] = HelpableActionMap(self, "InfobarExtensions", { "extensions": (self.showExtensionSelection, _("view extensions...")), - }) + }, 1) # lower priority def addExtension(self, extension, key = None, type = EXTENSION_SINGLE): self.list.append((type, extension, key)) @@ -1269,8 +1320,8 @@ class InfoBarExtensions: extensionsList.remove(extension) else: extensionsList.remove(extension) - for x in extensionsList: - list.append((x[0](), x)) + list.extend([(x[0](), x) for x in extensionsList]) + keys += [""] * len(extensionsList) self.session.openWithCallback(self.extensionCallback, ChoiceBox, title=_("Please choose an extension..."), list = list, keys = keys) @@ -1290,13 +1341,13 @@ class InfoBarPlugins: return name 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 + return [((boundFunction(self.getPluginName, p.name), boundFunction(self.runPlugin, p), lambda: True), None) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_EXTENSIONSMENU)] def runPlugin(self, plugin): - plugin(session = self.session, servicelist = self.servicelist) + if isinstance(self, InfoBarChannelSelection): + plugin(session = self.session, servicelist = self.servicelist) + else: + plugin(session = self.session) from Components.Task import job_manager class InfoBarJobman: @@ -1304,10 +1355,7 @@ class InfoBarJobman: self.addExtension(extension = self.getJobList, type = InfoBarExtensions.EXTENSION_LIST) def getJobList(self): - list = [] - for job in job_manager.getPendingJobs(): - list.append(((boundFunction(self.getJobName, job), boundFunction(self.showJobView, job), lambda: True), None)) - return list + return [((boundFunction(self.getJobName, job), boundFunction(self.showJobView, job), lambda: True), None) for job in job_manager.getPendingJobs()] def getJobName(self, job): return "%s: %s (%d%%)" % (job.getStatustext(), job.name, int(100*job.progress/float(job.end))) @@ -1465,7 +1513,7 @@ class InfoBarInstantRecord: simulTimerList = self.session.nav.RecordTimer.record(recording) if simulTimerList is not None: # conflict with other recording name = simulTimerList[1].name - name_date = name + strftime(" %c", localtime(simulTimerList[1].begin)) + name_date = ' '.join((name, strftime('%c', localtime(simulTimerList[1].begin)))) print "[TIMER] conflicts with", name_date recording.autoincrease = True # start with max available length, then increment if recording.setAutoincreaseEnd(): @@ -1480,7 +1528,7 @@ class InfoBarInstantRecord: def isInstantRecordRunning(self): print "self.recording:", self.recording - if len(self.recording) > 0: + if self.recording: for x in self.recording: if x.isRunning(): return True @@ -1547,10 +1595,11 @@ class InfoBarInstantRecord: def inputCallback(self, value): if value is not None: print "stopping recording after", int(value), "minutes." + entry = self.recording[self.selectedEntry] if int(value) != 0: - self.recording[self.selectedEntry].autoincrease = False - self.recording[self.selectedEntry].end = int(time()) + 60 * int(value) - self.session.nav.RecordTimer.timeChanged(self.recording[self.selectedEntry]) + entry.autoincrease = False + entry.end = int(time()) + 60 * int(value) + self.session.nav.RecordTimer.timeChanged(entry) def instantRecord(self): dir = config.movielist.last_videodir.value @@ -1566,22 +1615,22 @@ class InfoBarInstantRecord: if self.isInstantRecordRunning(): self.session.openWithCallback(self.recordQuestionCallback, ChoiceBox, \ title=_("A recording is currently running.\nWhat do you want to do?"), \ - list=[(_("add recording (stop after current event)"), "event"), \ + list=((_("add recording (stop after current event)"), "event"), \ (_("add recording (enter recording duration)"), "manualduration"), \ (_("add recording (enter recording endtime)"), "manualendtime"), \ (_("add recording (indefinitely)"), "indefinitely"), \ (_("change recording (duration)"), "changeduration"), \ (_("change recording (endtime)"), "changeendtime"), \ (_("stop recording"), "stop"), \ - (_("do nothing"), "no")]) + (_("do nothing"), "no"))) else: self.session.openWithCallback(self.recordQuestionCallback, ChoiceBox, \ title=_("Start recording?"), \ - list=[(_("add recording (stop after current event)"), "event"), \ + list=((_("add recording (stop after current event)"), "event"), \ (_("add recording (enter recording duration)"), "manualduration"), \ (_("add recording (enter recording endtime)"), "manualendtime"), \ (_("add recording (indefinitely)"), "indefinitely"), \ - (_("don't record"), "no")]) + (_("don't record"), "no"))) from Tools.ISO639 import LanguageCodes @@ -1600,8 +1649,9 @@ class InfoBarAudioSelection: if n > 0: self.audioChannel = service.audioChannel() - for x in range(n): - i = audio.getTrackInfo(x) + idx = 0 + while idx < n: + i = audio.getTrackInfo(idx) language = i.getLanguage() description = i.getDescription() @@ -1613,7 +1663,8 @@ class InfoBarAudioSelection: else: description = language - tlist.append((description, x)) + tlist.append((description, idx)) + idx += 1 tlist.sort(key=lambda x: x[0]) @@ -1628,13 +1679,13 @@ class InfoBarAudioSelection: break if SystemInfo["CanDownmixAC3"]: - tlist = [(_("AC3 downmix") + " - " +[_("Off"), _("On")][config.av.downmix_ac3.value and 1 or 0], "CALLFUNC", self.changeAC3Downmix), - ([_("Left"), _("Stereo"), _("Right")][self.audioChannel.getCurrentChannel()], "mode"), + tlist = [(_("AC3 downmix") + " - " +(_("Off"), _("On"))[config.av.downmix_ac3.value and 1 or 0], "CALLFUNC", self.changeAC3Downmix), + ((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode"), ("--", "")] + tlist keys = [ "red", "green", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n selection += 3 else: - tlist = [([_("Left"), _("Stereo"), _("Right")][self.audioChannel.getCurrentChannel()], "mode"), ("--", "")] + tlist + tlist = [((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode"), ("--", "")] + tlist keys = [ "red", "", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] + [""]*n selection += 2 self.session.openWithCallback(self.audioSelected, ChoiceBox, title=_("Select audio track"), list = tlist, selection = selection, keys = keys) @@ -1646,7 +1697,7 @@ class InfoBarAudioSelection: list = choicelist.list t = list[0][1] list[0][1]=(t[0], t[1], t[2], t[3], t[4], t[5], t[6], - _("AC3 downmix") + " - " +[_("On"), _("Off")][config.av.downmix_ac3.value and 1 or 0]) + _("AC3 downmix") + " - " + (_("On"), _("Off"))[config.av.downmix_ac3.value and 1 or 0]) choicelist.setList(list) if config.av.downmix_ac3.value: config.av.downmix_ac3.value = False @@ -1660,7 +1711,7 @@ class InfoBarAudioSelection: if audio[1] == "mode": keys = ["red", "green", "yellow"] selection = self.audioChannel.getCurrentChannel() - tlist = [(_("left"), 0), (_("stereo"), 1), (_("right"), 2)] + tlist = ((_("left"), 0), (_("stereo"), 1), (_("right"), 2)) self.session.openWithCallback(self.modeSelected, ChoiceBox, title=_("Select audio mode"), list = tlist, selection = selection, keys = keys) else: del self.audioChannel @@ -1715,9 +1766,12 @@ class InfoBarSubserviceSelection: if n and n > 0: selection = -1 ref = self.session.nav.getCurrentlyPlayingServiceReference() - for x in range(n): - if subservices.getSubservice(x).toString() == ref.toString(): - selection = x + idx = 0 + while idx < n: + if subservices.getSubservice(idx).toString() == ref.toString(): + selection = idx + break + idx += 1 if selection != -1: selection += direction if selection >= n: @@ -1739,11 +1793,13 @@ class InfoBarSubserviceSelection: if n and n > 0: ref = self.session.nav.getCurrentlyPlayingServiceReference() tlist = [] - for x in range(n): - i = subservices.getSubservice(x) + idx = 0 + while idx < n: + i = subservices.getSubservice(idx) if i.toString() == ref.toString(): - selection = x + selection = idx tlist.append((i.getName(), i)) + idx += 1 if self.bouquets and len(self.bouquets): keys = ["red", "blue", "", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ] + [""] * n @@ -1820,10 +1876,11 @@ class InfoBarNotifications: self.checkNotifications() def checkNotifications(self): - if len(Notifications.notifications): - n = Notifications.notifications[0] + notifications = Notifications.notifications + if notifications: + n = notifications[0] - Notifications.notifications = Notifications.notifications[1:] + del notifications[0] cb = n[0] if n[3].has_key("onSessionOpenCallback"): @@ -1976,7 +2033,7 @@ class InfoBarCueSheetSupport: if bestdiff >= 0: nearest = [0, False] for cp in self.cut_list: - if beforecut and cp[1] in [self.CUT_TYPE_IN, self.CUT_TYPE_OUT]: + if beforecut and cp[1] in (self.CUT_TYPE_IN, self.CUT_TYPE_OUT): beforecut = False if cp[1] == self.CUT_TYPE_IN: # Start is here, disregard previous marks diff = cmp(cp[0] - pts) @@ -1985,7 +2042,7 @@ class InfoBarCueSheetSupport: bestdiff = diff else: nearest = None - if cp[1] in [self.CUT_TYPE_MARK, self.CUT_TYPE_LAST]: + if cp[1] in (self.CUT_TYPE_MARK, self.CUT_TYPE_LAST): diff = cmp(cp[0] - pts) if diff >= 0 and (nearest is None or bestdiff > diff): nearest = cp @@ -2071,9 +2128,6 @@ class InfoBarSummary(Screen): # Reference # - def __init__(self, session, parent): - Screen.__init__(self, session, parent = parent) - class InfoBarSummarySupport: def __init__(self): pass @@ -2099,9 +2153,6 @@ class InfoBarMoviePlayerSummary(Screen): """ - def __init__(self, session, parent): - Screen.__init__(self, session) - class InfoBarMoviePlayerSummarySupport: def __init__(self): pass @@ -2202,7 +2253,7 @@ class InfoBarServiceErrorPopupSupport: else: self.last_error = error - errors = { + error = { eDVBServicePMTHandler.eventNoResources: _("No free tuner!"), eDVBServicePMTHandler.eventTuneFailed: _("Tune failed!"), eDVBServicePMTHandler.eventNoPAT: _("No data on transponder!\n(Timeout reading PAT)"), @@ -2213,9 +2264,7 @@ class InfoBarServiceErrorPopupSupport: eDVBServicePMTHandler.eventSOF: None, eDVBServicePMTHandler.eventEOF: None, eDVBServicePMTHandler.eventMisconfiguration: _("Service unavailable!\nCheck tuner configuration!"), - } - - error = errors.get(error) #this returns None when the key not exist in the dict + }.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")