+from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap
+from Components.MenuList import MenuList
+from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
+profile("ChannelSelection.py 1")
+from EpgSelection import EPGSelection
+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
+profile("ChannelSelection.py 2.1")
+from Components.Sources.RdsDecoder import RdsDecoder
+profile("ChannelSelection.py 2.2")
+from Components.Sources.ServiceEvent import ServiceEvent
+profile("ChannelSelection.py 2.3")
+from Components.Input import Input
+profile("ChannelSelection.py 3")
+from Components.ParentalControl import parentalControl
+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
+
+class BouquetSelector(Screen):
+ def __init__(self, session, bouquets, selectedFunc, enableWrapAround=False):
+ Screen.__init__(self, session)
+
+ self.selectedFunc=selectedFunc
+
+ self["actions"] = ActionMap(["OkCancelActions"],
+ {
+ "ok": self.okbuttonClick,
+ "cancel": self.cancelClick
+ })
+ entrys = [ (x[0], x[1]) for x in bouquets ]
+ self["menu"] = MenuList(entrys, enableWrapAround)
+
+ def getCurrent(self):
+ cur = self["menu"].getCurrent()
+ return cur and cur[1]
+
+ def okbuttonClick(self):
+ self.selectedFunc(self.getCurrent())
+
+ def up(self):
+ self["menu"].up()
+
+ def down(self):
+ self["menu"].down()
+
+ def cancelClick(self):
+ self.close(False)
+
+# csel.bouquet_mark_edit values
+OFF = 0
+EDIT_BOUQUET = 1
+EDIT_ALTERNATIVES = 2
+
+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
+
+ self["actions"] = ActionMap(["OkCancelActions"],
+ {
+ "ok": self.okbuttonClick,
+ "cancel": self.cancelClick
+ })
+ menu = [ ]
+
+ current = csel.getCurrentSelection()
+ current_root = csel.getRoot()
+ 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|eServiceReference.isMarker)):
+ 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:
+ append_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection())), level = 0)
+ else:
+ append_when_current_valid(current, menu, (_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection())), level = 0)
+ if haveBouquets:
+ append_when_current_valid(current, menu, (_("add service to bouquet"), self.addServiceToBouquetSelected), level = 0)
+ else:
+ append_when_current_valid(current, menu, (_("add service to favourites"), self.addServiceToBouquetSelected), level = 0)
+ else:
+ if current_root.getPath().find('FROM SATELLITES') != -1:
+ append_when_current_valid(current, menu, (_("remove selected satellite"), self.removeSatelliteServices), level = 0)
+ if haveBouquets:
+ if not inBouquet and current_sel_path.find("PROVIDERS") == -1:
+ 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:
+ append_when_current_valid(current, menu, (_("remove all new found flags"), self.removeAllNewFoundFlags), level = 0)
+ if inBouquet:
+ 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:
+ append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0)
+ else:
+ menu.append((_("add bouquet"), self.showBouquetInputBox))
+ 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:
+ 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:
+ append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0)
+ else:
+ append_when_current_valid(current, menu, (_("enable favourite edit"), self.bouquetMarkStart), level = 0)
+ if current_sel_flags & eServiceReference.isGroup:
+ 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:
+ append_when_current_valid(current, menu, (_("add alternatives"), self.addAlternativeServices), level = 2)
+ else:
+ append_when_current_valid(current, menu, (_("disable move mode"), self.toggleMoveMode), level = 0)
+ else:
+ if csel.bouquet_mark_edit == EDIT_BOUQUET:
+ if haveBouquets:
+ 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:
+ 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:
+ 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)
+
+ def okbuttonClick(self):
+ self["menu"].getCurrent()[1]()
+
+ def cancelClick(self):
+ self.close(False)
+
+ def showServiceInformations(self):
+ 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, visible_width = 56, type=Input.TEXT)
+
+ def bouquetInputCallback(self, bouquet):
+ if bouquet is not None:
+ 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:
+ cnt = 0
+ else:
+ cnt = len(bouquets)
+ if cnt > 1: # show bouquet list
+ 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])
+
+ def bouquetSelClosed(self, recursive):
+ self.bsel = None
+ if recursive:
+ self.close(False)
+
+ def removeSatelliteServices(self):
+ curpath = self.csel.getCurrentSelection().getPath()
+ idx = curpath.find("satellitePosition == ")
+ if idx != -1:
+ tmp = curpath[idx+21:]
+ idx = tmp.find(')')
+ if idx != -1:
+ satpos = int(tmp[:idx])
+ eDVBDB.getInstance().removeServices(-1, -1, -1, satpos)
+ self.close()
+
+ def copyCurrentToBouquetList(self):
+ self.csel.copyCurrentToBouquetList()
+ self.close()
+
+ def removeBouquet(self):
+ self.csel.removeBouquet()
+ self.close()
+
+ def showMarkerInputBox(self):
+ 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:
+ self.csel.addMarker(marker)
+ self.close()
+
+ def addCurrentServiceToBouquet(self, dest):
+ self.csel.addServiceToBouquet(dest)
+ if self.bsel is not None:
+ self.bsel.close(True)
+ else:
+ self.close(True) # close bouquet selection
+
+ def removeCurrentService(self):
+ self.csel.removeCurrentService()
+ self.close()
+
+ def toggleMoveMode(self):
+ self.csel.toggleMoveMode()
+ self.close()
+
+ def bouquetMarkStart(self):
+ self.csel.startMarkedEdit(EDIT_BOUQUET)
+ self.close()
+
+ def bouquetMarkEnd(self):
+ self.csel.endMarkedEdit(abort=False)
+ self.close()
+
+ def bouquetMarkAbort(self):
+ self.csel.endMarkedEdit(abort=True)
+ self.close()
+
+ def removeNewFoundFlag(self):
+ eDVBDB.getInstance().removeFlag(self.csel.getCurrentSelection(), FLAG_SERVICE_NEW_FOUND)
+ self.close()
+
+ def removeAllNewFoundFlags(self):
+ curpath = self.csel.getCurrentSelection().getPath()
+ idx = curpath.find("satellitePosition == ")
+ if idx != -1:
+ tmp = curpath[idx+21:]
+ idx = tmp.find(')')
+ if idx != -1:
+ satpos = int(tmp[:idx])
+ eDVBDB.getInstance().removeFlags(FLAG_SERVICE_NEW_FOUND, -1, -1, -1, satpos)
+ self.close()
+
+ def editAlternativeServices(self):
+ self.csel.startMarkedEdit(EDIT_ALTERNATIVES)
+ self.close()
+
+ def showAlternativeServices(self):
+ self.csel.enterPath(self.csel.getCurrentSelection())
+ self.close()
+
+ def removeAlternativeServices(self):
+ self.csel.removeAlternativeServices()
+ self.close()
+
+ def addAlternativeServices(self):
+ self.csel.addAlternativeServices()
+ 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"],
+ {
+ "showEPGList": self.showEPGList,
+ })
+
+ def showEPGList(self):
+ ref=self.getCurrentSelection()
+ ptr=eEPGCache.getInstance()
+ if ptr.startTimeQuery(ref) != -1:
+ self.session.open(EPGSelection, ref)
+ else:
+ print 'no epg for service', ref.toString()
+
+class ChannelSelectionEdit:
+ def __init__(self):
+ self.entry_marked = False
+ self.movemode = False
+ self.bouquet_mark_edit = OFF
+ self.mutableList = None
+ self.__marked = [ ]
+ self.saved_title = None
+ self.saved_root = None
+
+ class ChannelSelectionEditActionMap(ActionMap):
+ def __init__(self, csel, contexts = [ ], actions = { }, prio=0):
+ ActionMap.__init__(self, contexts, actions, prio)
+ self.csel = csel
+
+ def action(self, contexts, action):
+ if action == "cancel":
+ self.csel.handleEditCancel()
+ return 0 # fall-trough
+ elif action == "ok":
+ return 0 # fall-trough
+ else:
+ return ActionMap.action(self, contexts, action)