X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a3bbc85871508cbf24edea513a5f69a14ee76e33..d4fc3e1b8c34dea520fbce11b8dc30ca1245a482:/lib/python/Screens/ChannelSelection.py diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index aa1233e3..62949ed1 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -1,30 +1,31 @@ from Screen import Screen from Components.Button import Button from Components.ServiceList import ServiceList -from Components.ActionMap import NumberActionMap, ActionMap +from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap from Components.MenuList import MenuList from Components.ServiceEventTracker import ServiceEventTracker from EpgSelection import EPGSelection from enigma import eServiceReference, eEPGCache, eServiceCenter, eTimer, eDVBDB, iPlayableService, iServiceInformation from Components.config import config, ConfigSubsection, ConfigText -from Screens.FixedMenu import FixedMenu from Tools.NumericalTextInput import NumericalTextInput from Components.NimManager import nimmanager from Components.Sources.Clock import Clock +from Components.Sources.RdsDecoder import RdsDecoder +from Components.Sources.ServiceEvent import ServiceEvent from Components.Input import Input from Components.ParentalControl import parentalControl +from Components.Pixmap import Pixmap from Screens.InputBox import InputBox, PinInput from Screens.MessageBox import MessageBox from Screens.ServiceInfo import ServiceInfo +from Screens.RdsDisplay import RassInteractive from ServiceReference import ServiceReference from Tools.BoundFunction import boundFunction -from re import * +from re import compile from os import remove FLAG_SERVICE_NEW_FOUND = 64 #define in lib/dvb/idvb.h as dxNewFound = 64 -import xml.dom.minidom - class BouquetSelector(Screen): def __init__(self, session, bouquets, selectedFunc, enableWrapAround=False): Screen.__init__(self, session) @@ -36,9 +37,7 @@ class BouquetSelector(Screen): "ok": self.okbuttonClick, "cancel": self.cancelClick }) - entrys = [ ] - for x in bouquets: - entrys.append((x[0], x[1])) + entrys = [ (x[0], x[1]) for x in bouquets ] self["menu"] = MenuList(entrys, enableWrapAround) def getCurrent(self): @@ -62,6 +61,10 @@ OFF = 0 EDIT_BOUQUET = 1 EDIT_ALTERNATIVES = 2 +def apend_when_current_valid(current, menu, args): + if current and current.valid(): + menu.append(args) + class ChannelContextMenu(Screen): def __init__(self, session, csel): Screen.__init__(self, session) @@ -75,71 +78,72 @@ class ChannelContextMenu(Screen): }) menu = [ ] + current = csel.getCurrentSelection() current_root = csel.getRoot() - current_sel_path = csel.getCurrentSelection().getPath() - current_sel_flags = csel.getCurrentSelection().flags + current_sel_path = current.getPath() + current_sel_flags = current.flags inBouquetRootList = current_root and current_root.getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK inBouquet = csel.getMutableList() is not None haveBouquets = config.usage.multibouquet.value - if not (len(current_sel_path) or current_sel_flags & eServiceReference.isDirectory): - menu.append((_("show transponder info"), self.showServiceInformations)) + if not (len(current_sel_path) or current_sel_flags & (eServiceReference.isDirectory|eServiceReference.isMarker)): + apend_when_current_valid(current, menu, (_("show transponder info"), self.showServiceInformations)) if csel.bouquet_mark_edit == OFF and not csel.movemode: if not inBouquetRootList: isPlayable = not (current_sel_flags & (eServiceReference.isMarker|eServiceReference.isDirectory)) if isPlayable: if config.ParentalControl.configured.value: if parentalControl.getProtectionLevel(csel.getCurrentSelection().toCompareString()) == -1: - menu.append((_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection()))) + apend_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection()))) else: - menu.append((_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection()))) + apend_when_current_valid(current, menu, (_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection()))) if haveBouquets: - menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected)) + apend_when_current_valid(current, menu, (_("add service to bouquet"), self.addServiceToBouquetSelected)) else: - menu.append((_("add service to favourites"), self.addServiceToBouquetSelected)) + apend_when_current_valid(current, menu, (_("add service to favourites"), self.addServiceToBouquetSelected)) else: if haveBouquets: if not inBouquet and current_sel_path.find("PROVIDERS") == -1: - menu.append((_("copy to bouquets"), self.copyCurrentToBouquetList)) + apend_when_current_valid(current, menu, (_("copy to bouquets"), self.copyCurrentToBouquetList)) if current_sel_path.find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: - menu.append((_("remove all new found flags"), self.removeAllNewFoundFlags)) + apend_when_current_valid(current, menu, (_("remove all new found flags"), self.removeAllNewFoundFlags)) if inBouquet: - menu.append((_("remove entry"), self.removeCurrentService)) + apend_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService)) if current_root and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: - menu.append((_("remove new found flag"), self.removeNewFoundFlag)) + apend_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag)) else: menu.append((_("add bouquet"), self.showBouquetInputBox)) - menu.append((_("remove entry"), self.removeBouquet)) + apend_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet)) if inBouquet: # current list is editable? if csel.bouquet_mark_edit == OFF: if not csel.movemode: - menu.append((_("enable move mode"), self.toggleMoveMode)) + apend_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode)) if not inBouquetRootList and current_root and not (current_root.flags & eServiceReference.isGroup): menu.append((_("add marker"), self.showMarkerInputBox)) if haveBouquets: - menu.append((_("enable bouquet edit"), self.bouquetMarkStart)) + apend_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart)) else: - menu.append((_("enable favourite edit"), self.bouquetMarkStart)) + apend_when_current_valid(current, menu, (_("enable favourite edit"), self.bouquetMarkStart)) if current_sel_flags & eServiceReference.isGroup: - menu.append((_("edit alternatives"), self.editAlternativeServices)) - menu.append((_("show alternatives"), self.showAlternativeServices)) - menu.append((_("remove all alternatives"), self.removeAlternativeServices)) - else: - menu.append((_("add alternatives"), self.addAlternativeServices)) + apend_when_current_valid(current, menu, (_("edit alternatives"), self.editAlternativeServices)) + apend_when_current_valid(current, menu, (_("show alternatives"), self.showAlternativeServices)) + apend_when_current_valid(current, menu, (_("remove all alternatives"), self.removeAlternativeServices)) + elif not current_sel_flags & eServiceReference.isMarker: + apend_when_current_valid(current, menu, (_("add alternatives"), self.addAlternativeServices)) else: - menu.append((_("disable move mode"), self.toggleMoveMode)) + apend_when_current_valid(current, menu, (_("disable move mode"), self.toggleMoveMode)) else: if csel.bouquet_mark_edit == EDIT_BOUQUET: if haveBouquets: - menu.append((_("end bouquet edit"), self.bouquetMarkEnd)) - menu.append((_("abort bouquet edit"), self.bouquetMarkAbort)) + apend_when_current_valid(current, menu, (_("end bouquet edit"), self.bouquetMarkEnd)) + apend_when_current_valid(current, menu, (_("abort bouquet edit"), self.bouquetMarkAbort)) else: - menu.append((_("end favourites edit"), self.bouquetMarkEnd)) - menu.append((_("abort favourites edit"), self.bouquetMarkAbort)) + apend_when_current_valid(current, menu, (_("end favourites edit"), self.bouquetMarkEnd)) + apend_when_current_valid(current, menu, (_("abort favourites edit"), self.bouquetMarkAbort)) else: - menu.append((_("end alternatives edit"), self.bouquetMarkEnd)) - menu.append((_("abort alternatives edit"), self.bouquetMarkAbort)) + apend_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd)) + apend_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort)) menu.append((_("back"), self.cancelClick)) self["menu"] = MenuList(menu) @@ -266,6 +270,22 @@ class ChannelContextMenu(Screen): self.csel.startMarkedEdit(EDIT_ALTERNATIVES) self.close() +class SelectionEventInfo: + def __init__(self): + self["ServiceEvent"] = ServiceEvent() + self.servicelist.connectSelChanged(self.__selectionChanged) + self.timer = eTimer() + self.timer.timeout.get().append(self.updateEventInfo) + self.onShown.append(self.__selectionChanged) + + def __selectionChanged(self): + if self.execing: + self.timer.start(100, True) + + def updateEventInfo(self): + cur = self.getCurrentSelection() + self["ServiceEvent"].newService(cur) + class ChannelSelectionEPG: def __init__(self): self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"], @@ -358,9 +378,9 @@ class ChannelSelectionEdit: name = cur_service.getServiceName() print "NAME", name if self.mode == MODE_TV: - str = '1:134:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET \"alternatives.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(name)) + str = '1:134:1:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(name)) else: - str = '1:134:2:0:0:0:0:0:0:0:(type == 2) FROM BOUQUET \"alternatives.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(name)) + str = '1:134:2:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(name)) new_ref = ServiceReference(str) if not mutableBouquet.addService(new_ref.ref, cur_service.ref): mutableBouquet.removeService(cur_service.ref) @@ -848,28 +868,39 @@ class ChannelSelectionBase(Screen): break orbpos = service.getUnsignedData(4) >> 16 if service.getPath().find("FROM PROVIDER") != -1: - service_name = _("Providers") + service_type = _("Providers") elif service.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: - service_name = _("New") + service_type = _("New") else: - service_name = _("Services") + service_type = _("Services") try: - service_name += str(' - %s'%(nimmanager.getSatDescription(orbpos))) - service.setName(service_name) # why we need this cast? + # why we need this cast? + service_name = str(nimmanager.getSatDescription(orbpos)) except: if orbpos == 0xFFFF: #Cable - n = ("%s (%s)") % (service_name, _("Cable")) + service_name = _("Cable") elif orbpos == 0xEEEE: #Terrestrial - n = ("%s (%s)") % (service_name, _("Terrestrial")) + service_name = _("Terrestrial") else: if orbpos > 1800: # west orbpos = 3600 - orbpos h = _("W") else: h = _("E") - n = ("%s (%d.%d" + h + ")") % (service_name, orbpos / 10, orbpos % 10) - service.setName(n) + service_name = ("%d.%d" + h) % (orbpos / 10, orbpos % 10) + service.setName("%s - %s" % (service_name, service_type)) self.servicelist.addService(service) + cur_ref = self.session.nav.getCurrentlyPlayingServiceReference() + if cur_ref: + pos = self.service_types.rfind(':') + refstr = '%s (channelID == %08x%04x%04x) && %s ORDER BY name' %(self.service_types[:pos+1], + cur_ref.getUnsignedData(4), # NAMESPACE + cur_ref.getUnsignedData(2), # TSID + cur_ref.getUnsignedData(3), # ONID + self.service_types[pos+1:]) + ref = eServiceReference(refstr) + ref.setName(_("Current Transponder")) + self.servicelist.addService(ref) self.servicelist.finishFill() if prev is not None: self.setCurrentSelection(prev) @@ -904,7 +935,9 @@ class ChannelSelectionBase(Screen): self.enterPath(ref) def inBouquet(self): - return self.isBasePathEqual(self.bouquet_root) + if len(self.servicePath) > 0 and self.servicePath[0] == self.bouquet_root: + return True + return False def atBegin(self): return self.servicelist.atBegin() @@ -1013,11 +1046,14 @@ config.radio.lastroot = ConfigText() config.servicelist = ConfigSubsection() config.servicelist.lastmode = ConfigText(default = "tv") -class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG): +class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, SelectionEventInfo): def __init__(self, session): ChannelSelectionBase.__init__(self,session) ChannelSelectionEdit.__init__(self) ChannelSelectionEPG.__init__(self) + SelectionEventInfo.__init__(self) + + self["CurrentTime"] = Clock() self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"], { @@ -1046,6 +1082,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.lastroot = config.tv.lastroot self.revertMode = None config.usage.multibouquet.addNotifier(self.multibouquet_config_changed) + self.new_service_played = False def multibouquet_config_changed(self, val): self.recallBouquetMode() @@ -1121,12 +1158,18 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect ref = self.session.nav.getCurrentlyPlayingServiceReference() nref = self.getCurrentSelection() if ref is None or ref != nref: + self.new_service_played = True self.session.nav.playService(nref) self.saveRoot() self.saveChannel(nref) config.servicelist.lastmode.save() self.addToHistory(nref) + def newServicePlayed(self): + ret = self.new_service_played + self.new_service_played = False + return ret + def addToHistory(self, ref): if self.servicePath is not None: tmp=self.servicePath[:] @@ -1253,32 +1296,32 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.revertMode = None self.close(None) -from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord, InfoBarRadioText +from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName -class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord): +class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName): def __init__(self, session): Screen.__init__(self, session) InfoBarEvent.__init__(self) InfoBarServiceName.__init__(self) - InfoBarInstantRecord.__init__(self) self["CurrentTime"] = Clock() + self["RdsDecoder"] = RdsDecoder(self.session.nav) + self["BlinkingPoint"] = Pixmap() + self["BlinkingPoint"].hide() -class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, InfoBarRadioText): - +class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG): ALLOW_SUSPEND = True - def __init__(self, session): + def __init__(self, session, infobar): ChannelSelectionBase.__init__(self, session) ChannelSelectionEdit.__init__(self) ChannelSelectionEPG.__init__(self) - InfoBarRadioText.__init__(self) - + self.infobar = infobar config.radio = ConfigSubsection(); config.radio.lastservice = ConfigText() config.radio.lastroot = ConfigText() self.onLayoutFinish.append(self.onCreate) - self.info = session.instantiateDialog(RadioInfoBar) + self.info = session.instantiateDialog(RadioInfoBar) # our simple infobar self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"], { @@ -1294,6 +1337,37 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS iPlayableService.evEnd: self.__evServiceEnd }) +########## RDS Radiotext / Rass Support BEGIN + self.infobar = infobar # reference to real infobar (the one and only) + self["RdsDecoder"] = self.info["RdsDecoder"] + self["RdsActions"] = HelpableActionMap(self, "InfobarRdsActions", + { + "startRassInteractive": (self.startRassInteractive, _("View Rass interactive...")) + },-1) + self["RdsActions"].setEnabled(False) + infobar.rds_display.onRassInteractivePossibilityChanged.append(self.RassInteractivePossibilityChanged) + + def startRassInteractive(self): + self.info.hide(); + self.infobar.rass_interactive = self.session.openWithCallback(self.RassInteractiveClosed, RassInteractive) + + def RassInteractiveClosed(self): + self.info.show() + self.infobar.rass_interactive = None + self.infobar.RassSlidePicChanged() + + def RassInteractivePossibilityChanged(self, state): + self["RdsActions"].setEnabled(state) +########## RDS Radiotext / Rass Support END + + def closeRadio(self): + self.infobar.rds_display.onRassInteractivePossibilityChanged.remove(self.RassInteractivePossibilityChanged) + self.info.hide() + #set previous tv service + lastservice=eServiceReference(config.tv.lastservice.value) + self.session.nav.playService(lastservice) + self.close(None) + def __evServiceStart(self): service = self.session.nav.getCurrentService() if service: @@ -1368,13 +1442,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS config.radio.lastservice.save() self.saveRoot() - def closeRadio(self): - self.info.hide() - #set previous tv service - lastservice=eServiceReference(config.tv.lastservice.value) - self.session.nav.playService(lastservice) - self.close(None) - class SimpleChannelSelection(ChannelSelectionBase): def __init__(self, session, title): ChannelSelectionBase.__init__(self, session)