show plugin description in plugin list
[enigma2.git] / lib / python / Screens / ChannelSelection.py
index 8eb8b887f48cb421d539dfd9a0d7e8d63692f8a0..d4a1e7cea08d9911cd5eece5d98f3b65efc7c0d2 100644 (file)
@@ -8,6 +8,9 @@ from Components.config import config, configElement, ConfigSubsection, configTex
 from Screens.FixedMenu import FixedMenu
 from Tools.NumericalTextInput import NumericalTextInput
 from Components.NimManager import nimmanager
 from Screens.FixedMenu import FixedMenu
 from Tools.NumericalTextInput import NumericalTextInput
 from Components.NimManager import nimmanager
+from Components.ServiceName import ServiceName
+from Components.Clock import Clock
+from Components.EventInfo import EventInfo
 
 import xml.dom.minidom
 
 
 import xml.dom.minidom
 
@@ -75,7 +78,7 @@ class ChannelContextMenu(FixedMenu):
                if cnt > 1: # show bouquet list
                        self.session.open(BouquetSelector, bouquets, self.addCurrentServiceToBouquet)
                elif cnt == 1: # add to only one existing bouquet
                if cnt > 1: # show bouquet list
                        self.session.open(BouquetSelector, bouquets, self.addCurrentServiceToBouquet)
                elif cnt == 1: # add to only one existing bouquet
-                       self.addCurrentServiceToBouquet(bouquet[0][1])
+                       self.addCurrentServiceToBouquet(bouquets[0][1])
                else: #no bouquets in root.. so assume only one favourite list is used
                        self.addCurrentServiceToBouquet(self.csel.bouquet_root)
 
                else: #no bouquets in root.. so assume only one favourite list is used
                        self.addCurrentServiceToBouquet(self.csel.bouquet_root)
 
@@ -233,6 +236,11 @@ class ChannelSelectionEdit:
        def doContext(self):
                self.session.open(ChannelContextMenu, self)
 
        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)
 class ChannelSelectionBase(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
@@ -241,11 +249,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_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"))
                self["key_red"] = Button(_("All"))
                self["key_green"] = Button(_("Satellites"))
                self["key_yellow"] = Button(_("Provider"))
@@ -254,11 +257,17 @@ class ChannelSelectionBase(Screen):
                self["list"] = ServiceList()
                self.servicelist = self["list"]
 
                self["list"] = ServiceList()
                self.servicelist = self["list"]
 
-               #self["okbutton"] = Button("ok", [self.channelSelected])
-
                self.numericalTextInput = NumericalTextInput()
 
                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):
        def getBouquetNumOffset(self, bouquet):
+               bouquet = self.appendDVBTypes(bouquet)
                if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK
                        return 0
                offsetCount = 0
                if self.bouquet_root.getPath().find('FROM BOUQUET "bouquets.') == -1: #FIXME HACK
                        return 0
                offsetCount = 0
@@ -266,7 +275,7 @@ class ChannelSelectionBase(Screen):
                bouquetlist = serviceHandler.list(self.bouquet_root)
                if not bouquetlist is None:
                        while True:
                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):
                                if not bouquetIterator.valid() or bouquetIterator == bouquet: #end of list or bouquet found
                                        break
                                if ((bouquetIterator.flags & eServiceReference.flagDirectory) != eServiceReference.flagDirectory):
@@ -282,11 +291,44 @@ class ChannelSelectionBase(Screen):
                                                offsetCount += 1
                return offsetCount
 
                                                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):
        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))
                        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)
                else:
                        self.servicelist.setMode(ServiceList.MODE_NORMAL)
                self.servicelist.setRoot(root, justSet)
@@ -425,22 +467,23 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                self["actions"].csel = self
                self.onShown.append(self.onShow)
 
                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.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())
                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():
                lastservice=eServiceReference(config.tv.lastservice.value)
                if lastservice.valid():
-                       self.session.nav.playService(lastservice)
                        self.servicelist.setCurrent(lastservice)
                        self.servicelist.setCurrent(lastservice)
+                       self.session.nav.playService(lastservice)
 
        def onShow(self):
                ref = self.session.nav.getCurrentlyPlayingServiceReference()
 
        def onShow(self):
                ref = self.session.nav.getCurrentlyPlayingServiceReference()
@@ -502,6 +545,99 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit):
                if lastservice.valid() and self.getCurrentSelection() != lastservice:
                        self.servicelist.setCurrent(lastservice)
 
                if lastservice.valid() and self.getCurrentSelection() != lastservice:
                        self.servicelist.setCurrent(lastservice)
 
+class ServiceInfoWindow(Screen):
+       def __init__(self, session):
+               Screen.__init__(self, session)
+               self["Service_Name"] = ServiceName(self.session.nav)
+               self["Clock"] = Clock()
+               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)
 class SimpleChannelSelection(ChannelSelectionBase):
        def __init__(self, session, title):
                ChannelSelectionBase.__init__(self, session)
@@ -512,7 +648,7 @@ class SimpleChannelSelection(ChannelSelectionBase):
                        def action(self, contexts, action):
                                if not self.csel.enterBouquet(action):
                                        NumberActionMap.action(self, contexts, action)
                        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,
                        {
                                "cancel": self.cancel,
                                "ok": self.channelSelected,
@@ -520,6 +656,8 @@ class SimpleChannelSelection(ChannelSelectionBase):
                                "showAllServices": self.showAllServices,
                                "showProviders": self.showProviders,
                                "showSatellites": self.showSatellites,
                                "showAllServices": self.showAllServices,
                                "showProviders": self.showProviders,
                                "showSatellites": self.showSatellites,
+                               "keyRadio": self.setModeRadio,
+                               "keyTV": self.setModeTv,
                                "1": self.keyNumberGlobal,
                                "2": self.keyNumberGlobal,
                                "3": self.keyNumberGlobal,
                                "1": self.keyNumberGlobal,
                                "2": self.keyNumberGlobal,
                                "3": self.keyNumberGlobal,
@@ -534,14 +672,24 @@ class SimpleChannelSelection(ChannelSelectionBase):
                self["actions"].csel = self
 
        def onExecCallback(self):
                self["actions"].csel = self
 
        def onExecCallback(self):
-               print "onExecCallback"
-               self.showFavourites()
                self.session.currentDialog.instance.setTitle(self.title)
                self.session.currentDialog.instance.setTitle(self.title)
+               self.setModeTv()
 
        def channelSelected(self): # just return selected service
                ref = self.getCurrentSelection()
 
        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()