X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fpython%2FScreens%2FChannelSelection.py;h=d640ac250fccf0b30c667fe9fef8539c795b56d8;hp=0fe625bb9d56846376ae6e39714115c031cde495;hb=6f73e6abddf4170357c490966d0e1c622eb376f5;hpb=67b53c1cb06988394c35a6e965c99b72b67fe1be diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 0fe625b..d640ac2 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -1,27 +1,39 @@ +from Tools.Profile import profile + from Screen import Screen from Components.Button import Button from Components.ServiceList import ServiceList from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap from Components.MenuList import MenuList from Components.ServiceEventTracker import ServiceEventTracker +profile("ChannelSelection.py 1") from EpgSelection import EPGSelection -from enigma import eServiceReference, eEPGCache, eServiceCenter, eTimer, eDVBDB, iPlayableService, iServiceInformation +from enigma import eServiceReference, eEPGCache, eServiceCenter, eRCInput, eTimer, eDVBDB, iPlayableService, iServiceInformation, getPrevAsciiCode from Components.config import config, ConfigSubsection, ConfigText from Tools.NumericalTextInput import NumericalTextInput +profile("ChannelSelection.py 2") from Components.NimManager import nimmanager -from Components.Sources.Clock import Clock +profile("ChannelSelection.py 2.1") +from Components.Sources.Source import ObsoleteSource +profile("ChannelSelection.py 2.2") from Components.Sources.RdsDecoder import RdsDecoder +profile("ChannelSelection.py 2.3") +from Components.Sources.ServiceEvent import ServiceEvent +profile("ChannelSelection.py 2.4") from Components.Input import Input +profile("ChannelSelection.py 3") 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 +profile("ChannelSelection.py 4") from Screens.RdsDisplay import RassInteractive from ServiceReference import ServiceReference from Tools.BoundFunction import boundFunction from re import compile from os import remove +profile("ChannelSelection.py after imports") FLAG_SERVICE_NEW_FOUND = 64 #define in lib/dvb/idvb.h as dxNewFound = 64 @@ -60,13 +72,14 @@ OFF = 0 EDIT_BOUQUET = 1 EDIT_ALTERNATIVES = 2 -def apend_when_current_valid(current, menu, args): - if current and current.valid(): +def append_when_current_valid(current, menu, args, level = 0): + if current and current.valid() and level <= config.usage.setup_level.index: menu.append(args) class ChannelContextMenu(Screen): def __init__(self, session, csel): Screen.__init__(self, session) + #raise "we need a better summary screen here" self.csel = csel self.bsel = None @@ -86,63 +99,63 @@ class ChannelContextMenu(Screen): haveBouquets = config.usage.multibouquet.value 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)) + append_when_current_valid(current, menu, (_("show transponder info"), self.showServiceInformations), level = 2) 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: - apend_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection()))) + append_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection())), level = 0) else: - apend_when_current_valid(current, menu, (_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection()))) + append_when_current_valid(current, menu, (_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection())), level = 0) if haveBouquets: - apend_when_current_valid(current, menu, (_("add service to bouquet"), self.addServiceToBouquetSelected)) + append_when_current_valid(current, menu, (_("add service to bouquet"), self.addServiceToBouquetSelected), level = 0) else: - apend_when_current_valid(current, menu, (_("add service to favourites"), self.addServiceToBouquetSelected)) + append_when_current_valid(current, menu, (_("add service to favourites"), self.addServiceToBouquetSelected), level = 0) else: if haveBouquets: if not inBouquet and current_sel_path.find("PROVIDERS") == -1: - apend_when_current_valid(current, menu, (_("copy to bouquets"), self.copyCurrentToBouquetList)) + append_when_current_valid(current, menu, (_("copy to bouquets"), self.copyCurrentToBouquetList), level = 0) if current_sel_path.find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: - apend_when_current_valid(current, menu, (_("remove all new found flags"), self.removeAllNewFoundFlags)) + append_when_current_valid(current, menu, (_("remove all new found flags"), self.removeAllNewFoundFlags), level = 0) if inBouquet: - apend_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService)) + append_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService), level = 0) if current_root and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: - apend_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag)) + append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0) else: menu.append((_("add bouquet"), self.showBouquetInputBox)) - apend_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet)) + append_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet), level = 0) if inBouquet: # current list is editable? if csel.bouquet_mark_edit == OFF: if not csel.movemode: - apend_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode)) + append_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode), level = 1) if not inBouquetRootList and current_root and not (current_root.flags & eServiceReference.isGroup): menu.append((_("add marker"), self.showMarkerInputBox)) if haveBouquets: - apend_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart)) + append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0) else: - apend_when_current_valid(current, menu, (_("enable favourite edit"), self.bouquetMarkStart)) + append_when_current_valid(current, menu, (_("enable favourite edit"), self.bouquetMarkStart), level = 0) if current_sel_flags & eServiceReference.isGroup: - 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)) + append_when_current_valid(current, menu, (_("edit alternatives"), self.editAlternativeServices), level = 2) + append_when_current_valid(current, menu, (_("show alternatives"), self.showAlternativeServices), level = 2) + append_when_current_valid(current, menu, (_("remove all alternatives"), self.removeAlternativeServices), level = 2) elif not current_sel_flags & eServiceReference.isMarker: - apend_when_current_valid(current, menu, (_("add alternatives"), self.addAlternativeServices)) + append_when_current_valid(current, menu, (_("add alternatives"), self.addAlternativeServices), level = 2) else: - apend_when_current_valid(current, menu, (_("disable move mode"), self.toggleMoveMode)) + append_when_current_valid(current, menu, (_("disable move mode"), self.toggleMoveMode), level = 0) else: if csel.bouquet_mark_edit == EDIT_BOUQUET: if haveBouquets: - apend_when_current_valid(current, menu, (_("end bouquet edit"), self.bouquetMarkEnd)) - apend_when_current_valid(current, menu, (_("abort bouquet edit"), self.bouquetMarkAbort)) + append_when_current_valid(current, menu, (_("end bouquet edit"), self.bouquetMarkEnd), level = 0) + append_when_current_valid(current, menu, (_("abort bouquet edit"), self.bouquetMarkAbort), level = 0) else: - apend_when_current_valid(current, menu, (_("end favourites edit"), self.bouquetMarkEnd)) - apend_when_current_valid(current, menu, (_("abort favourites edit"), self.bouquetMarkAbort)) + append_when_current_valid(current, menu, (_("end favourites edit"), self.bouquetMarkEnd), level = 0) + append_when_current_valid(current, menu, (_("abort favourites edit"), self.bouquetMarkAbort), level = 0) else: - apend_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd)) - apend_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort)) + append_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd), level = 0) + append_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort), level = 0) menu.append((_("back"), self.cancelClick)) self["menu"] = MenuList(menu) @@ -157,7 +170,7 @@ class ChannelContextMenu(Screen): self.session.open( ServiceInfo, self.csel.getCurrentSelection() ) def showBouquetInputBox(self): - self.session.openWithCallback(self.bouquetInputCallback, InputBox, title=_("Please enter a name for the new bouquet"), text="bouquetname", maxSize=False, type=Input.TEXT) + self.session.openWithCallback(self.bouquetInputCallback, InputBox, title=_("Please enter a name for the new bouquet"), text="bouquetname", maxSize=False, visible_width = 56, type=Input.TEXT) def bouquetInputCallback(self, bouquet): if bouquet is not None: @@ -203,7 +216,7 @@ class ChannelContextMenu(Screen): self.close() def showMarkerInputBox(self): - self.session.openWithCallback(self.markerInputCallback, InputBox, title=_("Please enter a name for the new marker"), text="markername", maxSize=False, type=Input.TEXT) + self.session.openWithCallback(self.markerInputCallback, InputBox, title=_("Please enter a name for the new marker"), text="markername", maxSize=False, visible_width = 56, type=Input.TEXT) def markerInputCallback(self, marker): if marker is not None: @@ -269,6 +282,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.callback.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"], @@ -630,7 +659,7 @@ class ChannelSelectionBase(Screen): self.bouquetNumOffsetCache = { } - self["ChannelSelectBaseActions"] = NumberActionMap(["ChannelSelectBaseActions", "NumberActions"], + self["ChannelSelectBaseActions"] = NumberActionMap(["ChannelSelectBaseActions", "NumberActions", "InputAsciiActions"], { "showFavourites": self.showFavourites, "showAllServices": self.showAllServices, @@ -640,6 +669,7 @@ class ChannelSelectionBase(Screen): "prevBouquet": self.prevBouquet, "nextMarker": self.nextMarker, "prevMarker": self.prevMarker, + "gotAsciiCode": self.keyAsciiCode, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, @@ -849,7 +879,10 @@ class ChannelSelectionBase(Screen): service = servicelist.getNext() if not service.valid(): #check if end of list break - orbpos = service.getUnsignedData(4) >> 16 + unsigned_orbpos = service.getUnsignedData(4) >> 16 + orbpos = service.getData(4) >> 16 + if orbpos < 0: + orbpos += 3600 if service.getPath().find("FROM PROVIDER") != -1: service_type = _("Providers") elif service.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1: @@ -860,9 +893,9 @@ class ChannelSelectionBase(Screen): # why we need this cast? service_name = str(nimmanager.getSatDescription(orbpos)) except: - if orbpos == 0xFFFF: #Cable + if unsigned_orbpos == 0xFFFF: #Cable service_name = _("Cable") - elif orbpos == 0xEEEE: #Terrestrial + elif unsigned_orbpos == 0xEEEE: #Terrestrial service_name = _("Terrestrial") else: if orbpos > 1800: # west @@ -873,6 +906,17 @@ class ChannelSelectionBase(Screen): 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) @@ -940,6 +984,12 @@ class ChannelSelectionBase(Screen): if len(charstr) == 1: self.servicelist.moveToChar(charstr[0]) + def keyAsciiCode(self): + unichar = unichr(getPrevAsciiCode()) + charstr = unichar.encode("utf-8") + if len(charstr) == 1: + self.servicelist.moveToChar(charstr[0]) + def getRoot(self): return self.servicelist.getRoot() @@ -1018,11 +1068,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"] = ObsoleteSource(new_source = "global.CurrentTime", removal_date = "2008-01") self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"], { @@ -1039,7 +1092,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect }) self.lastChannelRootTimer = eTimer() - self.lastChannelRootTimer.timeout.get().append(self.__onCreate) + self.lastChannelRootTimer.callback.append(self.__onCreate) self.lastChannelRootTimer.start(100,True) self.history_tv = [ ] @@ -1052,6 +1105,15 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.revertMode = None config.usage.multibouquet.addNotifier(self.multibouquet_config_changed) self.new_service_played = False + self.onExecBegin.append(self.asciiOn) + + def asciiOn(self): + rcinput = eRCInput.getInstance() + rcinput.setKeyboardMode(rcinput.kmAscii) + + def asciiOff(self): + rcinput = eRCInput.getInstance() + rcinput.setKeyboardMode(rcinput.kmNone) def multibouquet_config_changed(self, val): self.recallBouquetMode() @@ -1119,6 +1181,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect root = self.getRoot() if not root or not (root.flags & eServiceReference.isGroup): self.zap() + self.asciiOff() self.close(ref) #called from infoBar and channelSelected @@ -1263,6 +1326,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect elif self.revertMode == MODE_RADIO: self.setModeRadio() self.revertMode = None + self.asciiOff() self.close(None) from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName @@ -1272,7 +1336,7 @@ class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName): Screen.__init__(self, session) InfoBarEvent.__init__(self) InfoBarServiceName.__init__(self) - self["CurrentTime"] = Clock() + self["CurrentTime"] = ObsoleteSource(new_source = "global.CurrentTime", removal_date = "2008-01") self["RdsDecoder"] = RdsDecoder(self.session.nav) self["BlinkingPoint"] = Pixmap() self["BlinkingPoint"].hide() @@ -1285,9 +1349,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS ChannelSelectionEdit.__init__(self) ChannelSelectionEPG.__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) # our simple infobar @@ -1390,6 +1451,8 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS if lastservice.valid(): self.servicelist.setCurrent(lastservice) self.session.nav.playService(lastservice) + else: + self.session.nav.stopService() self.info.show() def channelSelected(self): # just return selected service