only one bouquet
[enigma2.git] / lib / python / Screens / ChannelSelection.py
index 8951770a511e26b427871a56c18e8547a82e13da..8fb46f5e2cc222f4d262083025d56d7201d5889c 100644 (file)
@@ -1,11 +1,13 @@
 from Screen import Screen
 from Components.Button import Button
 from Components.ServiceList import ServiceList
 from Screen import Screen
 from Components.Button import Button
 from Components.ServiceList import ServiceList
-from Components.ActionMap import ActionMap
+from Components.ActionMap import NumberActionMap
 from EpgSelection import EPGSelection
 from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer
 from Components.config import config, configElement, ConfigSubsection, configText
 from Screens.FixedMenu import FixedMenu
 from EpgSelection import EPGSelection
 from enigma import eServiceReference, eEPGCache, eEPGCachePtr, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer
 from Components.config import config, configElement, ConfigSubsection, configText
 from Screens.FixedMenu import FixedMenu
+from Tools.NumericalTextInput import NumericalTextInput
+from Components.NimManager import nimmanager
 
 import xml.dom.minidom
 
 
 import xml.dom.minidom
 
@@ -28,29 +30,41 @@ class ChannelContextMenu(FixedMenu):
 
                menu = [ ]
 
 
                menu = [ ]
 
-               inBouquetRootList = csel.servicelist.getRoot().toString().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
+               inBouquetRootList = csel.servicelist.getRoot().getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
                inBouquet = csel.getMutableList() is not None
                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 not csel.bouquet_mark_edit and not csel.movemode and not inBouquetRootList:
-                       menu.append(("add service to bouquet", self.addServiceToBouquetSelected))
+                       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:
                        if inBouquet:
-                               menu.append(("remove service", self.removeCurrentService))
+                               menu.append((_("remove service"), self.removeCurrentService))
 
                if inBouquet: # current list is editable?
                        if not csel.bouquet_mark_edit:
                                if not csel.movemode:
 
                if inBouquet: # current list is editable?
                        if not csel.bouquet_mark_edit:
                                if not csel.movemode:
-                                       menu.append(("enable move mode", self.toggleMoveMode))
-                                       if not inBouquetRootList: 
-                                               menu.append(("enable bouquet edit", self.bouquetMarkStart))
+                                       menu.append((_("enable move mode"), self.toggleMoveMode))
+                                       if not inBouquetRootList:
+                                               if haveBouquets:
+                                                       menu.append((_("enable bouquet edit"), self.bouquetMarkStart))
+                                               else:
+                                                       menu.append((_("enable favourite edit"), self.bouquetMarkStart))
+                               else:
+                                       menu.append((_("disable move mode"), self.toggleMoveMode))
+                       elif not inBouquetRootList:
+                               if haveBouquets:
+                                       menu.append((_("end bouquet edit"), self.bouquetMarkEnd))
+                                       menu.append((_("abort bouquet edit"), self.bouquetMarkAbort))
                                else:
                                else:
-                                       menu.append(("disable move mode", self.toggleMoveMode))
-                       elif not inBouquetRootList: 
-                               menu.append(("end bouquet edit", self.bouquetMarkEnd))
-                               menu.append(("abort bouquet edit", self.bouquetMarkAbort))
+                                       menu.append((_("end favourites edit"), self.bouquetMarkEnd))
+                                       menu.append((_("abort favourites edit"), self.bouquetMarkAbort))
 
 
-               menu.append(("back", self.close))
+               menu.append((_("back"), self.close))
 
 
-               FixedMenu.__init__(self, session, "Channel Selection", menu)
+               FixedMenu.__init__(self, session, _("Channel Selection"), menu)
                self.skinName = "Menu"
 
        def addServiceToBouquetSelected(self):
                self.skinName = "Menu"
 
        def addServiceToBouquetSelected(self):
@@ -105,6 +119,8 @@ class ChannelSelectionEdit:
                self.bouquet_mark_edit = False
                self.mutableList = None
                self.__marked = [ ]
                self.bouquet_mark_edit = False
                self.mutableList = None
                self.__marked = [ ]
+               self.saved_title = None
+               self.saved_root = None
 
        def getMutableList(self, root=eServiceReference()):
                if not self.mutableList is None:
 
        def getMutableList(self, root=eServiceReference()):
                if not self.mutableList is None:
@@ -123,10 +139,19 @@ class ChannelSelectionEdit:
                # add all services from the current list to internal marked set in listboxservicecontent
                self.bouquetRoot = self.servicelist.getRoot()
                self.clearMarks() # this clears the internal marked set in the listboxservicecontent
                # add all services from the current list to internal marked set in listboxservicecontent
                self.bouquetRoot = self.servicelist.getRoot()
                self.clearMarks() # this clears the internal marked set in the listboxservicecontent
+               self.saved_title = self.instance.getTitle()
+               new_title = self.saved_title
+               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.bouquet_mark_edit = True
                self.__marked = self.servicelist.getRootServices()
                for x in self.__marked:
                        self.servicelist.addMarked(eServiceReference(x))
                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.showAllServices()
 
        def endMarkedEdit(self, abort):
                if not abort and self.mutableList is not None:
 
        def endMarkedEdit(self, abort):
                if not abort and self.mutableList is not None:
@@ -143,13 +168,14 @@ class ChannelSelectionEdit:
                                self.mutableList.addService(eServiceReference(x))
                        if changed:
                                self.mutableList.flushChanges()
                                self.mutableList.addService(eServiceReference(x))
                        if changed:
                                self.mutableList.flushChanges()
-                               self.setRoot(self.bouquetRoot)
-                               #self.showFavourites()
                self.__marked = []
                self.clearMarks()
                self.bouquet_mark_edit = False
                self.bouquetRoot = None
                self.mutableList = None
                self.__marked = []
                self.clearMarks()
                self.bouquet_mark_edit = False
                self.bouquetRoot = None
                self.mutableList = None
+               self.instance.setTitle(self.saved_title)
+               self.saved_title = None
+               self.setRoot(self.saved_root)
 
        def clearMarks(self):
                self.servicelist.clearMarks()
 
        def clearMarks(self):
                self.servicelist.clearMarks()
@@ -166,8 +192,13 @@ class ChannelSelectionEdit:
                mutableList = self.getMutableList()
                if ref.valid() and mutableList is not None:
                        if not mutableList.removeService(ref):
                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
                                mutableList.flushChanges() #FIXME dont flush on each single removed service
                                self.setRoot(self.servicelist.getRoot())
                                mutableList.flushChanges() #FIXME dont flush on each single removed service
                                self.setRoot(self.servicelist.getRoot())
+                               self.servicelist.moveToIndex(currentIndex)
 
        def addCurrentServiceToBouquet(self, dest):
                mutableList = self.getMutableList(dest)
 
        def addCurrentServiceToBouquet(self, dest):
                mutableList = self.getMutableList(dest)
@@ -183,9 +214,15 @@ class ChannelSelectionEdit:
                        self.movemode = False
                        self.mutableList.flushChanges() # FIXME add check if changes was made
                        self.mutableList = None
                        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
                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?
 
        def handleEditCancel(self):
                if self.movemode: #movemode active?
@@ -209,27 +246,29 @@ class ChannelSelectionBase(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
 
        def __init__(self, session):
                Screen.__init__(self, session)
 
-               self.bouquet_root = eServiceReference('1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.tv" ORDER BY bouquet')
-               #self.bouquet_root = eServiceReference('1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet')
+               # 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("Provider")
-               #self["key_yellow"] = Button("Satellite")
-               self["key_green"] = Button("")
-               self["key_yellow"] = Button("")
-               self["key_blue"] = Button("Favourites")
+               self.service_types = self.service_types_tv
+
+               #self.bouquet_root = eServiceReference('1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.tv" ORDER BY bouquet')
+               self.bouquet_root = eServiceReference('%s FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet'%(self.service_types))
+
+               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["okbutton"] = Button("ok", [self.channelSelected])
 
 
                self["list"] = ServiceList()
                self.servicelist = self["list"]
 
                #self["okbutton"] = Button("ok", [self.channelSelected])
 
-               self.lastServiceTimer = eTimer()
-               self.lastServiceTimer.timeout.get().append(self.lastService)
-               self.lastServiceTimer.start(100)
+               self.numericalTextInput = NumericalTextInput()
 
        def getBouquetNumOffset(self, bouquet):
 
        def getBouquetNumOffset(self, bouquet):
-               if self.bouquet_root.toString().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK
+               if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK
                        return 0
                offsetCount = 0
                serviceHandler = eServiceCenter.getInstance()
                        return 0
                offsetCount = 0
                serviceHandler = eServiceCenter.getInstance()
@@ -252,14 +291,14 @@ class ChannelSelectionBase(Screen):
                                                offsetCount += 1
                return offsetCount
 
                                                offsetCount += 1
                return offsetCount
 
-       def setRootBase(self, root):
-               inBouquetRootList = root.toString().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
-               if not inBouquetRootList and ((root.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory):
+       def setRootBase(self, root, justSet=False):
+               inBouquetRootList = root.getPath().find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
+               if not inBouquetRootList and (root.getPath().find('FROM BOUQUET') != -1):
                        self.servicelist.setMode(ServiceList.MODE_FAVOURITES)
                        self.servicelist.setNumberOffset(self.getBouquetNumOffset(root))
                else:
                        self.servicelist.setMode(ServiceList.MODE_NORMAL)
                        self.servicelist.setMode(ServiceList.MODE_FAVOURITES)
                        self.servicelist.setNumberOffset(self.getBouquetNumOffset(root))
                else:
                        self.servicelist.setMode(ServiceList.MODE_NORMAL)
-               self.servicelist.setRoot(root)
+               self.servicelist.setRoot(root, justSet)
 
        def moveUp(self):
                self.servicelist.moveUp()
 
        def moveUp(self):
                self.servicelist.moveUp()
@@ -267,9 +306,49 @@ class ChannelSelectionBase(Screen):
        def moveDown(self):
                self.servicelist.moveDown()
 
        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 += ' - %s'%(nimmanager.getSatDescription(orbpos))
+                                       service.setName(str(service_name)) # why we need this cast?
+                               except:
+                                       if orbpos > 1800: # west
+                                               service.setName("%s (%3.1fW)"%(str, (0 - (orbpos - 3600)) / 10.0))
+                                       else:
+                                               service.setName("%s (%3.1fE)"%(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 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:
        def enterBouquet(self, action):
                if action[:7] == "bouquet":
                        if action.find("FROM BOUQUET") != -1:
@@ -301,15 +380,12 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                config.tv.lastservice = configElement("config.tv.lastservice", configText, "", 0);
                config.tv.lastroot = configElement("config.tv.lastroot", configText, "", 0);
 
                config.tv.lastservice = configElement("config.tv.lastservice", configText, "", 0);
                config.tv.lastroot = configElement("config.tv.lastroot", configText, "", 0);
 
-               if config.tv.lastroot.value == "":
-                       self.servicelist.setRoot(eServiceReference("""1:0:1:0:0:0:0:0:0:0:(type == 1)"""))
-
-               class ChannelActionMap(ActionMap):
+               class ChannelActionMap(NumberActionMap):
                        def action(self, contexts, action):
                                if not self.csel.enterBouquet(action):
                                        if action == "cancel":
                                                self.csel.handleEditCancel()
                        def action(self, contexts, action):
                                if not self.csel.enterBouquet(action):
                                        if action == "cancel":
                                                self.csel.handleEditCancel()
-                                       ActionMap.action(self, contexts, action)
+                                       NumberActionMap.action(self, contexts, action)
                self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions"],
                        {
                                "cancel": self.cancel,
                self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions"],
                        {
                                "cancel": self.cancel,
@@ -317,12 +393,50 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                                "mark": self.doMark,
                                "contextMenu": self.doContext,
                                "showFavourites": self.showFavourites,
                                "mark": self.doMark,
                                "contextMenu": self.doContext,
                                "showFavourites": self.showFavourites,
-                               "showEPGList": self.showEPGList
+                               "showAllServices": self.showAllServices,
+                               "showProviders": self.showProviders,
+                               "showSatellites": self.showSatellites,
+                               "showEPGList": self.showEPGList,
+                               "1": self.keyNumberGlobal,
+                               "2": self.keyNumberGlobal,
+                               "3": self.keyNumberGlobal,
+                               "4": self.keyNumberGlobal,
+                               "5": self.keyNumberGlobal,
+                               "6": self.keyNumberGlobal,
+                               "7": self.keyNumberGlobal,
+                               "8": self.keyNumberGlobal,
+                               "9": self.keyNumberGlobal,
+                               "0": self.keyNumberGlobal
                        })
                self["actions"].csel = self
                        })
                self["actions"].csel = self
+               self.onShown.append(self.onShow)
+
+#              self.onLayoutFinish.append(self.onCreate)
+               self.lastChannelRootTimer = eTimer()
+               self.lastChannelRootTimer.timeout.get().append(self.onCreate)
+               self.lastChannelRootTimer.start(100,True)
+
+       def onCreate(self):
+               lastroot=eServiceReference(config.tv.lastroot.value)
+               if lastroot.valid():
+                       self.setRoot(lastroot)
+               else:
+                       self.showFavourites()
+                       self.saveRoot(self.getRoot())
+               lastservice=eServiceReference(config.tv.lastservice.value)
+               if lastservice.valid():
+                       self.session.nav.playService(lastservice)
+                       self.servicelist.setCurrent(lastservice)
+
+       def onShow(self):
+               ref = self.session.nav.getCurrentlyPlayingServiceReference()
+               if ref is not None and ref.valid() and ref.getPath() == "":
+                       self.servicelist.setPlayableIgnoreService(ref)
+               else:
+                       self.servicelist.setPlayableIgnoreService(eServiceReference())
 
        def showEPGList(self):
 
        def showEPGList(self):
-               ref=self.servicelist.getCurrent()
+               ref=self.getCurrentSelection()
                ptr=eEPGCache.getInstance()
                if ptr.startTimeQuery(ref) != -1:
                        self.session.open(EPGSelection, ref)
                ptr=eEPGCache.getInstance()
                if ptr.startTimeQuery(ref) != -1:
                        self.session.open(EPGSelection, ref)
@@ -330,7 +444,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                        print 'no epg for service', ref.toString()
 
        def channelSelected(self):
                        print 'no epg for service', ref.toString()
 
        def channelSelected(self):
-               ref = self.servicelist.getCurrent()
+               ref = self.getCurrentSelection()
                if self.movemode:
                        self.toggleMoveMarked()
                elif (ref.flags & 7) == 7:
                if self.movemode:
                        self.toggleMoveMarked()
                elif (ref.flags & 7) == 7:
@@ -341,13 +455,14 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                        self.zap()
                        self.close(ref)
 
                        self.zap()
                        self.close(ref)
 
-       def setRoot(self, root):
+       def setRoot(self, root, justSet=False):
                if not self.movemode:
                if not self.movemode:
-                       self.setRootBase(root)
+                       self.setRootBase(root, justSet)
 
        #called from infoBar and channelSelected
        def zap(self):
 
        #called from infoBar and channelSelected
        def zap(self):
-               self.session.nav.playService(self.servicelist.getCurrent())
+               self.session.nav.playService(self.getCurrentSelection())
+               self.saveRoot(self.getRoot())
                self.saveChannel()
 
        def saveRoot(self, root):
                self.saveChannel()
 
        def saveRoot(self, root):
@@ -364,11 +479,14 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                config.tv.lastservice.value = refstr
                config.tv.lastservice.save()
 
                config.tv.lastservice.value = refstr
                config.tv.lastservice.save()
 
-       def lastService(self):
-               self.lastServiceTimer.stop()
-               #zap to last running tv service
-               self.setRoot(eServiceReference(config.tv.lastroot.value))
-               self.session.nav.playService(eServiceReference(config.tv.lastservice.value))
+       def cancel(self):
+               self.close(None)
+               lastroot=eServiceReference(config.tv.lastroot.value)
+               lastservice=eServiceReference(config.tv.lastservice.value)
+               if lastroot.valid() and self.getRoot() != lastroot:
+                       self.setRoot(lastroot)
+               if lastservice.valid() and self.getCurrentSelection() != lastservice:
+                       self.servicelist.setCurrent(lastservice)
 
 class SimpleChannelSelection(ChannelSelectionBase):
        def __init__(self, session, title):
 
 class SimpleChannelSelection(ChannelSelectionBase):
        def __init__(self, session, title):
@@ -376,24 +494,38 @@ class SimpleChannelSelection(ChannelSelectionBase):
                self.title = title
                self.onShown.append(self.onExecCallback)
 
                self.title = title
                self.onShown.append(self.onExecCallback)
 
-               class ChannelActionMap(ActionMap):
+               class ChannelActionMap(NumberActionMap):
                        def action(self, contexts, action):
                                if not self.csel.enterBouquet(action):
                        def action(self, contexts, action):
                                if not self.csel.enterBouquet(action):
-                                       ActionMap.action(self, contexts, action)
+                                       NumberActionMap.action(self, contexts, action)
                self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions"],
                        {
                                "cancel": self.cancel,
                                "ok": self.channelSelected,
                                "showFavourites": self.showFavourites,
                self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions"],
                        {
                                "cancel": self.cancel,
                                "ok": self.channelSelected,
                                "showFavourites": self.showFavourites,
+                               "showAllServices": self.showAllServices,
+                               "showProviders": self.showProviders,
+                               "showSatellites": self.showSatellites,
+                               "1": self.keyNumberGlobal,
+                               "2": self.keyNumberGlobal,
+                               "3": self.keyNumberGlobal,
+                               "4": self.keyNumberGlobal,
+                               "5": self.keyNumberGlobal,
+                               "6": self.keyNumberGlobal,
+                               "7": self.keyNumberGlobal,
+                               "8": self.keyNumberGlobal,
+                               "9": self.keyNumberGlobal,
+                               "0": self.keyNumberGlobal
                        })
                self["actions"].csel = self
 
        def onExecCallback(self):
                print "onExecCallback"
                        })
                self["actions"].csel = self
 
        def onExecCallback(self):
                print "onExecCallback"
+               self.showFavourites()
                self.session.currentDialog.instance.setTitle(self.title)
 
        def channelSelected(self): # just return selected service
                self.session.currentDialog.instance.setTitle(self.title)
 
        def channelSelected(self): # just return selected service
-               ref = self.servicelist.getCurrent()
+               ref = self.getCurrentSelection()
                self.close(ref)
 
        def setRoot(self, root):
                self.close(ref)
 
        def setRoot(self, root):