+ self.toggleMoveMarked() # unmark current entry
+ self.movemode = False
+ self.mutableList.flushChanges() # FIXME add check if changes was made
+ self.mutableList = None
+ self.instance.setTitle(self.saved_title)
+ self.saved_title = None
+ else:
+ self.mutableList = self.getMutableList()
+ self.movemode = True
+ self.saved_title = self.instance.getTitle()
+ new_title = self.saved_title
+ new_title += ' ' + _("[move mode]");
+ self.instance.setTitle(new_title);
+
+ def handleEditCancel(self):
+ if self.movemode: #movemode active?
+ self.channelSelected() # unmark
+ self.toggleMoveMode() # disable move mode
+ elif self.bouquet_mark_edit:
+ self.endMarkedEdit(True) # abort edit mode
+
+ def toggleMoveMarked(self):
+ if self.entry_marked:
+ self.servicelist.setCurrentMarked(False)
+ self.entry_marked = False
+ else:
+ self.servicelist.setCurrentMarked(True)
+ self.entry_marked = True
+
+ def doContext(self):
+ self.session.open(ChannelContextMenu, self)
+
+USE_MULTIBOUQUETS = False
+
+MODE_TV = 0
+MODE_RADIO = 1
+
+class ChannelSelectionBase(Screen):
+ def __init__(self, session):
+ Screen.__init__(self, session)
+
+ # this makes it much simple to implement a selectable radio or tv mode :)
+ self.service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17)'
+ self.service_types_radio = '1:7:1:0:0:0:0:0:0:0:(type == 2)'
+
+ self["key_red"] = Button(_("All"))
+ self["key_green"] = Button(_("Satellites"))
+ self["key_yellow"] = Button(_("Provider"))
+ self["key_blue"] = Button(_("Favourites"))
+
+ self["list"] = ServiceList()
+ self.servicelist = self["list"]
+
+ self.numericalTextInput = NumericalTextInput()
+
+ def appendDVBTypes(self, ref):
+ path = ref.getPath()
+ pos = path.find(' FROM BOUQUET')
+ if pos != -1:
+ return eServiceReference(self.service_types + path[pos:])
+ return ref
+
+ def getBouquetNumOffset(self, bouquet):
+ bouquet = self.appendDVBTypes(bouquet)
+ if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK
+ return 0
+ offsetCount = 0
+ serviceHandler = eServiceCenter.getInstance()
+ bouquetlist = serviceHandler.list(self.bouquet_root)
+ if not bouquetlist is None:
+ while True:
+ bouquetIterator = self.appendDVBTypes(bouquetlist.getNext())
+ if not bouquetIterator.valid() or bouquetIterator == bouquet: #end of list or bouquet found
+ break
+ if ((bouquetIterator.flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory):
+ continue
+ servicelist = serviceHandler.list(bouquetIterator)
+ if not servicelist is None:
+ while True:
+ serviceIterator = servicelist.getNext()
+ if not serviceIterator.valid(): #check if end of list
+ break
+ if serviceIterator.flags: #playable services have no flags
+ continue
+ offsetCount += 1
+ return offsetCount
+
+ def setTvMode(self):
+ self.service_types = self.service_types_tv
+ if USE_MULTIBOUQUETS:
+ self.bouquet_root = eServiceReference('1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.tv" ORDER BY bouquet')
+ else:
+ self.bouquet_root = eServiceReference('%s FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet'%(self.service_types))
+ title = self.instance.getTitle()
+ pos = title.find(" (")
+ if pos != -1:
+ title = title[:pos]
+ title += " (TV)"
+ self.instance.setTitle(title)
+ self.mode = MODE_TV
+
+ def setRadioMode(self):
+ self.service_types = self.service_types_radio
+ if USE_MULTIBOUQUETS:
+ self.bouquet_root = eServiceReference('1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.radio" ORDER BY bouquet')
+ else:
+ self.bouquet_root = eServiceReference('%s FROM BOUQUET "userbouquet.favourites.radio" ORDER BY bouquet'%(self.service_types))
+ title = self.instance.getTitle()
+ pos = title.find(" (")
+ if pos != -1:
+ title = title[:pos]
+ title += " (Radio)"
+ self.instance.setTitle(title)
+ self.mode = MODE_RADIO
+
+ def setRootBase(self, root, justSet=False):
+ path = root.getPath()
+ inBouquetRootList = path.find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
+ pos = path.find(' FROM BOUQUET')
+ isBouquet = pos != -1
+ if not inBouquetRootList and isBouquet:
+ self.servicelist.setMode(ServiceList.MODE_FAVOURITES)
+ self.servicelist.setNumberOffset(self.getBouquetNumOffset(root))
+ refstr = self.service_types + path[pos:]
+ root = eServiceReference(refstr)
+ else:
+ self.servicelist.setMode(ServiceList.MODE_NORMAL)
+ self.servicelist.setRoot(root, justSet)
+
+ def moveUp(self):
+ self.servicelist.moveUp()
+
+ def moveDown(self):
+ self.servicelist.moveDown()
+
+ def showAllServices(self):
+ ref = eServiceReference('%s ORDER BY name'%(self.service_types))
+ self.setRoot(ref)
+
+ def showSatellites(self):
+ ref = eServiceReference('%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types))
+ self.setRoot(ref, True)
+ serviceHandler = eServiceCenter.getInstance()
+ servicelist = serviceHandler.list(ref)
+ if not servicelist is None:
+ while True:
+ service = servicelist.getNext()
+ if not service.valid(): #check if end of list
+ break
+ orbpos = service.getData(4) >> 16
+ if service.getPath().find("FROM PROVIDER") != -1:
+ service_name = _("Providers")
+ else:
+ service_name = _("Services")
+ try:
+ service_name += str(' - %s'%(nimmanager.getSatDescription(orbpos)))
+ service.setName(service_name) # why we need this cast?
+ except:
+ if orbpos > 1800: # west
+ service.setName("%s (%3.1f" + _("W") + ")" %(str, (0 - (orbpos - 3600)) / 10.0))
+ else:
+ service.setName("%s (%3.1f" + _("E") + ")" % (str, orbpos / 10.0))
+ self.servicelist.addService(service)
+ self.servicelist.finishFill()
+
+ def showProviders(self):
+ ref = eServiceReference('%s FROM PROVIDERS ORDER BY name'%(self.service_types))
+ self.setRoot(ref)
+
+ def showFavourites(self):
+ self.setRoot(self.bouquet_root)
+
+ def keyNumberGlobal(self, number):
+ char = self.numericalTextInput.getKey(number)
+ print "You pressed number " + str(number)
+ print "You would go to character " + str(char)
+ self.servicelist.moveToChar(char)
+
+ def enterBouquet(self, action):
+ if action[:7] == "bouquet":
+ if action.find("FROM BOUQUET") != -1:
+ self.setRoot(eServiceReference("1:7:1:0:0:0:0:0:0:0:" + action[8:]))