X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/256ac51e89250b6677f11a3ca37ac82bb1fe90b6..ca4309210fb3d5d3f7e2bd4a7a59c3fb86919977:/lib/python/Screens/ChannelSelection.py diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 7f5e1022..d66353c9 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,21 +12,33 @@ from Components.NimManager import nimmanager from Components.ServiceName import ServiceName from Components.Clock import Clock from Components.EventInfo import EventInfo +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 okbuttonClick(self): + self.selectedFunc(self["menu"].getCurrent()[1]) - def bouquetSelected(self): - self.selectedFunc(self["menu"].getCurrent()[2]) + def cancelClick(self): + self.close(False) class ChannelContextMenu(FixedMenu): def __init__(self, session, csel): @@ -37,14 +50,20 @@ class ChannelContextMenu(FixedMenu): 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"), csel.copyCurrentToBouquetList)) + if inBouquet: + menu.append((_("remove service"), self.removeCurrentService)) + elif haveBouquets: + menu.append((_("remove bouquet"), csel.removeBouquet)) if inBouquet: # current list is editable? if not csel.bouquet_mark_edit: @@ -83,6 +102,14 @@ class ChannelContextMenu(FixedMenu): else: #no bouquets in root.. so assume only one favourite list is used self.addCurrentServiceToBouquet(self.csel.bouquet_root) + 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() @@ -159,6 +186,65 @@ 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 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): + 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() + pos = refstr.find('FROM BOUQUET "') + if pos != -1: + refstr = refstr[pos+14:] + print refstr + 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() @@ -238,7 +324,7 @@ class ChannelSelectionEdit: if self.entry_marked: self.toggleMoveMarked() # unmark current entry self.movemode = False - self.pathChangedDisabled = True # re-enable path change + 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) @@ -279,7 +365,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")) @@ -302,6 +388,8 @@ class ChannelSelectionBase(Screen): "showAllServices": self.showAllServices, "showProviders": self.showProviders, "showSatellites": self.showSatellites, + "nextBouquet": self.nextBouquet, + "prevBouquet": self.prevBouquet, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, @@ -416,14 +504,10 @@ class ChannelSelectionBase(Screen): 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) @@ -431,7 +515,6 @@ class ChannelSelectionBase(Screen): current = self.servicePathRadio[length-1] self.setRoot(current, justSet) if not justSet: - print "setCurrentSelection prev" self.setCurrentSelection(prev) return prev @@ -521,14 +604,29 @@ 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 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 +634,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): @@ -598,13 +694,13 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect "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): + def __onCreate(self): self.setTvMode() self.servicePathTV = [ ] self.restoreRoot() @@ -613,7 +709,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.setCurrentSelection(lastservice) self.session.nav.playService(lastservice) - def onShow(self): + def __onShown(self): self.recallBouquetMode() ref = self.session.nav.getCurrentlyPlayingServiceReference() if ref is not None and ref.valid() and ref.getPath() == "": @@ -791,7 +887,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 +907,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,7 +917,7 @@ 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"], { @@ -831,7 +927,7 @@ class SimpleChannelSelection(ChannelSelectionBase): "keyTV": self.setModeTv, }) - def onExecCallback(self): + def __onExecCallback(self): self.session.currentDialog.instance.setTitle(self.title) self.setModeTv()