X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/b32851030de5d3706883afa87598cba8a8226f5d..063271e1465b87f8d8aa42f16dbbeab18d12cf99:/lib/python/Screens/ChannelSelection.py diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 90c12a5d..c376d4fa 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -4,15 +4,18 @@ from Components.ServiceList import ServiceList from Components.ActionMap import NumberActionMap, ActionMap from Components.MenuList import MenuList from EpgSelection import EPGSelection -from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer, eDVBDB -from Components.config import config, configElement, ConfigSubsection, configText, currentConfigSelectionElement +from enigma import eServiceReference, eEPGCache, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer, eDVBDB +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.Input import Input -from Screens.InputBox import InputBox +from Components.ParentalControl import parentalControl +from Screens.InputBox import InputBox, PinInput +from Screens.MessageBox import MessageBox from ServiceReference import ServiceReference +from Tools.BoundFunction import boundFunction from re import * from os import remove @@ -70,11 +73,16 @@ class ChannelContextMenu(Screen): current_sel_flags = csel.getCurrentSelection().flags inBouquetRootList = current_root and current_root.getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK inBouquet = csel.getMutableList() is not None - haveBouquets = csel.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1 + haveBouquets = config.usage.multibouquet.value if not csel.bouquet_mark_edit and not csel.movemode: if not inBouquetRootList: if (csel.getCurrentSelection().flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory: + if config.ParentalControl.configured.value: + if parentalControl.getProtectionLevel(csel.getCurrentSelection().toCompareString()) == -1: + menu.append((_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection()))) + else: + menu.append((_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection()))) if haveBouquets: menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected)) else: @@ -82,12 +90,12 @@ class ChannelContextMenu(Screen): else: if haveBouquets: if not inBouquet and current_sel_path.find("PROVIDERS") == -1: - menu.append((_("copy to favourites"), self.copyCurrentToBouquetList)) + menu.append((_("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)) if inBouquet: menu.append((_("remove entry"), self.removeCurrentService)) - if current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: + if current_root is not None and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: menu.append((_("remove new found flag"), self.removeNewFoundFlag)) else: menu.append((_("add bouquet"), self.showBouquetInputBox)) @@ -130,6 +138,20 @@ class ChannelContextMenu(Screen): self.csel.addBouquet(bouquet, None) self.close() + def addParentalProtection(self, service): + parentalControl.protectService(service.toCompareString()) + self.close() + + def removeParentalProtection(self, service): + self.session.openWithCallback(boundFunction(self.pinEntered, service.toCompareString()), PinInput, pinList = [config.ParentalControl.servicepin[0].value], triesEntry = config.ParentalControl.retries.servicepin, title = _("Enter the service pin"), windowTitle = _("Change pin code")) + + def pinEntered(self, service, result): + if result: + parentalControl.unProtectService(service) + self.close() + else: + self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR) + def addServiceToBouquetSelected(self): bouquets = self.csel.getBouquetList() if bouquets is None: @@ -140,8 +162,6 @@ class ChannelContextMenu(Screen): self.bsel = self.session.openWithCallback(self.bouquetSelClosed, BouquetSelector, bouquets, self.addCurrentServiceToBouquet) elif cnt == 1: # add to only one existing bouquet self.addCurrentServiceToBouquet(bouquets[0][1]) - else: #no bouquets in root.. so assume only one favourite list is used - self.addCurrentServiceToBouquet(self.csel.bouquet_root) def bouquetSelClosed(self, recursive): self.bsel = None @@ -318,6 +338,13 @@ class ChannelSelectionEdit: mutableBouquet.flushChanges() else: print "get mutable list for new created bouquet failed" + # do some voodoo to check if current_root is equal to bouquet_root + cur_root = self.getRoot(); + str1 = cur_root.toString() + pos1 = str1.find("FROM BOUQUET") + pos2 = self.bouquet_rootstr.find("FROM BOUQUET") + if pos1 != -1 and pos2 != -1 and str1[pos1:] == self.bouquet_rootstr[pos2:]: + self.setMode() #reload else: print "add", str, "to bouquets failed" else: @@ -334,6 +361,7 @@ class ChannelSelectionEdit: refstr = self.getCurrentSelection().toString() self.bouquetNumOffsetCache = { } pos = refstr.find('FROM BOUQUET "') + filename = None if pos != -1: refstr = refstr[pos+14:] pos = refstr.find('"') @@ -341,7 +369,8 @@ class ChannelSelectionEdit: filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2 self.removeCurrentService() try: - remove(filename) + if filename is not None: + remove(filename) except OSError: print "error during remove of", filename @@ -353,7 +382,7 @@ class ChannelSelectionEdit: self.saved_title = self.instance.getTitle() pos = self.saved_title.find(')') new_title = self.saved_title[:pos+1] - if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1: + if config.usage.multibouquet.value: new_title += ' ' + _("[bouquet edit]") else: new_title += ' ' + _("[favourite edit]") @@ -463,14 +492,14 @@ class ChannelSelectionEdit: MODE_TV = 0 MODE_RADIO = 1 +# this makes it much simple to implement a selectable radio or tv mode :) +service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25)' +service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2)' + class ChannelSelectionBase(Screen): def __init__(self, session): Screen.__init__(self, session) - # this makes it much simple to implement a selectable radio or tv mode :) - self.service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25)' - self.service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2)' - self["key_red"] = Button(_("All")) self["key_green"] = Button(_("Satellites")) self["key_yellow"] = Button(_("Provider")) @@ -480,6 +509,7 @@ class ChannelSelectionBase(Screen): self.servicelist = self["list"] self.numericalTextInput = NumericalTextInput() + self.numericalTextInput.setUseableChars(u'1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ') self.servicePathTV = [ ] self.servicePathRadio = [ ] @@ -512,6 +542,7 @@ class ChannelSelectionBase(Screen): "9": self.keyNumberGlobal, "0": self.keyNumber0 }) + self.recallBouquetMode() def appendDVBTypes(self, ref): path = ref.getPath() @@ -521,7 +552,7 @@ class ChannelSelectionBase(Screen): return ref def getBouquetNumOffset(self, bouquet): - if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK + if config.usage.multibouquet.value: return 0 bouquet = self.appendDVBTypes(bouquet) try: @@ -551,14 +582,14 @@ class ChannelSelectionBase(Screen): def recallBouquetMode(self): if self.mode == MODE_TV: - self.service_types = self.service_types_tv - if currentConfigSelectionElement(config.usage.multibouquet) == "yes": + self.service_types = service_types_tv + if config.usage.multibouquet.value: self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.tv" ORDER BY bouquet' else: self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet'%(self.service_types) else: - self.service_types = self.service_types_radio - if currentConfigSelectionElement(config.usage.multibouquet) == "yes": + self.service_types = service_types_radio + if config.usage.multibouquet.value: self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.radio" ORDER BY bouquet' else: self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.radio" ORDER BY bouquet'%(self.service_types) @@ -744,9 +775,9 @@ class ChannelSelectionBase(Screen): n = ("%s (%d.%d" + h + ")") % (service_name, orbpos / 10, orbpos % 10) service.setName(n) self.servicelist.addService(service) - self.servicelist.finishFill() - if prev is not None: - self.setCurrentSelection(prev) + self.servicelist.finishFill() + if prev is not None: + self.setCurrentSelection(prev) def showProviders(self): if not self.pathChangedDisabled: @@ -799,8 +830,10 @@ class ChannelSelectionBase(Screen): self.enterPath(self.bouquet_root) def keyNumberGlobal(self, number): - char = self.numericalTextInput.getKey(number) - self.servicelist.moveToChar(char) + unichar = self.numericalTextInput.getKey(number) + charstr = unichar.encode("utf-8") + if len(charstr) == 1: + self.servicelist.moveToChar(charstr[0]) def getRoot(self): return self.servicelist.getRoot() @@ -820,25 +853,24 @@ class ChannelSelectionBase(Screen): self.servicelist.setCurrent(service) def getBouquetList(self): - serviceCount=0 bouquets = [ ] serviceHandler = eServiceCenter.getInstance() - list = serviceHandler.list(self.bouquet_root) - if not list is None: - while True: - s = list.getNext() - if not s.valid(): - break - if ((s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory): - info = serviceHandler.info(s) - if not info is None: - bouquets.append((info.getName(s), s)) - else: - serviceCount += 1 - if len(bouquets) == 0 and serviceCount > 0: - info = serviceHandler.info(self.bouquet_root) - if not info is None: - bouquets.append((info.getName(self.bouquet_root), self.bouquet_root)) + if config.usage.multibouquet.value: + list = serviceHandler.list(self.bouquet_root) + if not list is None: + while True: + s = list.getNext() + if not s.valid(): + break + if ((s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory): + info = serviceHandler.info(s) + if not info is None: + bouquets.append((info.getName(s), s)) + return bouquets + else: + info = serviceHandler.info(self.bouquet_root) + if not info is None: + bouquets.append((info.getName(self.bouquet_root), self.bouquet_root)) return bouquets return None @@ -873,13 +905,13 @@ HISTORYSIZE = 20 #config for lastservice config.tv = ConfigSubsection() -config.tv.lastservice = configElement("config.tv.lastservice", configText, "", 0) -config.tv.lastroot = configElement("config.tv.lastroot", configText, "", 0) +config.tv.lastservice = ConfigText() +config.tv.lastroot = ConfigText() config.radio = ConfigSubsection() -config.radio.lastservice = configElement("config.radio.lastservice", configText, "", 0) -config.radio.lastroot = configElement("config.radio.lastroot", configText, "", 0) +config.radio.lastservice = ConfigText() +config.radio.lastroot = ConfigText() config.servicelist = ConfigSubsection() -config.servicelist.lastmode = configElement("config.servicelist.lastmode", configText, "tv", 0) +config.servicelist.lastmode = ConfigText(default = "tv") class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG): def __init__(self, session): @@ -929,7 +961,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect def setModeRadio(self): if self.revertMode is None and config.servicelist.lastmode.value == "tv": self.revertMode = MODE_TV - if currentConfigSelectionElement(config.usage.e1like_radio_mode) == "yes": + if config.usage.e1like_radio_mode.value: self.history = self.history_radio self.lastservice = config.radio.lastservice self.lastroot = config.radio.lastroot @@ -938,7 +970,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.setMode() def __onCreate(self): - if currentConfigSelectionElement(config.usage.e1like_radio_mode) == "yes": + if config.usage.e1like_radio_mode.value: if config.servicelist.lastmode.value == "tv": self.setModeTv() else: @@ -1107,7 +1139,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.revertMode = None self.close(None) -from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord +from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord, InfoBarRadioText class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord): def __init__(self, session): @@ -1117,15 +1149,19 @@ class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecor InfoBarInstantRecord.__init__(self) self["CurrentTime"] = Clock() -class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG): +class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, InfoBarRadioText): + + ALLOW_SUSPEND = True + def __init__(self, session): ChannelSelectionBase.__init__(self, session) ChannelSelectionEdit.__init__(self) ChannelSelectionEPG.__init__(self) + InfoBarRadioText.__init__(self) config.radio = ConfigSubsection(); - config.radio.lastservice = configElement("config.radio.lastservice", configText, "", 0); - config.radio.lastroot = configElement("config.radio.lastroot", configText, "", 0); + config.radio.lastservice = ConfigText() + config.radio.lastroot = ConfigText() self.onLayoutFinish.append(self.onCreate) self.info = session.instantiateDialog(RadioInfoBar)