1 from Tools.Profile import profile
3 from Screen import Screen
4 from Components.Button import Button
5 from Components.ServiceList import ServiceList
6 from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap
7 from Components.MenuList import MenuList
8 from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
9 profile("ChannelSelection.py 1")
10 from EpgSelection import EPGSelection
11 from enigma import eServiceReference, eEPGCache, eServiceCenter, eRCInput, eTimer, eDVBDB, iPlayableService, iServiceInformation, getPrevAsciiCode
12 from Components.config import config, ConfigSubsection, ConfigText
13 from Tools.NumericalTextInput import NumericalTextInput
14 profile("ChannelSelection.py 2")
15 from Components.NimManager import nimmanager
16 profile("ChannelSelection.py 2.1")
17 from Components.Sources.RdsDecoder import RdsDecoder
18 profile("ChannelSelection.py 2.2")
19 from Components.Sources.ServiceEvent import ServiceEvent
20 profile("ChannelSelection.py 2.3")
21 from Components.Input import Input
22 profile("ChannelSelection.py 3")
23 from Components.ParentalControl import parentalControl
24 from Screens.InputBox import InputBox, PinInput
25 from Screens.MessageBox import MessageBox
26 from Screens.ServiceInfo import ServiceInfo
27 profile("ChannelSelection.py 4")
28 from Screens.RdsDisplay import RassInteractive
29 from ServiceReference import ServiceReference
30 from Tools.BoundFunction import boundFunction
31 from re import compile
33 profile("ChannelSelection.py after imports")
35 FLAG_SERVICE_NEW_FOUND = 64 #define in lib/dvb/idvb.h as dxNewFound = 64
37 class BouquetSelector(Screen):
38 def __init__(self, session, bouquets, selectedFunc, enableWrapAround=False):
39 Screen.__init__(self, session)
41 self.selectedFunc=selectedFunc
43 self["actions"] = ActionMap(["OkCancelActions"],
45 "ok": self.okbuttonClick,
46 "cancel": self.cancelClick
48 entrys = [ (x[0], x[1]) for x in bouquets ]
49 self["menu"] = MenuList(entrys, enableWrapAround)
52 cur = self["menu"].getCurrent()
55 def okbuttonClick(self):
56 self.selectedFunc(self.getCurrent())
64 def cancelClick(self):
67 # csel.bouquet_mark_edit values
72 def append_when_current_valid(current, menu, args, level = 0):
73 if current and current.valid() and level <= config.usage.setup_level.index:
76 class ChannelContextMenu(Screen):
77 def __init__(self, session, csel):
78 Screen.__init__(self, session)
79 #raise Exception("we need a better summary screen here")
83 self["actions"] = ActionMap(["OkCancelActions"],
85 "ok": self.okbuttonClick,
86 "cancel": self.cancelClick
90 current = csel.getCurrentSelection()
91 current_root = csel.getRoot()
92 current_sel_path = current.getPath()
93 current_sel_flags = current.flags
94 inBouquetRootList = current_root and current_root.getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
95 inBouquet = csel.getMutableList() is not None
96 haveBouquets = config.usage.multibouquet.value
98 if not (current_sel_path or current_sel_flags & (eServiceReference.isDirectory|eServiceReference.isMarker)):
99 append_when_current_valid(current, menu, (_("show transponder info"), self.showServiceInformations), level = 2)
100 if csel.bouquet_mark_edit == OFF and not csel.movemode:
101 if not inBouquetRootList:
102 isPlayable = not (current_sel_flags & (eServiceReference.isMarker|eServiceReference.isDirectory))
104 if config.ParentalControl.configured.value:
105 if parentalControl.getProtectionLevel(csel.getCurrentSelection().toCompareString()) == -1:
106 append_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection())), level = 0)
108 append_when_current_valid(current, menu, (_("remove from parental protection"), boundFunction(self.removeParentalProtection, csel.getCurrentSelection())), level = 0)
110 append_when_current_valid(current, menu, (_("add service to bouquet"), self.addServiceToBouquetSelected), level = 0)
112 append_when_current_valid(current, menu, (_("add service to favourites"), self.addServiceToBouquetSelected), level = 0)
114 if current_root.getPath().find('FROM SATELLITES') != -1:
115 append_when_current_valid(current, menu, (_("remove selected satellite"), self.removeSatelliteServices), level = 0)
117 if not inBouquet and current_sel_path.find("PROVIDERS") == -1:
118 append_when_current_valid(current, menu, (_("copy to bouquets"), self.copyCurrentToBouquetList), level = 0)
119 if current_sel_path.find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
120 append_when_current_valid(current, menu, (_("remove all new found flags"), self.removeAllNewFoundFlags), level = 0)
122 append_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService), level = 0)
123 if current_root and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
124 append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0)
126 menu.append((_("add bouquet"), self.showBouquetInputBox))
127 append_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet), level = 0)
129 if inBouquet: # current list is editable?
130 if csel.bouquet_mark_edit == OFF:
131 if not csel.movemode:
132 append_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode), level = 1)
133 if not inBouquetRootList and current_root and not (current_root.flags & eServiceReference.isGroup):
134 menu.append((_("add marker"), self.showMarkerInputBox))
136 append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0)
138 append_when_current_valid(current, menu, (_("enable favourite edit"), self.bouquetMarkStart), level = 0)
139 if current_sel_flags & eServiceReference.isGroup:
140 append_when_current_valid(current, menu, (_("edit alternatives"), self.editAlternativeServices), level = 2)
141 append_when_current_valid(current, menu, (_("show alternatives"), self.showAlternativeServices), level = 2)
142 append_when_current_valid(current, menu, (_("remove all alternatives"), self.removeAlternativeServices), level = 2)
143 elif not current_sel_flags & eServiceReference.isMarker:
144 append_when_current_valid(current, menu, (_("add alternatives"), self.addAlternativeServices), level = 2)
146 append_when_current_valid(current, menu, (_("disable move mode"), self.toggleMoveMode), level = 0)
148 if csel.bouquet_mark_edit == EDIT_BOUQUET:
150 append_when_current_valid(current, menu, (_("end bouquet edit"), self.bouquetMarkEnd), level = 0)
151 append_when_current_valid(current, menu, (_("abort bouquet edit"), self.bouquetMarkAbort), level = 0)
153 append_when_current_valid(current, menu, (_("end favourites edit"), self.bouquetMarkEnd), level = 0)
154 append_when_current_valid(current, menu, (_("abort favourites edit"), self.bouquetMarkAbort), level = 0)
156 append_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd), level = 0)
157 append_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort), level = 0)
159 menu.append((_("back"), self.cancelClick))
160 self["menu"] = MenuList(menu)
162 def okbuttonClick(self):
163 self["menu"].getCurrent()[1]()
165 def cancelClick(self):
168 def showServiceInformations(self):
169 self.session.open( ServiceInfo, self.csel.getCurrentSelection() )
171 def showBouquetInputBox(self):
172 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)
174 def bouquetInputCallback(self, bouquet):
175 if bouquet is not None:
176 self.csel.addBouquet(bouquet, None)
179 def addParentalProtection(self, service):
180 parentalControl.protectService(service.toCompareString())
183 def removeParentalProtection(self, service):
184 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"))
186 def pinEntered(self, service, result):
188 parentalControl.unProtectService(service)
191 self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
193 def addServiceToBouquetSelected(self):
194 bouquets = self.csel.getBouquetList()
199 if cnt > 1: # show bouquet list
200 self.bsel = self.session.openWithCallback(self.bouquetSelClosed, BouquetSelector, bouquets, self.addCurrentServiceToBouquet)
201 elif cnt == 1: # add to only one existing bouquet
202 self.addCurrentServiceToBouquet(bouquets[0][1])
204 def bouquetSelClosed(self, recursive):
209 def removeSatelliteServices(self):
210 curpath = self.csel.getCurrentSelection().getPath()
211 idx = curpath.find("satellitePosition == ")
213 tmp = curpath[idx+21:]
216 satpos = int(tmp[:idx])
217 eDVBDB.getInstance().removeServices(-1, -1, -1, satpos)
220 def copyCurrentToBouquetList(self):
221 self.csel.copyCurrentToBouquetList()
224 def removeBouquet(self):
225 self.csel.removeBouquet()
228 def showMarkerInputBox(self):
229 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)
231 def markerInputCallback(self, marker):
232 if marker is not None:
233 self.csel.addMarker(marker)
236 def addCurrentServiceToBouquet(self, dest):
237 self.csel.addServiceToBouquet(dest)
238 if self.bsel is not None:
239 self.bsel.close(True)
241 self.close(True) # close bouquet selection
243 def removeCurrentService(self):
244 self.csel.removeCurrentService()
247 def toggleMoveMode(self):
248 self.csel.toggleMoveMode()
251 def bouquetMarkStart(self):
252 self.csel.startMarkedEdit(EDIT_BOUQUET)
255 def bouquetMarkEnd(self):
256 self.csel.endMarkedEdit(abort=False)
259 def bouquetMarkAbort(self):
260 self.csel.endMarkedEdit(abort=True)
263 def removeNewFoundFlag(self):
264 eDVBDB.getInstance().removeFlag(self.csel.getCurrentSelection(), FLAG_SERVICE_NEW_FOUND)
267 def removeAllNewFoundFlags(self):
268 curpath = self.csel.getCurrentSelection().getPath()
269 idx = curpath.find("satellitePosition == ")
271 tmp = curpath[idx+21:]
274 satpos = int(tmp[:idx])
275 eDVBDB.getInstance().removeFlags(FLAG_SERVICE_NEW_FOUND, -1, -1, -1, satpos)
278 def editAlternativeServices(self):
279 self.csel.startMarkedEdit(EDIT_ALTERNATIVES)
282 def showAlternativeServices(self):
283 self.csel.enterPath(self.csel.getCurrentSelection())
286 def removeAlternativeServices(self):
287 self.csel.removeAlternativeServices()
290 def addAlternativeServices(self):
291 self.csel.addAlternativeServices()
292 self.csel.startMarkedEdit(EDIT_ALTERNATIVES)
295 class SelectionEventInfo:
297 self["ServiceEvent"] = ServiceEvent()
298 self.servicelist.connectSelChanged(self.__selectionChanged)
299 self.timer = eTimer()
300 self.timer.callback.append(self.updateEventInfo)
301 self.onShown.append(self.__selectionChanged)
303 def __selectionChanged(self):
305 self.timer.start(100, True)
307 def updateEventInfo(self):
308 cur = self.getCurrentSelection()
309 self["ServiceEvent"].newService(cur)
311 class ChannelSelectionEPG:
313 self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"],
315 "showEPGList": self.showEPGList,
318 def showEPGList(self):
319 ref=self.getCurrentSelection()
320 ptr=eEPGCache.getInstance()
321 if ptr.startTimeQuery(ref) != -1:
322 self.session.open(EPGSelection, ref)
324 print 'no epg for service', ref.toString()
326 class ChannelSelectionEdit:
328 self.entry_marked = False
329 self.movemode = False
330 self.bouquet_mark_edit = OFF
331 self.mutableList = None
333 self.saved_title = None
334 self.saved_root = None
336 class ChannelSelectionEditActionMap(ActionMap):
337 def __init__(self, csel, contexts = [ ], actions = { }, prio=0):
338 ActionMap.__init__(self, contexts, actions, prio)
341 def action(self, contexts, action):
342 if action == "cancel":
343 self.csel.handleEditCancel()
344 return 0 # fall-trough
346 return 0 # fall-trough
348 return ActionMap.action(self, contexts, action)
350 self["ChannelSelectEditActions"] = ChannelSelectionEditActionMap(self, ["ChannelSelectEditActions", "OkCancelActions"],
352 "contextMenu": self.doContext,
355 def getMutableList(self, root=eServiceReference()):
356 if not self.mutableList is None:
357 return self.mutableList
358 serviceHandler = eServiceCenter.getInstance()
361 list = root and serviceHandler.list(root)
363 return list.startEdit()
366 def buildBouquetID(self, str):
370 if (c >= 'a' and c <= 'z') or (c >= '0' and c <= '9'):
376 def addMarker(self, name):
377 current = self.servicelist.getCurrent()
378 mutableList = self.getMutableList()
381 str = '1:64:%d:0:0:0:0:0:0:0::%s'%(cnt, name)
382 ref = eServiceReference(str)
383 if current and current.valid():
384 if not mutableList.addService(ref, current):
385 self.servicelist.addService(ref, True)
386 mutableList.flushChanges()
388 elif not mutableList.addService(ref):
389 self.servicelist.addService(ref, True)
390 mutableList.flushChanges()
394 def addAlternativeServices(self):
395 cur_service = ServiceReference(self.getCurrentSelection())
396 root = self.getRoot()
397 cur_root = root and ServiceReference(root)
398 mutableBouquet = cur_root.list().startEdit()
400 name = cur_service.getServiceName()
402 if self.mode == MODE_TV:
403 str = '1:134:1:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(name))
405 str = '1:134:2:0:0:0:0:0:0:0:FROM BOUQUET \"alternatives.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(name))
406 new_ref = ServiceReference(str)
407 if not mutableBouquet.addService(new_ref.ref, cur_service.ref):
408 mutableBouquet.removeService(cur_service.ref)
409 mutableBouquet.flushChanges()
410 eDVBDB.getInstance().reloadBouquets()
411 mutableAlternatives = new_ref.list().startEdit()
412 if mutableAlternatives:
413 mutableAlternatives.setListName(name)
414 if mutableAlternatives.addService(cur_service.ref):
415 print "add", cur_service.toString(), "to new alternatives failed"
416 mutableAlternatives.flushChanges()
417 self.servicelist.addService(new_ref.ref, True)
418 self.servicelist.removeCurrent()
419 self.servicelist.moveUp()
421 print "get mutable list for new created alternatives failed"
423 print "add", str, "to", cur_root.getServiceName(), "failed"
425 print "bouquetlist is not editable"
427 def addBouquet(self, bName, services):
428 serviceHandler = eServiceCenter.getInstance()
429 mutableBouquetList = serviceHandler.list(self.bouquet_root).startEdit()
430 if mutableBouquetList:
431 if self.mode == MODE_TV:
433 str = '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET \"userbouquet.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(bName))
436 str = '1:7:2:0:0:0:0:0:0:0:FROM BOUQUET \"userbouquet.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(bName))
437 new_bouquet_ref = eServiceReference(str)
438 if not mutableBouquetList.addService(new_bouquet_ref):
439 mutableBouquetList.flushChanges()
440 eDVBDB.getInstance().reloadBouquets()
441 mutableBouquet = serviceHandler.list(new_bouquet_ref).startEdit()
443 mutableBouquet.setListName(bName)
444 if services is not None:
445 for service in services:
446 if mutableBouquet.addService(service):
447 print "add", service.toString(), "to new bouquet failed"
448 mutableBouquet.flushChanges()
450 print "get mutable list for new created bouquet failed"
451 # do some voodoo to check if current_root is equal to bouquet_root
452 cur_root = self.getRoot();
453 str1 = cur_root and cur_root.toString()
454 pos1 = str1 and str1.find("FROM BOUQUET") or -1
455 pos2 = self.bouquet_rootstr.find("FROM BOUQUET")
456 if pos1 != -1 and pos2 != -1 and str1[pos1:] == self.bouquet_rootstr[pos2:]:
457 self.servicelist.addService(new_bouquet_ref)
459 print "add", str, "to bouquets failed"
461 print "bouquetlist is not editable"
463 def copyCurrentToBouquetList(self):
464 provider = ServiceReference(self.getCurrentSelection())
465 providerName = provider.getServiceName()
466 serviceHandler = eServiceCenter.getInstance()
467 services = serviceHandler.list(provider.ref)
468 self.addBouquet(providerName, services and services.getContent('R', True))
470 def removeAlternativeServices(self):
471 cur_service = ServiceReference(self.getCurrentSelection())
472 root = self.getRoot()
473 cur_root = root and ServiceReference(root)
474 list = cur_service.list()
475 first_in_alternative = list and list.getNext()
476 if first_in_alternative:
477 edit_root = cur_root and cur_root.list().startEdit()
479 if not edit_root.addService(first_in_alternative, cur_service.ref):
480 self.servicelist.addService(first_in_alternative, True)
482 print "couldn't add first alternative service to current root"
484 print "couldn't edit current root!!"
486 print "remove empty alternative list !!"
488 self.servicelist.moveUp()
490 def removeBouquet(self):
491 refstr = self.getCurrentSelection().toString()
492 print "removeBouquet", refstr
493 self.bouquetNumOffsetCache = { }
494 pos = refstr.find('FROM BOUQUET "')
497 refstr = refstr[pos+14:]
498 pos = refstr.find('"')
500 filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2
501 self.removeCurrentService()
503 if filename is not None:
506 print "error during remove of", filename
508 # multiple marked entry stuff ( edit mode, later multiepg selection )
509 def startMarkedEdit(self, type):
510 self.savedPath = self.servicePath[:]
511 if type == EDIT_ALTERNATIVES:
512 self.enterPath(self.getCurrentSelection())
513 self.mutableList = self.getMutableList()
514 # add all services from the current list to internal marked set in listboxservicecontent
515 self.clearMarks() # this clears the internal marked set in the listboxservicecontent
516 self.saved_title = self.instance.getTitle()
517 pos = self.saved_title.find(')')
518 new_title = self.saved_title[:pos+1]
519 if type == EDIT_ALTERNATIVES:
520 self.bouquet_mark_edit = EDIT_ALTERNATIVES
521 new_title += ' ' + _("[alternative edit]")
523 self.bouquet_mark_edit = EDIT_BOUQUET
524 if config.usage.multibouquet.value:
525 new_title += ' ' + _("[bouquet edit]")
527 new_title += ' ' + _("[favourite edit]")
528 self.setTitle(new_title)
529 self.__marked = self.servicelist.getRootServices()
530 for x in self.__marked:
531 self.servicelist.addMarked(eServiceReference(x))
532 self.showAllServices()
534 def endMarkedEdit(self, abort):
535 if not abort and self.mutableList is not None:
536 self.bouquetNumOffsetCache = { }
537 new_marked = set(self.servicelist.getMarked())
538 old_marked = set(self.__marked)
539 removed = old_marked - new_marked
540 added = new_marked - old_marked
544 self.mutableList.removeService(eServiceReference(x))
547 self.mutableList.addService(eServiceReference(x))
549 self.mutableList.flushChanges()
552 self.bouquet_mark_edit = OFF
553 self.mutableList = None
554 self.setTitle(self.saved_title)
555 self.saved_title = None
556 # self.servicePath is just a reference to servicePathTv or Radio...
557 # so we never ever do use the asignment operator in self.servicePath
558 del self.servicePath[:] # remove all elements
559 self.servicePath += self.savedPath # add saved elements
561 self.setRoot(self.servicePath[-1])
563 def clearMarks(self):
564 self.servicelist.clearMarks()
567 ref = self.servicelist.getCurrent()
568 if self.servicelist.isMarked(ref):
569 self.servicelist.removeMarked(ref)
571 self.servicelist.addMarked(ref)
573 def removeCurrentService(self):
574 ref = self.servicelist.getCurrent()
575 mutableList = self.getMutableList()
576 if ref.valid() and mutableList is not None:
577 if not mutableList.removeService(ref):
578 self.bouquetNumOffsetCache = { }
579 mutableList.flushChanges() #FIXME dont flush on each single removed service
580 self.servicelist.removeCurrent()
582 def addServiceToBouquet(self, dest, service=None):
583 mutableList = self.getMutableList(dest)
584 if not mutableList is None:
585 if service is None: #use current selected service
586 service = self.servicelist.getCurrent()
587 if not mutableList.addService(service):
588 self.bouquetNumOffsetCache = { }
589 mutableList.flushChanges()
590 # do some voodoo to check if current_root is equal to dest
591 cur_root = self.getRoot();
592 str1 = cur_root and cur_root.toString() or -1
593 str2 = dest.toString()
594 pos1 = str1.find("FROM BOUQUET")
595 pos2 = str2.find("FROM BOUQUET")
596 if pos1 != -1 and pos2 != -1 and str1[pos1:] == str2[pos2:]:
597 self.servicelist.addService(service)
599 def toggleMoveMode(self):
601 if self.entry_marked:
602 self.toggleMoveMarked() # unmark current entry
603 self.movemode = False
604 self.pathChangeDisabled = False # re-enable path change
605 self.mutableList.flushChanges() # FIXME add check if changes was made
606 self.mutableList = None
607 self.setTitle(self.saved_title)
608 self.saved_title = None
609 cur_root = self.getRoot()
610 if cur_root and cur_root == self.bouquet_root:
611 self.bouquetNumOffsetCache = { }
613 self.mutableList = self.getMutableList()
615 self.pathChangeDisabled = True # no path change allowed in movemode
616 self.saved_title = self.instance.getTitle()
617 new_title = self.saved_title
618 pos = self.saved_title.find(')')
619 new_title = self.saved_title[:pos+1] + ' ' + _("[move mode]") + self.saved_title[pos+1:]
620 self.setTitle(new_title);
622 def handleEditCancel(self):
623 if self.movemode: #movemode active?
624 self.channelSelected() # unmark
625 self.toggleMoveMode() # disable move mode
626 elif self.bouquet_mark_edit != OFF:
627 self.endMarkedEdit(True) # abort edit mode
629 def toggleMoveMarked(self):
630 if self.entry_marked:
631 self.servicelist.setCurrentMarked(False)
632 self.entry_marked = False
634 self.servicelist.setCurrentMarked(True)
635 self.entry_marked = True
638 self.session.open(ChannelContextMenu, self)
643 # this makes it much simple to implement a selectable radio or tv mode :)
644 service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25) || (type == 134)'
645 service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2)'
647 class ChannelSelectionBase(Screen):
648 def __init__(self, session):
649 Screen.__init__(self, session)
651 self["key_red"] = Button(_("All"))
652 self["key_green"] = Button(_("Satellites"))
653 self["key_yellow"] = Button(_("Provider"))
654 self["key_blue"] = Button(_("Favourites"))
656 self["list"] = ServiceList()
657 self.servicelist = self["list"]
659 self.numericalTextInput = NumericalTextInput()
660 self.numericalTextInput.setUseableChars(u'1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ')
662 self.servicePathTV = [ ]
663 self.servicePathRadio = [ ]
664 self.servicePath = [ ]
668 self.pathChangeDisabled = False
670 self.bouquetNumOffsetCache = { }
672 self["ChannelSelectBaseActions"] = NumberActionMap(["ChannelSelectBaseActions", "NumberActions", "InputAsciiActions"],
674 "showFavourites": self.showFavourites,
675 "showAllServices": self.showAllServices,
676 "showProviders": self.showProviders,
677 "showSatellites": self.showSatellites,
678 "nextBouquet": self.nextBouquet,
679 "prevBouquet": self.prevBouquet,
680 "nextMarker": self.nextMarker,
681 "prevMarker": self.prevMarker,
682 "gotAsciiCode": self.keyAsciiCode,
683 "1": self.keyNumberGlobal,
684 "2": self.keyNumberGlobal,
685 "3": self.keyNumberGlobal,
686 "4": self.keyNumberGlobal,
687 "5": self.keyNumberGlobal,
688 "6": self.keyNumberGlobal,
689 "7": self.keyNumberGlobal,
690 "8": self.keyNumberGlobal,
691 "9": self.keyNumberGlobal,
694 self.recallBouquetMode()
696 def getBouquetNumOffset(self, bouquet):
697 if not config.usage.multibouquet.value:
699 str = bouquet.toString()
701 if not self.bouquetNumOffsetCache.has_key(str):
702 serviceHandler = eServiceCenter.getInstance()
703 bouquetlist = serviceHandler.list(self.bouquet_root)
704 if not bouquetlist is None:
706 bouquetIterator = bouquetlist.getNext()
707 if not bouquetIterator.valid(): #end of list
709 self.bouquetNumOffsetCache[bouquetIterator.toString()]=offsetCount
710 if not (bouquetIterator.flags & eServiceReference.isDirectory):
712 servicelist = serviceHandler.list(bouquetIterator)
713 if not servicelist is None:
715 serviceIterator = servicelist.getNext()
716 if not serviceIterator.valid(): #check if end of list
718 playable = not (serviceIterator.flags & (eServiceReference.isDirectory|eServiceReference.isMarker))
721 return self.bouquetNumOffsetCache.get(str, offsetCount)
723 def recallBouquetMode(self):
724 if self.mode == MODE_TV:
725 self.service_types = service_types_tv
726 if config.usage.multibouquet.value:
727 self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.tv" ORDER BY bouquet'
729 self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet'%(self.service_types)
731 self.service_types = service_types_radio
732 if config.usage.multibouquet.value:
733 self.bouquet_rootstr = '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "bouquets.radio" ORDER BY bouquet'
735 self.bouquet_rootstr = '%s FROM BOUQUET "userbouquet.favourites.radio" ORDER BY bouquet'%(self.service_types)
736 self.bouquet_root = eServiceReference(self.bouquet_rootstr)
740 self.servicePath = self.servicePathTV
741 self.recallBouquetMode()
742 title = self.instance.getTitle()
743 pos = title.find(" (")
749 def setRadioMode(self):
750 self.mode = MODE_RADIO
751 self.servicePath = self.servicePathRadio
752 self.recallBouquetMode()
753 title = self.instance.getTitle()
754 pos = title.find(" (")
760 def setRoot(self, root, justSet=False):
761 path = root.getPath()
762 inBouquetRootList = path.find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
763 pos = path.find('FROM BOUQUET')
764 isBouquet = (pos != -1) and (root.flags & eServiceReference.isDirectory)
765 if not inBouquetRootList and isBouquet:
766 self.servicelist.setMode(ServiceList.MODE_FAVOURITES)
767 self.servicelist.setNumberOffset(self.getBouquetNumOffset(root))
769 self.servicelist.setMode(ServiceList.MODE_NORMAL)
770 self.servicelist.setRoot(root, justSet)
771 self.buildTitleString()
773 def removeModeStr(self, str):
774 if self.mode == MODE_TV:
775 pos = str.find(' (TV)')
777 pos = str.find(' (Radio)')
782 def getServiceName(self, ref):
783 str = self.removeModeStr(ServiceReference(ref).getServiceName())
785 pathstr = ref.getPath()
786 if 'FROM PROVIDERS' in pathstr:
788 if 'FROM SATELLITES' in pathstr:
789 return _("Satellites")
790 if ') ORDER BY name' in pathstr:
794 def buildTitleString(self):
795 titleStr = self.instance.getTitle()
796 pos = titleStr.find(']')
798 pos = titleStr.find(')')
800 titleStr = titleStr[:pos+1]
801 Len = len(self.servicePath)
803 base_ref = self.servicePath[0]
805 end_ref = self.servicePath[Len-1]
808 nameStr = self.getServiceName(base_ref)
809 titleStr += ' ' + nameStr
810 if end_ref is not None:
815 nameStr = self.getServiceName(end_ref)
817 self.setTitle(titleStr)
820 self.servicelist.moveUp()
823 self.servicelist.moveDown()
826 del self.servicePath[:]
828 def enterPath(self, ref, justSet=False):
829 self.servicePath.append(ref)
830 self.setRoot(ref, justSet)
832 def pathUp(self, justSet=False):
833 prev = self.servicePath.pop()
835 current = self.servicePath[-1]
836 self.setRoot(current, justSet)
838 self.setCurrentSelection(prev)
841 def isBasePathEqual(self, ref):
842 if len(self.servicePath) > 1 and self.servicePath[0] == ref:
846 def isPrevPathEqual(self, ref):
847 length = len(self.servicePath)
848 if length > 1 and self.servicePath[length-2] == ref:
852 def preEnterPath(self, refstr):
855 def showAllServices(self):
856 if not self.pathChangeDisabled:
857 refstr = '%s ORDER BY name'%(self.service_types)
858 if not self.preEnterPath(refstr):
859 ref = eServiceReference(refstr)
860 currentRoot = self.getRoot()
861 if currentRoot is None or currentRoot != ref:
865 def showSatellites(self):
866 if not self.pathChangeDisabled:
867 refstr = '%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types)
868 if not self.preEnterPath(refstr):
869 ref = eServiceReference(refstr)
873 if self.isBasePathEqual(ref):
874 if self.isPrevPathEqual(ref):
876 prev = self.pathUp(justSet)
878 currentRoot = self.getRoot()
879 if currentRoot is None or currentRoot != ref:
882 self.enterPath(ref, True)
884 serviceHandler = eServiceCenter.getInstance()
885 servicelist = serviceHandler.list(ref)
886 if not servicelist is None:
888 service = servicelist.getNext()
889 if not service.valid(): #check if end of list
891 unsigned_orbpos = service.getUnsignedData(4) >> 16
892 orbpos = service.getData(4) >> 16
895 if service.getPath().find("FROM PROVIDER") != -1:
896 service_type = _("Providers")
897 elif service.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
898 service_type = _("New")
900 service_type = _("Services")
902 # why we need this cast?
903 service_name = str(nimmanager.getSatDescription(orbpos))
905 if unsigned_orbpos == 0xFFFF: #Cable
906 service_name = _("Cable")
907 elif unsigned_orbpos == 0xEEEE: #Terrestrial
908 service_name = _("Terrestrial")
910 if orbpos > 1800: # west
911 orbpos = 3600 - orbpos
915 service_name = ("%d.%d" + h) % (orbpos / 10, orbpos % 10)
916 service.setName("%s - %s" % (service_name, service_type))
917 self.servicelist.addService(service)
918 cur_ref = self.session.nav.getCurrentlyPlayingServiceReference()
920 pos = self.service_types.rfind(':')
921 refstr = '%s (channelID == %08x%04x%04x) && %s ORDER BY name' %(self.service_types[:pos+1],
922 cur_ref.getUnsignedData(4), # NAMESPACE
923 cur_ref.getUnsignedData(2), # TSID
924 cur_ref.getUnsignedData(3), # ONID
925 self.service_types[pos+1:])
926 ref = eServiceReference(refstr)
927 ref.setName(_("Current Transponder"))
928 self.servicelist.addService(ref)
929 self.servicelist.finishFill()
931 self.setCurrentSelection(prev)
933 def showProviders(self):
934 if not self.pathChangeDisabled:
935 refstr = '%s FROM PROVIDERS ORDER BY name'%(self.service_types)
936 if not self.preEnterPath(refstr):
937 ref = eServiceReference(refstr)
938 if self.isBasePathEqual(ref):
941 currentRoot = self.getRoot()
942 if currentRoot is None or currentRoot != ref:
946 def changeBouquet(self, direction):
947 if not self.pathChangeDisabled:
948 if len(self.servicePath) > 1:
949 #when enter satellite root list we must do some magic stuff..
950 ref = eServiceReference('%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types))
951 if self.isBasePathEqual(ref):
952 self.showSatellites()
959 ref = self.getCurrentSelection()
963 if self.servicePath and self.servicePath[0] == self.bouquet_root:
968 return self.servicelist.atBegin()
971 return self.servicelist.atEnd()
973 def nextBouquet(self):
974 self.changeBouquet(+1)
976 def prevBouquet(self):
977 self.changeBouquet(-1)
979 def showFavourites(self):
980 if not self.pathChangeDisabled:
981 if not self.preEnterPath(self.bouquet_rootstr):
982 if self.isBasePathEqual(self.bouquet_root):
985 currentRoot = self.getRoot()
986 if currentRoot is None or currentRoot != self.bouquet_root:
988 self.enterPath(self.bouquet_root)
990 def keyNumberGlobal(self, number):
991 unichar = self.numericalTextInput.getKey(number)
992 charstr = unichar.encode("utf-8")
993 if len(charstr) == 1:
994 self.servicelist.moveToChar(charstr[0])
996 def keyAsciiCode(self):
997 unichar = unichr(getPrevAsciiCode())
998 charstr = unichar.encode("utf-8")
999 if len(charstr) == 1:
1000 self.servicelist.moveToChar(charstr[0])
1003 return self.servicelist.getRoot()
1005 def getCurrentSelection(self):
1006 return self.servicelist.getCurrent()
1008 def setCurrentSelection(self, service):
1009 self.servicelist.setCurrent(service)
1011 def getBouquetList(self):
1013 serviceHandler = eServiceCenter.getInstance()
1014 if config.usage.multibouquet.value:
1015 list = serviceHandler.list(self.bouquet_root)
1021 if s.flags & eServiceReference.isDirectory:
1022 info = serviceHandler.info(s)
1024 bouquets.append((info.getName(s), s))
1027 info = serviceHandler.info(self.bouquet_root)
1029 bouquets.append((info.getName(self.bouquet_root), self.bouquet_root))
1033 def keyNumber0(self, num):
1034 if len(self.servicePath) > 1:
1037 self.keyNumberGlobal(num)
1040 if len(self.servicePath) > 1:
1041 if self.isBasePathEqual(self.bouquet_root):
1042 self.showFavourites()
1044 ref = eServiceReference('%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types))
1045 if self.isBasePathEqual(ref):
1046 self.showSatellites()
1048 ref = eServiceReference('%s FROM PROVIDERS ORDER BY name'%(self.service_types))
1049 if self.isBasePathEqual(ref):
1050 self.showProviders()
1052 self.showAllServices()
1054 def nextMarker(self):
1055 self.servicelist.moveToNextMarker()
1057 def prevMarker(self):
1058 self.servicelist.moveToPrevMarker()
1062 #config for lastservice
1063 config.tv = ConfigSubsection()
1064 config.tv.lastservice = ConfigText()
1065 config.tv.lastroot = ConfigText()
1066 config.radio = ConfigSubsection()
1067 config.radio.lastservice = ConfigText()
1068 config.radio.lastroot = ConfigText()
1069 config.servicelist = ConfigSubsection()
1070 config.servicelist.lastmode = ConfigText(default = "tv")
1072 class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, SelectionEventInfo):
1073 def __init__(self, session):
1074 ChannelSelectionBase.__init__(self,session)
1075 ChannelSelectionEdit.__init__(self)
1076 ChannelSelectionEPG.__init__(self)
1077 SelectionEventInfo.__init__(self)
1079 self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
1081 "cancel": self.cancel,
1082 "ok": self.channelSelected,
1083 "keyRadio": self.setModeRadio,
1084 "keyTV": self.setModeTv,
1087 self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
1089 iPlayableService.evStart: self.__evServiceStart,
1090 iPlayableService.evEnd: self.__evServiceEnd
1093 self.lastChannelRootTimer = eTimer()
1094 self.lastChannelRootTimer.callback.append(self.__onCreate)
1095 self.lastChannelRootTimer.start(100,True)
1097 self.history_tv = [ ]
1098 self.history_radio = [ ]
1099 self.history = self.history_tv
1100 self.history_pos = 0
1102 self.lastservice = config.tv.lastservice
1103 self.lastroot = config.tv.lastroot
1104 self.revertMode = None
1105 config.usage.multibouquet.addNotifier(self.multibouquet_config_changed)
1106 self.new_service_played = False
1107 self.onExecBegin.append(self.asciiOn)
1110 rcinput = eRCInput.getInstance()
1111 rcinput.setKeyboardMode(rcinput.kmAscii)
1114 rcinput = eRCInput.getInstance()
1115 rcinput.setKeyboardMode(rcinput.kmNone)
1117 def multibouquet_config_changed(self, val):
1118 self.recallBouquetMode()
1120 def __evServiceStart(self):
1121 service = self.session.nav.getCurrentService()
1123 info = service.info()
1125 refstr = info.getInfoString(iServiceInformation.sServiceref)
1126 self.servicelist.setPlayableIgnoreService(eServiceReference(refstr))
1128 def __evServiceEnd(self):
1129 self.servicelist.setPlayableIgnoreService(eServiceReference())
1133 lastservice=eServiceReference(self.lastservice.value)
1134 if lastservice.valid():
1135 self.setCurrentSelection(lastservice)
1137 def setModeTv(self):
1138 if self.revertMode is None and config.servicelist.lastmode.value == "radio":
1139 self.revertMode = MODE_RADIO
1140 self.history = self.history_tv
1141 self.lastservice = config.tv.lastservice
1142 self.lastroot = config.tv.lastroot
1143 config.servicelist.lastmode.value = "tv"
1147 def setModeRadio(self):
1148 if self.revertMode is None and config.servicelist.lastmode.value == "tv":
1149 self.revertMode = MODE_TV
1150 if config.usage.e1like_radio_mode.value:
1151 self.history = self.history_radio
1152 self.lastservice = config.radio.lastservice
1153 self.lastroot = config.radio.lastroot
1154 config.servicelist.lastmode.value = "radio"
1158 def __onCreate(self):
1159 if config.usage.e1like_radio_mode.value:
1160 if config.servicelist.lastmode.value == "tv":
1166 lastservice=eServiceReference(self.lastservice.value)
1167 if lastservice.valid():
1170 def channelSelected(self):
1171 ref = self.getCurrentSelection()
1173 self.toggleMoveMarked()
1174 elif (ref.flags & 7) == 7:
1176 elif self.bouquet_mark_edit != OFF:
1177 if not (self.bouquet_mark_edit == EDIT_ALTERNATIVES and ref.flags & eServiceReference.isGroup):
1179 elif not (ref.flags & eServiceReference.isMarker): # no marker
1180 root = self.getRoot()
1181 if not root or not (root.flags & eServiceReference.isGroup):
1186 #called from infoBar and channelSelected
1188 self.revertMode=None
1189 ref = self.session.nav.getCurrentlyPlayingServiceReference()
1190 nref = self.getCurrentSelection()
1191 if ref is None or ref != nref:
1192 self.new_service_played = True
1193 self.session.nav.playService(nref)
1195 self.saveChannel(nref)
1196 config.servicelist.lastmode.save()
1197 self.addToHistory(nref)
1199 def newServicePlayed(self):
1200 ret = self.new_service_played
1201 self.new_service_played = False
1204 def addToHistory(self, ref):
1205 if self.servicePath is not None:
1206 tmp=self.servicePath[:]
1209 del self.history[self.history_pos+1:]
1212 self.history.append(tmp)
1213 hlen = len(self.history)
1214 if hlen > HISTORYSIZE:
1217 self.history_pos = hlen-1
1219 def historyBack(self):
1220 hlen = len(self.history)
1221 if hlen > 1 and self.history_pos > 0:
1222 self.history_pos -= 1
1223 self.setHistoryPath()
1225 def historyNext(self):
1226 hlen = len(self.history)
1227 if hlen > 1 and self.history_pos < (hlen-1):
1228 self.history_pos += 1
1229 self.setHistoryPath()
1231 def setHistoryPath(self):
1232 path = self.history[self.history_pos][:]
1234 del self.servicePath[:]
1235 self.servicePath += path
1238 cur_root = self.getRoot()
1239 if cur_root and cur_root != root:
1241 self.session.nav.playService(ref)
1242 self.setCurrentSelection(ref)
1243 self.saveChannel(ref)
1247 for i in self.servicePath:
1248 path += i.toString()
1250 if path and path != self.lastroot.value:
1251 self.lastroot.value = path
1252 self.lastroot.save()
1254 def restoreRoot(self):
1256 re = compile('.+?;')
1257 tmp = re.findall(self.lastroot.value)
1260 self.servicePath.append(eServiceReference(i[:-1]))
1263 path = self.servicePath.pop()
1264 self.enterPath(path)
1266 self.showFavourites()
1269 def preEnterPath(self, refstr):
1270 if self.servicePath and self.servicePath[0] != eServiceReference(refstr):
1271 pathstr = self.lastroot.value
1272 if pathstr is not None and pathstr.find(refstr) == 0:
1274 lastservice=eServiceReference(self.lastservice.value)
1275 if lastservice.valid():
1276 self.setCurrentSelection(lastservice)
1280 def saveChannel(self, ref):
1282 refstr = ref.toString()
1285 if refstr != self.lastservice.value:
1286 self.lastservice.value = refstr
1287 self.lastservice.save()
1289 def setCurrentServicePath(self, path):
1291 self.history[self.history_pos] = path
1293 self.history.append(path)
1294 self.setHistoryPath()
1296 def getCurrentServicePath(self):
1298 return self.history[self.history_pos]
1301 def recallPrevService(self):
1302 hlen = len(self.history)
1304 if self.history_pos == hlen-1:
1305 tmp = self.history[self.history_pos]
1306 self.history[self.history_pos] = self.history[self.history_pos-1]
1307 self.history[self.history_pos-1] = tmp
1309 tmp = self.history[self.history_pos+1]
1310 self.history[self.history_pos+1] = self.history[self.history_pos]
1311 self.history[self.history_pos] = tmp
1312 self.setHistoryPath()
1315 if self.revertMode is None:
1317 lastservice=eServiceReference(self.lastservice.value)
1318 if lastservice.valid() and self.getCurrentSelection() != lastservice:
1319 self.setCurrentSelection(lastservice)
1320 elif self.revertMode == MODE_TV:
1322 elif self.revertMode == MODE_RADIO:
1324 self.revertMode = None
1328 class RadioInfoBar(Screen):
1329 def __init__(self, session):
1330 Screen.__init__(self, session)
1331 self["RdsDecoder"] = RdsDecoder(self.session.nav)
1333 class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, InfoBarBase):
1334 ALLOW_SUSPEND = True
1336 def __init__(self, session, infobar):
1337 ChannelSelectionBase.__init__(self, session)
1338 ChannelSelectionEdit.__init__(self)
1339 ChannelSelectionEPG.__init__(self)
1340 InfoBarBase.__init__(self)
1341 self.infobar = infobar
1342 self.onLayoutFinish.append(self.onCreate)
1344 self.info = session.instantiateDialog(RadioInfoBar) # our simple infobar
1346 self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
1348 "keyTV": self.closeRadio,
1349 "keyRadio": self.closeRadio,
1350 "cancel": self.closeRadio,
1351 "ok": self.channelSelected,
1354 self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
1356 iPlayableService.evStart: self.__evServiceStart,
1357 iPlayableService.evEnd: self.__evServiceEnd
1360 ########## RDS Radiotext / Rass Support BEGIN
1361 self.infobar = infobar # reference to real infobar (the one and only)
1362 self["RdsDecoder"] = self.info["RdsDecoder"]
1363 self["RdsActions"] = HelpableActionMap(self, "InfobarRdsActions",
1365 "startRassInteractive": (self.startRassInteractive, _("View Rass interactive..."))
1367 self["RdsActions"].setEnabled(False)
1368 infobar.rds_display.onRassInteractivePossibilityChanged.append(self.RassInteractivePossibilityChanged)
1369 self.onClose.append(self.__onClose)
1371 def __onClose(self):
1372 lastservice=eServiceReference(config.tv.lastservice.value)
1373 self.session.nav.playService(lastservice)
1375 def startRassInteractive(self):
1377 self.infobar.rass_interactive = self.session.openWithCallback(self.RassInteractiveClosed, RassInteractive)
1379 def RassInteractiveClosed(self):
1381 self.infobar.rass_interactive = None
1382 self.infobar.RassSlidePicChanged()
1384 def RassInteractivePossibilityChanged(self, state):
1385 self["RdsActions"].setEnabled(state)
1386 ########## RDS Radiotext / Rass Support END
1388 def closeRadio(self):
1389 self.infobar.rds_display.onRassInteractivePossibilityChanged.remove(self.RassInteractivePossibilityChanged)
1391 #set previous tv service
1394 def __evServiceStart(self):
1395 service = self.session.nav.getCurrentService()
1397 info = service.info()
1399 refstr = info.getInfoString(iServiceInformation.sServiceref)
1400 self.servicelist.setPlayableIgnoreService(eServiceReference(refstr))
1402 def __evServiceEnd(self):
1403 self.servicelist.setPlayableIgnoreService(eServiceReference())
1407 for i in self.servicePathRadio:
1408 path += i.toString()
1410 if path and path != config.radio.lastroot.value:
1411 config.radio.lastroot.value = path
1412 config.radio.lastroot.save()
1414 def restoreRoot(self):
1416 re = compile('.+?;')
1417 tmp = re.findall(config.radio.lastroot.value)
1420 self.servicePathRadio.append(eServiceReference(i[:-1]))
1423 path = self.servicePathRadio.pop()
1424 self.enterPath(path)
1426 self.showFavourites()
1429 def preEnterPath(self, refstr):
1430 if self.servicePathRadio and self.servicePathRadio[0] != eServiceReference(refstr):
1431 pathstr = config.radio.lastroot.value
1432 if pathstr is not None and pathstr.find(refstr) == 0:
1434 lastservice=eServiceReference(config.radio.lastservice.value)
1435 if lastservice.valid():
1436 self.setCurrentSelection(lastservice)
1443 lastservice=eServiceReference(config.radio.lastservice.value)
1444 if lastservice.valid():
1445 self.servicelist.setCurrent(lastservice)
1446 self.session.nav.playService(lastservice)
1448 self.session.nav.stopService()
1451 def channelSelected(self): # just return selected service
1452 ref = self.getCurrentSelection()
1454 self.toggleMoveMarked()
1455 elif (ref.flags & 7) == 7:
1457 elif self.bouquet_mark_edit != OFF:
1458 if not (self.bouquet_mark_edit == EDIT_ALTERNATIVES and ref.flags & eServiceReference.isGroup):
1460 elif not (ref.flags & eServiceReference.isMarker): # no marker
1461 cur_root = self.getRoot()
1462 if not cur_root or not (cur_root.flags & eServiceReference.isGroup):
1463 playingref = self.session.nav.getCurrentlyPlayingServiceReference()
1464 if playingref is None or playingref != ref:
1465 self.session.nav.playService(ref)
1466 config.radio.lastservice.value = ref.toString()
1467 config.radio.lastservice.save()
1470 class SimpleChannelSelection(ChannelSelectionBase):
1471 def __init__(self, session, title):
1472 ChannelSelectionBase.__init__(self, session)
1474 self.onShown.append(self.__onExecCallback)
1476 self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
1478 "cancel": self.close,
1479 "ok": self.channelSelected,
1480 "keyRadio": self.setModeRadio,
1481 "keyTV": self.setModeTv,
1484 def __onExecCallback(self):
1485 self.setTitle(self.title)
1488 def channelSelected(self): # just return selected service
1489 ref = self.getCurrentSelection()
1490 if (ref.flags & 7) == 7:
1492 elif not (ref.flags & eServiceReference.isMarker):
1493 ref = self.getCurrentSelection()
1496 def setModeTv(self):
1498 self.showFavourites()
1500 def setModeRadio(self):
1502 self.showFavourites()