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.Source import ObsoleteSource
+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)
"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):
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
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)
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:
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:
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"],
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)
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_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"))
- elif orbpos == 0xEEEE: #Terrestrial
- n = ("%s (%s)") % (service_name, _("Terrestrial"))
+ if unsigned_orbpos == 0xFFFF: #Cable
+ service_name = _("Cable")
+ elif unsigned_orbpos == 0xEEEE: #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)
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()
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"],
{
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()
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[:]
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()
-
-class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, InfoBarRadioText):
+ self["CurrentTime"] = ObsoleteSource(new_source = "global.CurrentTime", removal_date = "2008-01")
+ self["RdsDecoder"] = RdsDecoder(self.session.nav)
+ self["BlinkingPoint"] = Pixmap()
+ self["BlinkingPoint"].hide()
+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)
-
- config.radio = ConfigSubsection();
- config.radio.lastservice = ConfigText()
- config.radio.lastroot = ConfigText()
+ self.infobar = infobar
self.onLayoutFinish.append(self.onCreate)
- self.info = session.instantiateDialog(RadioInfoBar)
+ self.info = session.instantiateDialog(RadioInfoBar) # our simple infobar
self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
{
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:
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
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)