X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/3e9bd06034d9656d4346225e90e68a65327a4aa0..ca4309210fb3d5d3f7e2bd4a7a59c3fb86919977:/lib/python/Screens/ChannelSelection.py diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index 59cc6b24..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() @@ -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, @@ -516,6 +604,23 @@ 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): @@ -589,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() @@ -604,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() == "": @@ -782,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() @@ -802,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) @@ -812,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"], { @@ -822,7 +927,7 @@ class SimpleChannelSelection(ChannelSelectionBase): "keyTV": self.setModeTv, }) - def onExecCallback(self): + def __onExecCallback(self): self.session.currentDialog.instance.setTitle(self.title) self.setModeTv()