X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/00bcc7ce938eabe4494f821b543364544e4084b4..82c3d190f3e20cb8d2473be89c1fb1ed5d98cec3:/lib/python/Screens/ChannelSelection.py diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 9cc6be7d..7dd805cb 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -2,8 +2,9 @@ from Screen import Screen from Components.Button import Button from Components.ServiceList import ServiceList from Components.ActionMap import NumberActionMap, ActionMap +from Components.MenuList import MenuList from EpgSelection import EPGSelection -from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer +from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer, eDVBDB from Components.config import config, configElement, ConfigSubsection, configText, currentConfigSelectionElement from Screens.FixedMenu import FixedMenu from Tools.NumericalTextInput import NumericalTextInput @@ -11,45 +12,72 @@ from Components.NimManager import nimmanager from Components.ServiceName import ServiceName from Components.Clock import Clock from Components.EventInfo import EventInfo +from Components.Input import Input +from Screens.InputBox import InputBox +from ServiceReference import ServiceReference from re import * +from os import remove import xml.dom.minidom -class BouquetSelector(FixedMenu): +class BouquetSelector(Screen): def __init__(self, session, bouquets, selectedFunc): + Screen.__init__(self, session) + self.selectedFunc=selectedFunc + + self["actions"] = ActionMap(["OkCancelActions"], + { + "ok": self.okbuttonClick, + "cancel": self.cancelClick + }) entrys = [ ] for x in bouquets: - entrys.append((x[0], self.bouquetSelected, x[1])) - FixedMenu.__init__(self, session, "Bouquetlist", entrys) - self.skinName = "Menu" + entrys.append((x[0], x[1])) + self["menu"] = MenuList(entrys) - def bouquetSelected(self): - self.selectedFunc(self["menu"].getCurrent()[2]) + def okbuttonClick(self): + self.selectedFunc(self["menu"].getCurrent()[1]) -class ChannelContextMenu(FixedMenu): + def cancelClick(self): + self.close(False) + +class ChannelContextMenu(Screen): def __init__(self, session, csel): + Screen.__init__(self, session) self.csel = csel + self["actions"] = ActionMap(["OkCancelActions"], + { + "ok": self.okbuttonClick, + "cancel": self.cancelClick + }) menu = [ ] inBouquetRootList = csel.getRoot().getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK inBouquet = csel.getMutableList() is not None haveBouquets = csel.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1 - if not csel.bouquet_mark_edit and not csel.movemode and not inBouquetRootList: - if (csel.getCurrentSelection().flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory: - if haveBouquets: - menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected)) - else: - menu.append((_("add service to favourites"), self.addServiceToBouquetSelected)) - if inBouquet: - menu.append((_("remove service"), self.removeCurrentService)) + if not csel.bouquet_mark_edit and not csel.movemode: + if not inBouquetRootList: + if (csel.getCurrentSelection().flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory: + if haveBouquets: + menu.append((_("add service to bouquet"), self.addServiceToBouquetSelected)) + else: + menu.append((_("add service to favourites"), self.addServiceToBouquetSelected)) + elif haveBouquets: + if not inBouquet and csel.getCurrentSelection().getPath().find("PROVIDERS") == -1: + menu.append((_("copy to favourites"), self.copyCurrentToBouquetList)) + if inBouquet: + menu.append((_("remove service"), self.removeCurrentService)) + elif haveBouquets: + menu.append((_("remove bouquet"), self.removeBouquet)) if inBouquet: # current list is editable? if not csel.bouquet_mark_edit: if not csel.movemode: menu.append((_("enable move mode"), self.toggleMoveMode)) + menu.append((_("add bouquet..."), self.showBouquetInputBox)) if not inBouquetRootList: if haveBouquets: menu.append((_("enable bouquet edit"), self.bouquetMarkStart)) @@ -65,10 +93,21 @@ class ChannelContextMenu(FixedMenu): menu.append((_("end favourites edit"), self.bouquetMarkEnd)) menu.append((_("abort favourites edit"), self.bouquetMarkAbort)) - menu.append((_("back"), self.close)) + menu.append((_("back"), self.cancelClick)) + self["menu"] = MenuList(menu) + + def okbuttonClick(self): + self["menu"].getCurrent()[1]() + + def cancelClick(self): + self.close(False) + + 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) - FixedMenu.__init__(self, session, _("Channel Selection"), menu) - self.skinName = "Menu" + def bouquetInputCallback(self, bouquet): + if bouquet is not None: + self.csel.addBouquet(bouquet) def addServiceToBouquetSelected(self): bouquets = self.csel.getBouquetList() @@ -77,15 +116,27 @@ class ChannelContextMenu(FixedMenu): else: cnt = len(bouquets) if cnt > 1: # show bouquet list - self.session.open(BouquetSelector, bouquets, self.addCurrentServiceToBouquet) + 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): + if recursive: + self.close(False) + + def copyCurrentToBouquetList(self): + self.csel.copyCurrentToBouquetList() + self.close() + + def removeBouquet(self): + self.csel.removeBouquet() + self.close() + def addCurrentServiceToBouquet(self, dest): self.csel.addCurrentServiceToBouquet(dest) - self.close() + self.close(True) # close bouquet selection def removeCurrentService(self): self.csel.removeCurrentService() @@ -136,13 +187,16 @@ class ChannelSelectionEdit: 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": - pass # avoid typo warning... + return 0 # fall-trough else: - ActionMap.action(self, contexts, action) + return ActionMap.action(self, contexts, action) + self["ChannelSelectEditActions"] = ChannelSelectionEditActionMap(self, ["ChannelSelectEditActions", "OkCancelActions"], { "contextMenu": self.doContext, @@ -159,28 +213,116 @@ class ChannelSelectionEdit: return list.startEdit() return None + def buildBouquetID(self, str): + tmp = str.lower() + name = '' + for c in tmp: + if (c >= 'a' and c <= 'z') or (c >= '0' and c <= '9'): + name += c + else: + name += '_' + return name + + def addBouquet(self, providerName): + serviceHandler = eServiceCenter.getInstance() + mutableBouquetList = serviceHandler.list(self.bouquet_root).startEdit() + if mutableBouquetList: + if self.mode == MODE_TV: + providerName += " (TV)" + str = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET \"userbouquet.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(providerName)) + else: + providerName += " (Radio)" + str = '1:7:2:0:0:0:0:0:0:0:(type == 2) FROM BOUQUET \"userbouquet.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(providerName)) + new_bouquet_ref = eServiceReference(str) + if not mutableBouquetList.addService(new_bouquet_ref): + self.bouquetNumOffsetCache = { } + mutableBouquetList.flushChanges() + eDVBDB.getInstance().reloadBouquets() + mutableBouquet = serviceHandler.list(new_bouquet_ref).startEdit() + if mutableBouquet: + mutableBouquet.setListName(providerName) + mutableBouquet.flushChanges() + self.setRoot(self.getRoot()) + else: + print "get mutable list for new created bouquet failed" + else: + print "add", str, "to bouquets failed" + else: + print "bouquetlist is not editable" + + def copyCurrentToBouquetList(self): + provider = ServiceReference(self.getCurrentSelection()) + serviceHandler = eServiceCenter.getInstance() + mutableBouquetList = serviceHandler.list(self.bouquet_root).startEdit() + if mutableBouquetList: + providerName = provider.getServiceName() + if self.mode == MODE_TV: + str = '1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET \"userbouquet.%s.tv\" ORDER BY bouquet'%(self.buildBouquetID(providerName)) + else: + str = '1:7:2:0:0:0:0:0:0:0:(type == 2) FROM BOUQUET \"userbouquet.%s.radio\" ORDER BY bouquet'%(self.buildBouquetID(providerName)) + new_bouquet_ref = eServiceReference(str) + if not mutableBouquetList.addService(new_bouquet_ref): + self.bouquetNumOffsetCache = { } + mutableBouquetList.flushChanges() + eDVBDB.getInstance().reloadBouquets() + 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" + else: + print "list provider", providerName, "failed" + else: + print "get mutable list for new created bouquet failed" + else: + print "add", str, "to bouquets failed" + else: + print "bouquetlist is not editable" + + def removeBouquet(self): + refstr = self.getCurrentSelection().toString() + self.bouquetNumOffsetCache = { } + pos = refstr.find('FROM BOUQUET "') + if pos != -1: + refstr = refstr[pos+14:] + pos = refstr.find('"') + if pos != -1: + filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2 + self.removeCurrentService() + remove(filename) + eDVBDB.getInstance().reloadBouquets() + # multiple marked entry stuff ( edit mode, later multiepg selection ) def startMarkedEdit(self): self.mutableList = self.getMutableList() # add all services from the current list to internal marked set in listboxservicecontent - self.bouquetRoot = self.getRoot() self.clearMarks() # this clears the internal marked set in the listboxservicecontent self.saved_title = self.instance.getTitle() - new_title = self.saved_title + pos = self.saved_title.find(')') + new_title = self.saved_title[:pos+1] if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') != -1: new_title += ' ' + _("[bouquet edit]") else: new_title += ' ' + _("[favourite edit]") - self.instance.setTitle(new_title) + self.setTitle(new_title) self.bouquet_mark_edit = True self.__marked = self.servicelist.getRootServices() for x in self.__marked: self.servicelist.addMarked(eServiceReference(x)) - self.saved_root = self.getRoot() + self.savedPath = self.servicePath[:] self.showAllServices() def endMarkedEdit(self, abort): if not abort and self.mutableList is not None: + self.bouquetNumOffsetCache = { } new_marked = set(self.servicelist.getMarked()) old_marked = set(self.__marked) removed = old_marked - new_marked @@ -197,11 +339,12 @@ class ChannelSelectionEdit: self.__marked = [] self.clearMarks() self.bouquet_mark_edit = False - self.bouquetRoot = None self.mutableList = None - self.instance.setTitle(self.saved_title) + self.setTitle(self.saved_title) self.saved_title = None - self.setRoot(self.saved_root) + self.servicePath = self.savedPath[:] + del self.savedPath + self.setRoot(self.servicePath[len(self.servicePath)-1]) def clearMarks(self): self.servicelist.clearMarks() @@ -218,18 +361,15 @@ class ChannelSelectionEdit: mutableList = self.getMutableList() if ref.valid() and mutableList is not None: if not mutableList.removeService(ref): - currentIndex = self.servicelist.getCurrentIndex() - self.servicelist.moveDown() - if self.servicelist.getCurrentIndex() == currentIndex: - currentIndex -= 1 + self.bouquetNumOffsetCache = { } mutableList.flushChanges() #FIXME dont flush on each single removed service self.setRoot(self.getRoot()) - self.servicelist.moveToIndex(currentIndex) def addCurrentServiceToBouquet(self, dest): mutableList = self.getMutableList(dest) if not mutableList is None: if not mutableList.addService(self.servicelist.getCurrent()): + self.bouquetNumOffsetCache = { } mutableList.flushChanges() self.close() @@ -241,16 +381,19 @@ class ChannelSelectionEdit: self.pathChangedDisabled = False # re-enable path change self.mutableList.flushChanges() # FIXME add check if changes was made self.mutableList = None - self.instance.setTitle(self.saved_title) + self.setTitle(self.saved_title) self.saved_title = None + if self.getRoot() == self.bouquet_root: + self.bouquetNumOffsetCache = { } else: self.mutableList = self.getMutableList() self.movemode = True self.pathChangedDisabled = True # no path change allowed in movemode self.saved_title = self.instance.getTitle() new_title = self.saved_title - new_title += ' ' + _("[move mode]"); - self.instance.setTitle(new_title); + pos = self.saved_title.find(')') + new_title = self.saved_title[:pos+1] + ' ' + _("[move mode]") + self.saved_title[pos+1:] + self.setTitle(new_title); def handleEditCancel(self): if self.movemode: #movemode active? @@ -279,7 +422,7 @@ class ChannelSelectionBase(Screen): # 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.service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2)' self["key_red"] = Button(_("All")) self["key_green"] = Button(_("Satellites")) @@ -293,15 +436,20 @@ class ChannelSelectionBase(Screen): self.servicePathTV = [ ] self.servicePathRadio = [ ] + self.servicePath = None self.pathChangedDisabled = False + self.bouquetNumOffsetCache = { } + self["ChannelSelectBaseActions"] = NumberActionMap(["ChannelSelectBaseActions", "NumberActions"], { "showFavourites": self.showFavourites, "showAllServices": self.showAllServices, "showProviders": self.showProviders, "showSatellites": self.showSatellites, + "nextBouquet": self.nextBouquet, + "prevBouquet": self.prevBouquet, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, @@ -322,29 +470,33 @@ class ChannelSelectionBase(Screen): 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 + bouquet = self.appendDVBTypes(bouquet) + try: + return self.bouquetNumOffsetCache[bouquet.toString()] + except: + 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(): #end of list + break + self.bouquetNumOffsetCache[bouquetIterator.toString()]=offsetCount + 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 self.bouquetNumOffsetCache.get(bouquet.toString(), offsetCount) def recallBouquetMode(self): if self.mode == MODE_TV: @@ -362,24 +514,26 @@ class ChannelSelectionBase(Screen): self.bouquet_root = eServiceReference(self.bouquet_rootstr) def setTvMode(self): + self.mode = MODE_TV + self.servicePath = self.servicePathTV + self.recallBouquetMode() title = self.instance.getTitle() pos = title.find(" (") if pos != -1: title = title[:pos] title += " (TV)" - self.instance.setTitle(title) - self.mode = MODE_TV - self.recallBouquetMode() + self.setTitle(title) def setRadioMode(self): + self.mode = MODE_RADIO + self.servicePath = self.servicePathRadio + self.recallBouquetMode() title = self.instance.getTitle() pos = title.find(" (") if pos != -1: title = title[:pos] title += " (Radio)" - self.instance.setTitle(title) - self.mode = MODE_RADIO - self.recallBouquetMode() + self.setTitle(title) def setRoot(self, root, justSet=False): path = root.getPath() @@ -394,6 +548,53 @@ class ChannelSelectionBase(Screen): else: self.servicelist.setMode(ServiceList.MODE_NORMAL) self.servicelist.setRoot(root, justSet) + self.buildTitleString() + + def removeModeStr(self, str): + if self.mode == MODE_TV: + pos = str.find(' (TV)') + else: + pos = str.find(' (Radio)') + if pos != -1: + return str[:pos] + return str + + def getServiceName(self, ref): + str = self.removeModeStr(ServiceReference(ref).getServiceName()) + if not len(str): + pathstr = ref.getPath() + if pathstr.find('FROM PROVIDERS') != -1: + return _("Provider") + if pathstr.find('FROM SATELLITES') != -1: + return _("Satellites") + if pathstr.find(') ORDER BY name') != -1: + return _("All") + return str + + def buildTitleString(self): + titleStr = self.instance.getTitle() + pos = titleStr.find(']') + if pos == -1: + pos = titleStr.find(')') + if pos != -1: + titleStr = titleStr[:pos+1] + Len = len(self.servicePath) + if Len > 0: + base_ref = self.servicePath[0] + if Len > 1: + end_ref = self.servicePath[Len-1] + else: + end_ref = None + nameStr = self.getServiceName(base_ref) + titleStr += ' ' + nameStr + if end_ref is not None: + if Len > 2: + titleStr += '/../' + else: + titleStr += '/' + nameStr = self.getServiceName(end_ref) + titleStr += nameStr + self.setTitle(titleStr) def moveUp(self): self.servicelist.moveUp() @@ -402,52 +603,30 @@ class ChannelSelectionBase(Screen): self.servicelist.moveDown() def clearPath(self): - if self.mode == MODE_RADIO: - self.servicePathRadio = [ ] - else: - self.servicePathTV = [ ] + del self.servicePath[:] def enterPath(self, ref, justSet=False): - if self.mode == MODE_RADIO: - self.servicePathRadio.append(ref) - else: - self.servicePathTV.append(ref) + self.servicePath.append(ref) self.setRoot(ref, justSet) def pathUp(self, justSet=False): - if self.mode == MODE_TV: - print "MODE_TV" - prev = self.servicePathTV.pop() - print "prev", prev.toString() - length = len(self.servicePathTV) - print "length", length - if length: - current = self.servicePathTV[length-1] - print "current", current.toString() - else: - prev = self.servicePathRadio.pop() - length = len(self.servicePathRadio) - if length: - current = self.servicePathRadio[length-1] - self.setRoot(current, justSet) - if not justSet: - print "setCurrentSelection prev" - self.setCurrentSelection(prev) + prev = self.servicePath.pop() + length = len(self.servicePath) + if length: + current = self.servicePath[length-1] + self.setRoot(current, justSet) + if not justSet: + self.setCurrentSelection(prev) return prev def isBasePathEqual(self, ref): - if self.mode == MODE_RADIO and len(self.servicePathRadio) > 1 and self.servicePathRadio[0] == ref: - return True - elif self.mode == MODE_TV and len(self.servicePathTV) > 1 and self.servicePathTV[0] == ref: + if len(self.servicePath) > 1 and self.servicePath[0] == ref: return True return False def isPrevPathEqual(self, ref): - path = self.servicePathRadio - if self.mode == MODE_TV: - path = self.servicePathTV - length = len(path) - if length > 1 and path[length-2] == ref: + length = len(self.servicePath) + if length > 1 and self.servicePath[length-2] == ref: return True return False @@ -500,9 +679,12 @@ class ChannelSelectionBase(Screen): 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)) + orbpos = 3600 - orbpos + h = _("W") else: - service.setName("%s (%3.1f" + _("E") + ")" % (str, orbpos / 10.0)) + h = _("E") + n = ("%s (%d.%d" + h + ")") % (service_name, orbpos / 10, orbpos % 10) + service.setName(n) self.servicelist.addService(service) self.servicelist.finishFill() if prev is not None: @@ -521,14 +703,38 @@ class ChannelSelectionBase(Screen): self.clearPath() self.enterPath(ref) + def changeBouquet(self, direction): + if not self.pathChangedDisabled: + if self.isBasePathEqual(self.bouquet_root): + self.pathUp() + if direction < 0: + self.moveUp() + else: + self.moveDown() + ref = self.getCurrentSelection() + self.enterPath(ref) + + def inBouquet(self): + return self.isBasePathEqual(self.bouquet_root) + + def atBegin(self): + return self.servicelist.atBegin() + + def atEnd(self): + return self.servicelist.atEnd() + + def nextBouquet(self): + self.changeBouquet(+1) + + def prevBouquet(self): + self.changeBouquet(-1) + def showFavourites(self): if not self.pathChangedDisabled: if not self.preEnterPath(self.bouquet_rootstr): if self.isBasePathEqual(self.bouquet_root): - print "basepath equal" self.pathUp() else: - print "basepath not equal" currentRoot = self.getRoot() if currentRoot is None or currentRoot != self.bouquet_root: self.clearPath() @@ -536,8 +742,6 @@ class ChannelSelectionBase(Screen): 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 getRoot(self): @@ -580,6 +784,8 @@ class ChannelSelectionBase(Screen): return bouquets return None +HISTORYSIZE = 20 + class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG): def __init__(self, session): ChannelSelectionBase.__init__(self,session) @@ -590,30 +796,30 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect config.tv = ConfigSubsection(); config.tv.lastservice = configElement("config.tv.lastservice", configText, "", 0); config.tv.lastroot = configElement("config.tv.lastroot", configText, "", 0); - config.tv.prevservice = configElement("config.tv.prevservice", configText, "", 0); - config.tv.prevroot = configElement("config.tv.prevroot", configText, "", 0); self["actions"] = ActionMap(["OkCancelActions"], { "cancel": self.cancel, "ok": self.channelSelected, }) - self.onShown.append(self.onShow) + self.onShown.append(self.__onShown) self.lastChannelRootTimer = eTimer() - self.lastChannelRootTimer.timeout.get().append(self.onCreate) + self.lastChannelRootTimer.timeout.get().append(self.__onCreate) self.lastChannelRootTimer.start(100,True) - def onCreate(self): + self.history = [ ] + self.history_pos = 0 + + def __onCreate(self): self.setTvMode() - self.servicePathTV = [ ] self.restoreRoot() lastservice=eServiceReference(config.tv.lastservice.value) if lastservice.valid(): self.setCurrentSelection(lastservice) - self.session.nav.playService(lastservice) + self.zap() - def onShow(self): + def __onShown(self): self.recallBouquetMode() ref = self.session.nav.getCurrentlyPlayingServiceReference() if ref is not None and ref.valid() and ref.getPath() == "": @@ -636,25 +842,60 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect #called from infoBar and channelSelected def zap(self): ref = self.session.nav.getCurrentlyPlayingServiceReference() - if ref is None or ref != self.getCurrentSelection(): - self.session.nav.playService(self.getCurrentSelection()) + nref = self.getCurrentSelection() + if ref is None or ref != nref: + 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 + + def historyBack(self): + hlen = len(self.history) + if hlen > 1 and self.history_pos > 0: + self.history_pos -= 1 + self.setHistoryPath() + + def historyNext(self): + hlen = len(self.history) + if hlen > 1 and self.history_pos < (hlen-1): + self.history_pos += 1 + self.setHistoryPath() + + def setHistoryPath(self): + path = self.history[self.history_pos][:] + ref = path.pop() + self.servicePath = path + self.saveRoot() + plen = len(path) + root = path[plen-1] + if self.getRoot() != root: + self.setRoot(root) + self.session.nav.playService(ref) + self.setCurrentSelection(ref) + self.saveChannel() def saveRoot(self): path = '' for i in self.servicePathTV: path += i.toString() path += ';' - if config.tv.prevroot.value != config.tv.lastroot.value: - config.tv.prevroot.value = config.tv.lastroot.value - config.tv.prevroot.save() if len(path) and path != config.tv.lastroot.value: config.tv.lastroot.value = path config.tv.lastroot.save() def restoreRoot(self): - self.servicePathTV = [ ] + self.clearPath() re = compile('.+?;') tmp = re.findall(config.tv.lastroot.value) cnt = 0 @@ -674,7 +915,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect if pathstr is not None and pathstr.find(refstr) == 0: self.restoreRoot() lastservice=eServiceReference(config.tv.lastservice.value) - if lastservice is not None: + if lastservice.valid(): self.setCurrentSelection(lastservice) return True return False @@ -686,29 +927,21 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect else: refstr = "" if refstr != config.tv.lastservice.value: - config.tv.prevservice.value = config.tv.lastservice.value - config.tv.prevservice.save() config.tv.lastservice.value = refstr config.tv.lastservice.save() def recallPrevService(self): - if len(config.tv.prevservice.value) and len(config.tv.prevroot.value): - if config.tv.lastroot.value != config.tv.prevroot.value: - tmp = config.tv.lastroot.value - config.tv.lastroot.value = config.tv.prevroot.value - config.tv.lastroot.save() - config.tv.prevroot.value = tmp - config.tv.prevroot.save() - self.restoreRoot() - if config.tv.lastservice.value != config.tv.prevservice.value: - tmp = config.tv.lastservice.value - config.tv.lastservice.value = config.tv.prevservice.value - config.tv.lastservice.save() - config.tv.prevservice.value = tmp - config.tv.prevservice.save() - lastservice=eServiceReference(config.tv.lastservice.value) - self.session.nav.playService(lastservice) - self.setCurrentSelection(lastservice) + hlen = len(self.history) + if hlen > 1: + if self.history_pos == hlen-1: + tmp = self.history[self.history_pos] + self.history[self.history_pos] = self.history[self.history_pos-1] + self.history[self.history_pos-1] = tmp + else: + tmp = self.history[self.history_pos+1] + self.history[self.history_pos+1] = self.history[self.history_pos] + self.history[self.history_pos] = tmp + self.setHistoryPath() def cancel(self): self.close(None) @@ -758,7 +991,7 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS config.radio.lastroot.save() def restoreRoot(self): - self.servicePathRadio = [ ] + self.clearPath() re = compile('.+?;') tmp = re.findall(config.radio.lastroot.value) cnt = 0 @@ -778,7 +1011,7 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS if pathstr is not None and pathstr.find(refstr) == 0: self.restoreRoot() lastservice=eServiceReference(config.radio.lastservice.value) - if lastservice is not None: + if lastservice.valid(): self.setCurrentSelection(lastservice) return True return False @@ -791,7 +1024,7 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS self.servicelist.setCurrent(lastservice) self.session.nav.playService(lastservice) self.servicelist.setPlayableIgnoreService(lastservice) - self.info.instance.show() + self.info.show() def channelSelected(self): # just return selected service ref = self.getCurrentSelection() @@ -811,7 +1044,7 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS self.saveRoot() def closeRadio(self): - self.info.instance.hide() + self.info.hide() #set previous tv service lastservice=eServiceReference(config.tv.lastservice.value) self.session.nav.playService(lastservice) @@ -821,18 +1054,18 @@ class SimpleChannelSelection(ChannelSelectionBase): def __init__(self, session, title): ChannelSelectionBase.__init__(self, session) self.title = title - self.onShown.append(self.onExecCallback) + self.onShown.append(self.__onExecCallback) self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"], { - "cancel": self.cancel, + "cancel": self.close, "ok": self.channelSelected, "keyRadio": self.setModeRadio, "keyTV": self.setModeTv, }) - def onExecCallback(self): - self.session.currentDialog.instance.setTitle(self.title) + def __onExecCallback(self): + self.setTitle(self.title) self.setModeTv() def channelSelected(self): # just return selected service