X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/82c3d190f3e20cb8d2473be89c1fb1ed5d98cec3..40d02f130ec7ce66be08013e33b2006fa1453299:/lib/python/Screens/ChannelSelection.py diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 7dd805cb..6bc04c80 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -21,7 +21,7 @@ from os import remove import xml.dom.minidom class BouquetSelector(Screen): - def __init__(self, session, bouquets, selectedFunc): + def __init__(self, session, bouquets, selectedFunc, enableWrapAround=False): Screen.__init__(self, session) self.selectedFunc=selectedFunc @@ -34,10 +34,20 @@ class BouquetSelector(Screen): entrys = [ ] for x in bouquets: entrys.append((x[0], x[1])) - self["menu"] = MenuList(entrys) + self["menu"] = MenuList(entrys, enableWrapAround) + + def getCurrent(self): + cur = self["menu"].getCurrent() + return cur and cur[1] def okbuttonClick(self): - self.selectedFunc(self["menu"].getCurrent()[1]) + self.selectedFunc(self.getCurrent()) + + def up(self): + self["menu"].up() + + def down(self): + self["menu"].down() def cancelClick(self): self.close(False) @@ -46,6 +56,7 @@ class ChannelContextMenu(Screen): def __init__(self, session, csel): Screen.__init__(self, session) self.csel = csel + self.bsel = None self["actions"] = ActionMap(["OkCancelActions"], { @@ -54,7 +65,8 @@ class ChannelContextMenu(Screen): }) menu = [ ] - inBouquetRootList = csel.getRoot().getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK + current_root = csel.getRoot() + inBouquetRootList = current_root and current_root.getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK inBouquet = csel.getMutableList() is not None haveBouquets = csel.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1 @@ -116,13 +128,14 @@ class ChannelContextMenu(Screen): else: cnt = len(bouquets) if cnt > 1: # show bouquet list - self.session.openWithCallback(self.bouquetSelClosed, BouquetSelector, bouquets, self.addCurrentServiceToBouquet) + 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]) else: #no bouquets in root.. so assume only one favourite list is used self.addCurrentServiceToBouquet(self.csel.bouquet_root) def bouquetSelClosed(self, recursive): + self.bsel = None if recursive: self.close(False) @@ -136,7 +149,10 @@ class ChannelContextMenu(Screen): def addCurrentServiceToBouquet(self, dest): self.csel.addCurrentServiceToBouquet(dest) - self.close(True) # close bouquet selection + if self.bsel is not None: + self.bsel.close(True) + else: + self.close(True) # close bouquet selection def removeCurrentService(self): self.csel.removeCurrentService() @@ -208,7 +224,7 @@ class ChannelSelectionEdit: serviceHandler = eServiceCenter.getInstance() if not root.valid(): root=self.getRoot() - list = serviceHandler.list(root) + list = root and serviceHandler.list(root) if list is not None: return list.startEdit() return None @@ -268,16 +284,13 @@ class ChannelSelectionEdit: mutableBouquet = serviceHandler.list(new_bouquet_ref).startEdit() if mutableBouquet: mutableBouquet.setListName(providerName) - list = [ ] services = serviceHandler.list(provider.ref) if not services is None: - if not services.getContent(list, True): - for service in list: - if mutableBouquet.addService(service): - print "add", service.toString(), "to new bouquet failed" - mutableBouquet.flushChanges() - else: - print "getContent failed" + list = services.getContent('R', True) + for service in list: + if mutableBouquet.addService(service): + print "add", service.toString(), "to new bouquet failed" + mutableBouquet.flushChanges() else: print "list provider", providerName, "failed" else: @@ -297,7 +310,10 @@ class ChannelSelectionEdit: if pos != -1: filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2 self.removeCurrentService() - remove(filename) + try: + remove(filename) + except OSError: + print "error during remove of", filename eDVBDB.getInstance().reloadBouquets() # multiple marked entry stuff ( edit mode, later multiepg selection ) @@ -342,7 +358,10 @@ class ChannelSelectionEdit: self.mutableList = None self.setTitle(self.saved_title) self.saved_title = None - self.servicePath = self.savedPath[:] + # self.servicePath is just a reference to servicePathTv or Radio... + # so we never ever do use the asignment operator in self.servicePath + del self.servicePath[:] # remove all elements + self.servicePath += self.savedPath # add saved elements del self.savedPath self.setRoot(self.servicePath[len(self.servicePath)-1]) @@ -371,7 +390,6 @@ class ChannelSelectionEdit: if not mutableList.addService(self.servicelist.getCurrent()): self.bouquetNumOffsetCache = { } mutableList.flushChanges() - self.close() def toggleMoveMode(self): if self.movemode: @@ -421,7 +439,7 @@ class ChannelSelectionBase(Screen): 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_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195)' self.service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2)' self["key_red"] = Button(_("All")) @@ -436,7 +454,9 @@ class ChannelSelectionBase(Screen): self.servicePathTV = [ ] self.servicePathRadio = [ ] - self.servicePath = None + self.servicePath = [ ] + + self.mode = MODE_TV self.pathChangedDisabled = False @@ -459,7 +479,7 @@ class ChannelSelectionBase(Screen): "7": self.keyNumberGlobal, "8": self.keyNumberGlobal, "9": self.keyNumberGlobal, - "0": self.keyNumberGlobal + "0": self.keyNumber0 }) def appendDVBTypes(self, ref): @@ -669,7 +689,7 @@ class ChannelSelectionBase(Screen): service = servicelist.getNext() if not service.valid(): #check if end of list break - orbpos = service.getData(4) >> 16 + orbpos = service.getUnsignedData(4) >> 16 if service.getPath().find("FROM PROVIDER") != -1: service_name = _("Providers") else: @@ -678,12 +698,17 @@ class ChannelSelectionBase(Screen): service_name += str(' - %s'%(nimmanager.getSatDescription(orbpos))) service.setName(service_name) # why we need this cast? except: - if orbpos > 1800: # west - orbpos = 3600 - orbpos - h = _("W") + if orbpos == 0xFFFF: #Cable + n = ("%s (%s)") % (service_name, _("Cable")) + elif orbpos == 0xEEEE: #Terrestrial + n = ("%s (%s)") % (service_name, _("Terrestrial")) else: - h = _("E") - n = ("%s (%d.%d" + h + ")") % (service_name, orbpos / 10, orbpos % 10) + 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) self.servicelist.addService(service) self.servicelist.finishFill() @@ -784,6 +809,27 @@ class ChannelSelectionBase(Screen): return bouquets return None + def keyNumber0(self, num): + if len(self.servicePath) > 1: + self.keyGoUp() + else: + self.keyNumberGlobal(num) + + def keyGoUp(self): + if len(self.servicePath) > 1: + if self.isBasePathEqual(self.bouquet_root): + self.showFavourites() + else: + ref = eServiceReference('%s FROM SATELLITES ORDER BY satellitePosition'%(self.service_types)) + if self.isBasePathEqual(ref): + self.showSatellites() + else: + ref = eServiceReference('%s FROM PROVIDERS ORDER BY name'%(self.service_types)) + if self.isBasePathEqual(ref): + self.showProviders() + else: + self.showAllServices() + HISTORYSIZE = 20 class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG): @@ -847,18 +893,19 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.session.nav.playService(nref) self.saveRoot() self.saveChannel() - tmp=self.servicePath[:] - tmp.append(nref) - try: - del self.history[self.history_pos+1:] - except: - pass - self.history.append(tmp) - hlen = len(self.history) - if hlen > HISTORYSIZE: - del self.history[0] - hlen -= 1 - self.history_pos = hlen-1 + if self.servicePath is not None: + tmp=self.servicePath[:] + tmp.append(nref) + try: + del self.history[self.history_pos+1:] + except: + pass + self.history.append(tmp) + hlen = len(self.history) + if hlen > HISTORYSIZE: + del self.history[0] + hlen -= 1 + self.history_pos = hlen-1 def historyBack(self): hlen = len(self.history) @@ -875,7 +922,8 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect def setHistoryPath(self): path = self.history[self.history_pos][:] ref = path.pop() - self.servicePath = path + del self.servicePath[:] + self.servicePath += path self.saveRoot() plen = len(path) root = path[plen-1]