fix store previous radio root
[enigma2.git] / lib / python / Screens / ChannelSelection.py
index 67b095103facbc516e411a4246505732cfab15bd..e9eb8605a6e9404ed769c1fb4ca649be864227b7 100644 (file)
@@ -8,6 +8,7 @@ from Components.config import config, configElement, ConfigSubsection, configTex
 from Screens.FixedMenu import FixedMenu
 from Tools.NumericalTextInput import NumericalTextInput
 from Components.NimManager import nimmanager
+from Components.EventInfo import EventInfo
 
 import xml.dom.minidom
 
@@ -233,6 +234,11 @@ class ChannelSelectionEdit:
        def doContext(self):
                self.session.open(ChannelContextMenu, self)
 
+USE_MULTIBOUQUETS = False
+
+MODE_TV = 0
+MODE_RADIO = 1
+
 class ChannelSelectionBase(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
@@ -241,11 +247,6 @@ class ChannelSelectionBase(Screen):
                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 = 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"))
@@ -254,11 +255,17 @@ class ChannelSelectionBase(Screen):
                self["list"] = ServiceList()
                self.servicelist = self["list"]
 
-               #self["okbutton"] = Button("ok", [self.channelSelected])
-
                self.numericalTextInput = NumericalTextInput()
 
+       def appendDVBTypes(self, ref):
+               path = ref.getPath()
+               pos = path.find(' FROM BOUQUET')
+               if pos != -1:
+                       return eServiceReference(self.service_types + path[pos:])
+               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
@@ -266,7 +273,7 @@ class ChannelSelectionBase(Screen):
                bouquetlist = serviceHandler.list(self.bouquet_root)
                if not bouquetlist is None:
                        while True:
-                               bouquetIterator = bouquetlist.getNext()
+                               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):
@@ -282,11 +289,44 @@ class ChannelSelectionBase(Screen):
                                                offsetCount += 1
                return offsetCount
 
+       def setTvMode(self):
+               self.service_types = self.service_types_tv
+               if USE_MULTIBOUQUETS:
+                       self.bouquet_root = eServiceReference('1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.tv" ORDER BY bouquet')
+               else:
+                       self.bouquet_root = eServiceReference('%s FROM BOUQUET "userbouquet.favourites.tv" ORDER BY bouquet'%(self.service_types))
+               title = self.instance.getTitle()
+               pos = title.find(" (")
+               if pos != -1:
+                       title = title[:pos]
+               title += " (TV)"
+               self.instance.setTitle(title)
+               self.mode = MODE_TV
+
+       def setRadioMode(self):
+               self.service_types = self.service_types_radio
+               if USE_MULTIBOUQUETS:
+                       self.bouquet_root = eServiceReference('1:7:1:0:0:0:0:0:0:0:(type == 1) FROM BOUQUET "bouquets.radio" ORDER BY bouquet')
+               else:
+                       self.bouquet_root = eServiceReference('%s FROM BOUQUET "userbouquet.favourites.radio" ORDER BY bouquet'%(self.service_types))
+               title = self.instance.getTitle()
+               pos = title.find(" (")
+               if pos != -1:
+                       title = title[:pos]
+               title += " (Radio)"
+               self.instance.setTitle(title)
+               self.mode = MODE_RADIO
+
        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):
+               path = root.getPath()
+               inBouquetRootList = path.find('FROM BOUQUET "bouquets.') != -1 #FIXME HACK
+               pos = path.find(' FROM BOUQUET')
+               isBouquet = pos != -1
+               if not inBouquetRootList and isBouquet:
                        self.servicelist.setMode(ServiceList.MODE_FAVOURITES)
                        self.servicelist.setNumberOffset(self.getBouquetNumOffset(root))
+                       refstr = self.service_types + path[pos:]
+                       root = eServiceReference(refstr)
                else:
                        self.servicelist.setMode(ServiceList.MODE_NORMAL)
                self.servicelist.setRoot(root, justSet)
@@ -425,22 +465,23 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                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):
+               self.setTvMode()
                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)
+                       self.session.nav.playService(lastservice)
 
        def onShow(self):
                ref = self.session.nav.getCurrentlyPlayingServiceReference()
@@ -502,6 +543,97 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                if lastservice.valid() and self.getCurrentSelection() != lastservice:
                        self.servicelist.setCurrent(lastservice)
 
+class ServiceInfoWindow(Screen):
+       def __init__(self, session):
+               Screen.__init__(self, session)
+               self["Event_Now_StartTime"] = EventInfo(self.session.nav, EventInfo.Now_StartTime)
+               self["Event_Next_StartTime"] = EventInfo(self.session.nav, EventInfo.Next_StartTime)
+               self["Event_Now"] = EventInfo(self.session.nav, EventInfo.Now)
+               self["Event_Next"] = EventInfo(self.session.nav, EventInfo.Next)
+               self["Event_Now_Duration"] = EventInfo(self.session.nav, EventInfo.Now_Duration)
+               self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
+
+class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit):
+       def __init__(self, session):
+               ChannelSelectionBase.__init__(self, session)
+               ChannelSelectionEdit.__init__(self)
+
+               config.radio = ConfigSubsection();
+               config.radio.lastservice = configElement("config.radio.lastservice", configText, "", 0);
+               config.radio.lastroot = configElement("config.radio.lastroot", configText, "", 0);
+               self.onLayoutFinish.append(self.onCreate)
+
+               self.info = session.instantiateDialog(ServiceInfoWindow)
+
+               class ChannelActionMap(NumberActionMap):
+                       def action(self, contexts, action):
+                               if not self.csel.enterBouquet(action):
+                                       NumberActionMap.action(self, contexts, action)
+               self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions", "TvRadioActions"],
+                       {
+                               "keyTV": self.closeRadio,
+                               "keyRadio": self.closeRadio,
+                               "contextMenu": self.doContext,
+                               "cancel": self.closeRadio,
+                               "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 onCreate(self):
+               self.setRadioMode()
+               lastroot=eServiceReference(config.radio.lastroot.value)
+               if lastroot.valid():
+                       self.setRoot(lastroot)
+               else:
+                       self.showFavourites()
+                       self.saveRoot(self.getRoot())
+               lastservice=eServiceReference(config.radio.lastservice.value)
+               if lastservice.valid():
+                       self.servicelist.setCurrent(lastservice)
+                       self.session.nav.playService(lastservice)
+                       self.servicelist.setPlayableIgnoreService(lastservice)
+               self.info.instance.show()
+
+       def channelSelected(self): # just return selected service
+               ref = self.getCurrentSelection()
+               if self.movemode:
+                       self.toggleMoveMarked()
+               elif (ref.flags & 7) == 7:
+                       self.setRoot(ref)
+               elif self.bouquet_mark_edit:
+                       self.doMark()
+               else:
+                       self.session.nav.playService(ref)
+                       self.servicelist.setPlayableIgnoreService(ref)
+                       config.radio.lastservice.value = ref.toString()
+                       config.radio.lastservice.save()
+                       config.radio.lastroot.value = self.getRoot().toString()
+                       config.radio.lastroot.save()
+               
+       def setRoot(self, root, justSet=False):
+               self.setRootBase(root, justSet)
+
+       def closeRadio(self):
+               self.info.instance.hide()
+               #set previous tv service
+               lastservice=eServiceReference(config.tv.lastservice.value)
+               self.session.nav.playService(lastservice)
+               self.close(None)
+
 class SimpleChannelSelection(ChannelSelectionBase):
        def __init__(self, session, title):
                ChannelSelectionBase.__init__(self, session)
@@ -512,7 +644,7 @@ class SimpleChannelSelection(ChannelSelectionBase):
                        def action(self, contexts, action):
                                if not self.csel.enterBouquet(action):
                                        NumberActionMap.action(self, contexts, action)
-               self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions"],
+               self["actions"] = ChannelActionMap(["ChannelSelectActions", "OkCancelActions", "ContextMenuActions", "TvRadioActions"],
                        {
                                "cancel": self.cancel,
                                "ok": self.channelSelected,
@@ -520,6 +652,8 @@ class SimpleChannelSelection(ChannelSelectionBase):
                                "showAllServices": self.showAllServices,
                                "showProviders": self.showProviders,
                                "showSatellites": self.showSatellites,
+                               "keyRadio": self.setModeRadio,
+                               "keyTV": self.setModeTv,
                                "1": self.keyNumberGlobal,
                                "2": self.keyNumberGlobal,
                                "3": self.keyNumberGlobal,
@@ -534,14 +668,24 @@ class SimpleChannelSelection(ChannelSelectionBase):
                self["actions"].csel = self
 
        def onExecCallback(self):
-               print "onExecCallback"
-               self.showFavourites()
                self.session.currentDialog.instance.setTitle(self.title)
+               self.setModeTv()
 
        def channelSelected(self): # just return selected service
                ref = self.getCurrentSelection()
-               self.close(ref)
+               if (ref.flags & 7) == 7:
+                       self.setRoot(ref)
+               else:
+                       ref = self.getCurrentSelection()
+                       self.close(ref)
 
-       def setRoot(self, root):
-               self.setRootBase(root)
+       def setRoot(self, root, justSet=False):
+               self.setRootBase(root, justSet)
 
+       def setModeTv(self):
+               self.setTvMode()
+               self.showFavourites()
+
+       def setModeRadio(self):
+               self.setRadioMode()
+               self.showFavourites()