ChannelSelection.py: fix typo
[enigma2.git] / lib / python / Screens / ChannelSelection.py
index 5d78ec77c433819f6c5126fc1319c594c9116624..0895c9c201398eac4b98723f21d3f7bb2b08d088 100644 (file)
@@ -21,14 +21,16 @@ profile("ChannelSelection.py 2.3")
 from Components.Input import Input
 profile("ChannelSelection.py 3")
 from Components.ParentalControl import parentalControl
 from Components.Input import Input
 profile("ChannelSelection.py 3")
 from Components.ParentalControl import parentalControl
+from Components.ChoiceList import ChoiceList, ChoiceEntryComponent
+from Components.SystemInfo import SystemInfo
 from Screens.InputBox import InputBox, PinInput
 from Screens.MessageBox import MessageBox
 from Screens.ServiceInfo import ServiceInfo
 profile("ChannelSelection.py 4")
 from Screens.InputBox import InputBox, PinInput
 from Screens.MessageBox import MessageBox
 from Screens.ServiceInfo import ServiceInfo
 profile("ChannelSelection.py 4")
+from Screens.PictureInPicture import PictureInPicture
 from Screens.RdsDisplay import RassInteractive
 from ServiceReference import ServiceReference
 from Tools.BoundFunction import boundFunction
 from Screens.RdsDisplay import RassInteractive
 from ServiceReference import ServiceReference
 from Tools.BoundFunction import boundFunction
-from re import compile
 from os import remove
 profile("ChannelSelection.py after imports")
 
 from os import remove
 profile("ChannelSelection.py after imports")
 
@@ -69,9 +71,9 @@ OFF = 0
 EDIT_BOUQUET = 1
 EDIT_ALTERNATIVES = 2
 
 EDIT_BOUQUET = 1
 EDIT_ALTERNATIVES = 2
 
-def append_when_current_valid(current, menu, args, level = 0):
+def append_when_current_valid(current, menu, args, level = 0, key = ""):
        if current and current.valid() and level <= config.usage.setup_level.index:
        if current and current.valid() and level <= config.usage.setup_level.index:
-               menu.append(args)
+               menu.append(ChoiceEntryComponent(key, args))
 
 class ChannelContextMenu(Screen):
        def __init__(self, session, csel):
 
 class ChannelContextMenu(Screen):
        def __init__(self, session, csel):
@@ -80,13 +82,15 @@ class ChannelContextMenu(Screen):
                self.csel = csel
                self.bsel = None
 
                self.csel = csel
                self.bsel = None
 
-               self["actions"] = ActionMap(["OkCancelActions"],
+               self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "NumberActions"],
                        {
                                "ok": self.okbuttonClick,
                        {
                                "ok": self.okbuttonClick,
-                               "cancel": self.cancelClick
+                               "cancel": self.cancelClick,
+                               "blue": self.showServiceInPiP
                        })
                menu = [ ]
 
                        })
                menu = [ ]
 
+               self.pipAvailable = False
                current = csel.getCurrentSelection()
                current_root = csel.getRoot()
                current_sel_path = current.getPath()
                current = csel.getCurrentSelection()
                current_root = csel.getRoot()
                current_sel_path = current.getPath()
@@ -122,8 +126,11 @@ class ChannelContextMenu(Screen):
                                        append_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService), level = 0)
                                if current_root and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
                                        append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0)
                                        append_when_current_valid(current, menu, (_("remove entry"), self.removeCurrentService), level = 0)
                                if current_root and current_root.getPath().find("flags == %d" %(FLAG_SERVICE_NEW_FOUND)) != -1:
                                        append_when_current_valid(current, menu, (_("remove new found flag"), self.removeNewFoundFlag), level = 0)
+                               if isPlayable and SystemInfo.get("NumVideoDecoders", 1) > 1:
+                                       append_when_current_valid(current, menu, (_("Activate Picture in Picture"), self.showServiceInPiP), level = 0, key = "blue")
+                                       self.pipAvailable = True
                        else:
                        else:
-                                       menu.append((_("add bouquet"), self.showBouquetInputBox))
+                                       menu.append(ChoiceEntryComponent(text = (_("add bouquet"), self.showBouquetInputBox)))
                                        append_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet), level = 0)
 
                if inBouquet: # current list is editable?
                                        append_when_current_valid(current, menu, (_("remove entry"), self.removeBouquet), level = 0)
 
                if inBouquet: # current list is editable?
@@ -131,7 +138,7 @@ class ChannelContextMenu(Screen):
                                if not csel.movemode:
                                        append_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode), level = 1)
                                        if not inBouquetRootList and current_root and not (current_root.flags & eServiceReference.isGroup):
                                if not csel.movemode:
                                        append_when_current_valid(current, menu, (_("enable move mode"), self.toggleMoveMode), level = 1)
                                        if not inBouquetRootList and current_root and not (current_root.flags & eServiceReference.isGroup):
-                                               menu.append((_("add marker"), self.showMarkerInputBox))
+                                               menu.append(ChoiceEntryComponent(text = (_("add marker"), self.showMarkerInputBox)))
                                                if haveBouquets:
                                                        append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0)
                                                else:
                                                if haveBouquets:
                                                        append_when_current_valid(current, menu, (_("enable bouquet edit"), self.bouquetMarkStart), level = 0)
                                                else:
@@ -156,11 +163,11 @@ class ChannelContextMenu(Screen):
                                                append_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd), level = 0)
                                                append_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort), level = 0)
 
                                                append_when_current_valid(current, menu, (_("end alternatives edit"), self.bouquetMarkEnd), level = 0)
                                                append_when_current_valid(current, menu, (_("abort alternatives edit"), self.bouquetMarkAbort), level = 0)
 
-               menu.append((_("back"), self.cancelClick))
-               self["menu"] = MenuList(menu)
+               menu.append(ChoiceEntryComponent(text = (_("back"), self.cancelClick)))
+               self["menu"] = ChoiceList(menu)
 
        def okbuttonClick(self):
 
        def okbuttonClick(self):
-               self["menu"].getCurrent()[1]()
+               self["menu"].getCurrent()[0][1]()
 
        def cancelClick(self):
                self.close(False)
 
        def cancelClick(self):
                self.close(False)
@@ -189,6 +196,23 @@ class ChannelContextMenu(Screen):
                        self.close()
                else:
                        self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
                        self.close()
                else:
                        self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
+                       
+       def showServiceInPiP(self):
+               if not self.pipAvailable:
+                       return
+               if self.session.pipshown:
+                       del self.session.pip
+               self.session.pip = self.session.instantiateDialog(PictureInPicture)
+               self.session.pip.show()
+               newservice = self.csel.servicelist.getCurrent()
+               if self.session.pip.playService(newservice):
+                       self.session.pipshown = True
+                       self.session.pip.servicePath = self.csel.getCurrentServicePath()
+                       self.close(True)
+               else:
+                       self.session.pipshown = False
+                       del self.session.pip
+                       self.session.openWithCallback(self.close, MessageBox, _("Could not open Picture in Picture"), MessageBox.TYPE_ERROR)
 
        def addServiceToBouquetSelected(self):
                bouquets = self.csel.getBouquetList()
 
        def addServiceToBouquetSelected(self):
                bouquets = self.csel.getBouquetList()
@@ -425,7 +449,7 @@ class ChannelSelectionEdit:
                                if mutableAlternatives:
                                        mutableAlternatives.setListName(name)
                                        if mutableAlternatives.addService(cur_service.ref):
                                if mutableAlternatives:
                                        mutableAlternatives.setListName(name)
                                        if mutableAlternatives.addService(cur_service.ref):
-                                               print "add", cur_service.toString(), "to new alternatives failed"
+                                               print "add", cur_service.ref.toString(), "to new alternatives failed"
                                        mutableAlternatives.flushChanges()
                                        self.servicelist.addService(new_ref.ref, True)
                                        self.servicelist.removeCurrent()
                                        mutableAlternatives.flushChanges()
                                        self.servicelist.addService(new_ref.ref, True)
                                        self.servicelist.removeCurrent()
@@ -526,7 +550,7 @@ class ChannelSelectionEdit:
                self.mutableList = self.getMutableList()
                # add all services from the current list to internal marked set in listboxservicecontent
                self.clearMarks() # this clears the internal marked set in the listboxservicecontent
                self.mutableList = self.getMutableList()
                # add all services from the current list to internal marked set in listboxservicecontent
                self.clearMarks() # this clears the internal marked set in the listboxservicecontent
-               self.saved_title = self.instance.getTitle()
+               self.saved_title = self.getTitle()
                pos = self.saved_title.find(')')
                new_title = self.saved_title[:pos+1]
                if type == EDIT_ALTERNATIVES:
                pos = self.saved_title.find(')')
                new_title = self.saved_title[:pos+1]
                if type == EDIT_ALTERNATIVES:
@@ -626,7 +650,7 @@ class ChannelSelectionEdit:
                        self.mutableList = self.getMutableList()
                        self.movemode = True
                        self.pathChangeDisabled = True # no path change allowed in movemode
                        self.mutableList = self.getMutableList()
                        self.movemode = True
                        self.pathChangeDisabled = True # no path change allowed in movemode
-                       self.saved_title = self.instance.getTitle()
+                       self.saved_title = self.getTitle()
                        new_title = self.saved_title
                        pos = self.saved_title.find(')')
                        new_title = self.saved_title[:pos+1] + ' ' + _("[move mode]") + self.saved_title[pos+1:]
                        new_title = self.saved_title
                        pos = self.saved_title.find(')')
                        new_title = self.saved_title[:pos+1] + ' ' + _("[move mode]") + self.saved_title[pos+1:]
@@ -648,7 +672,11 @@ class ChannelSelectionEdit:
                        self.entry_marked = True
 
        def doContext(self):
                        self.entry_marked = True
 
        def doContext(self):
-               self.session.open(ChannelContextMenu, self)
+               self.session.openWithCallback(self.exitContext, ChannelContextMenu, self)
+               
+       def exitContext(self, close = False):
+               if close:
+                       self.cancel()
 
 MODE_TV = 0
 MODE_RADIO = 1
 
 MODE_TV = 0
 MODE_RADIO = 1
@@ -684,6 +712,7 @@ class ChannelSelectionBase(Screen):
                self.servicePathTV = [ ]
                self.servicePathRadio = [ ]
                self.servicePath = [ ]
                self.servicePathTV = [ ]
                self.servicePathRadio = [ ]
                self.servicePath = [ ]
+               self.rootChanged = False
 
                self.mode = MODE_TV
 
 
                self.mode = MODE_TV
 
@@ -761,7 +790,7 @@ class ChannelSelectionBase(Screen):
                self.mode = MODE_TV
                self.servicePath = self.servicePathTV
                self.recallBouquetMode()
                self.mode = MODE_TV
                self.servicePath = self.servicePathTV
                self.recallBouquetMode()
-               title = self.instance.getTitle()
+               title = self.getTitle()
                pos = title.find(" (")
                if pos != -1:
                        title = title[:pos]
                pos = title.find(" (")
                if pos != -1:
                        title = title[:pos]
@@ -772,7 +801,7 @@ class ChannelSelectionBase(Screen):
                self.mode = MODE_RADIO
                self.servicePath = self.servicePathRadio
                self.recallBouquetMode()
                self.mode = MODE_RADIO
                self.servicePath = self.servicePathRadio
                self.recallBouquetMode()
-               title = self.instance.getTitle()
+               title = self.getTitle()
                pos = title.find(" (")
                if pos != -1:
                        title = title[:pos]
                pos = title.find(" (")
                if pos != -1:
                        title = title[:pos]
@@ -790,6 +819,7 @@ class ChannelSelectionBase(Screen):
                else:
                        self.servicelist.setMode(ServiceList.MODE_NORMAL)
                self.servicelist.setRoot(root, justSet)
                else:
                        self.servicelist.setMode(ServiceList.MODE_NORMAL)
                self.servicelist.setRoot(root, justSet)
+               self.rootChanged = True
                self.buildTitleString()
 
        def removeModeStr(self, str):
                self.buildTitleString()
 
        def removeModeStr(self, str):
@@ -814,7 +844,7 @@ class ChannelSelectionBase(Screen):
                return str
 
        def buildTitleString(self):
                return str
 
        def buildTitleString(self):
-               titleStr = self.instance.getTitle()
+               titleStr = self.getTitle()
                pos = titleStr.find(']')
                if pos == -1:
                        pos = titleStr.find(')')
                pos = titleStr.find(']')
                if pos == -1:
                        pos = titleStr.find(')')
@@ -1151,6 +1181,7 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
                self.servicelist.setPlayableIgnoreService(eServiceReference())
 
        def setMode(self):
                self.servicelist.setPlayableIgnoreService(eServiceReference())
 
        def setMode(self):
+               self.rootChanged = True
                self.restoreRoot()
                lastservice=eServiceReference(self.lastservice.value)
                if lastservice.valid():
                self.restoreRoot()
                lastservice=eServiceReference(self.lastservice.value)
                if lastservice.valid():
@@ -1274,19 +1305,21 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
                        self.lastroot.save()
 
        def restoreRoot(self):
                        self.lastroot.save()
 
        def restoreRoot(self):
-               self.clearPath()
-               re = compile('.+?;')
-               tmp = re.findall(self.lastroot.value)
-               cnt = 0
-               for i in tmp:
-                       self.servicePath.append(eServiceReference(i[:-1]))
-                       cnt += 1
-               if cnt:
-                       path = self.servicePath.pop()
-                       self.enterPath(path)
-               else:
-                       self.showFavourites()
-                       self.saveRoot()
+               tmp = [x for x in self.lastroot.value.split(';') if x != '']
+               current = [x.toString() for x in self.servicePath]
+               if tmp != current or self.rootChanged:
+                       self.clearPath()
+                       cnt = 0
+                       for i in tmp:
+                               self.servicePath.append(eServiceReference(i))
+                               cnt += 1
+                       if cnt:
+                               path = self.servicePath.pop()
+                               self.enterPath(path)
+                       else:
+                               self.showFavourites()
+                               self.saveRoot()
+                       self.rootChanged = False
 
        def preEnterPath(self, refstr):
                if self.servicePath and self.servicePath[0] != eServiceReference(refstr):
 
        def preEnterPath(self, refstr):
                if self.servicePath and self.servicePath[0] != eServiceReference(refstr):
@@ -1434,19 +1467,20 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
                        config.radio.lastroot.save()
 
        def restoreRoot(self):
                        config.radio.lastroot.save()
 
        def restoreRoot(self):
-               self.clearPath()
-               re = compile('.+?;')
-               tmp = re.findall(config.radio.lastroot.value)
-               cnt = 0
-               for i in tmp:
-                       self.servicePathRadio.append(eServiceReference(i[:-1]))
-                       cnt += 1
-               if cnt:
-                       path = self.servicePathRadio.pop()
-                       self.enterPath(path)
-               else:
-                       self.showFavourites()
-                       self.saveRoot()
+               tmp = [x for x in config.radio.lastroot.value.split(';') if x != '']
+               current = [x.toString() for x in self.servicePath]
+               if tmp != current or self.rootChanged:
+                       cnt = 0
+                       for i in tmp:
+                               self.servicePathRadio.append(eServiceReference(i))
+                               cnt += 1
+                       if cnt:
+                               path = self.servicePathRadio.pop()
+                               self.enterPath(path)
+                       else:
+                               self.showFavourites()
+                               self.saveRoot()
+                       self.rootChanged = False
 
        def preEnterPath(self, refstr):
                if self.servicePathRadio and self.servicePathRadio[0] != eServiceReference(refstr):
 
        def preEnterPath(self, refstr):
                if self.servicePathRadio and self.servicePathRadio[0] != eServiceReference(refstr):
@@ -1492,9 +1526,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
 class SimpleChannelSelection(ChannelSelectionBase):
        def __init__(self, session, title):
                ChannelSelectionBase.__init__(self, session)
 class SimpleChannelSelection(ChannelSelectionBase):
        def __init__(self, session, title):
                ChannelSelectionBase.__init__(self, session)
-               self.title = title
-               self.onShown.append(self.__onExecCallback)
-
                self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
                        {
                                "cancel": self.close,
                self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
                        {
                                "cancel": self.close,
@@ -1502,9 +1533,10 @@ class SimpleChannelSelection(ChannelSelectionBase):
                                "keyRadio": self.setModeRadio,
                                "keyTV": self.setModeTv,
                        })
                                "keyRadio": self.setModeRadio,
                                "keyTV": self.setModeTv,
                        })
+               self.title = title
+               self.onLayoutFinish.append(self.layoutFinished)
 
 
-       def __onExecCallback(self):
-               self.setTitle(self.title)
+       def layoutFinished(self):
                self.setModeTv()
 
        def channelSelected(self): # just return selected service
                self.setModeTv()
 
        def channelSelected(self): # just return selected service