Support turbo2.
[vuplus_dvbapp] / lib / python / Screens / ChannelSelection.py
old mode 100644 (file)
new mode 100755 (executable)
index 1c05bbf..6882a93
@@ -8,7 +8,7 @@ from Components.MenuList import MenuList
 from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
 profile("ChannelSelection.py 1")
 from EpgSelection import EPGSelection
 from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
 profile("ChannelSelection.py 1")
 from EpgSelection import EPGSelection
-from enigma import eServiceReference, eEPGCache, eServiceCenter, eRCInput, eTimer, eDVBDB, iPlayableService, iServiceInformation, getPrevAsciiCode
+from enigma import eServiceReference, eEPGCache, eServiceCenter, eRCInput, eTimer, eDVBDB, iPlayableService, iServiceInformation, getPrevAsciiCode, eEnv
 from Components.config import config, ConfigSubsection, ConfigText
 from Tools.NumericalTextInput import NumericalTextInput
 profile("ChannelSelection.py 2")
 from Components.config import config, ConfigSubsection, ConfigText
 from Tools.NumericalTextInput import NumericalTextInput
 profile("ChannelSelection.py 2")
@@ -20,7 +20,6 @@ from Components.Sources.ServiceEvent import ServiceEvent
 profile("ChannelSelection.py 2.3")
 from Components.Input import Input
 profile("ChannelSelection.py 3")
 profile("ChannelSelection.py 2.3")
 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 Components.ChoiceList import ChoiceList, ChoiceEntryComponent
 from Components.SystemInfo import SystemInfo
 from Screens.InputBox import InputBox, PinInput
@@ -66,6 +65,24 @@ class BouquetSelector(Screen):
        def cancelClick(self):
                self.close(False)
 
        def cancelClick(self):
                self.close(False)
 
+class SilentBouquetSelector:
+       def __init__(self, bouquets, enableWrapAround=False, current=0):
+               self.bouquets = [b[1] for b in bouquets]
+               self.pos = current
+               self.count = len(bouquets)
+               self.enableWrapAround = enableWrapAround
+
+       def up(self):
+               if self.pos > 0 or self.enableWrapAround:
+                       self.pos = (self.pos - 1) % self.count
+
+       def down(self):
+               if self.pos < (self.count - 1) or self.enableWrapAround:
+                       self.pos = (self.pos + 1) % self.count
+
+       def getCurrent(self):
+               return self.bouquets[self.pos]
+
 # csel.bouquet_mark_edit values
 OFF = 0
 EDIT_BOUQUET = 1
 # csel.bouquet_mark_edit values
 OFF = 0
 EDIT_BOUQUET = 1
@@ -77,6 +94,7 @@ def append_when_current_valid(current, menu, args, level = 0, key = ""):
 
 class ChannelContextMenu(Screen):
        def __init__(self, session, csel):
 
 class ChannelContextMenu(Screen):
        def __init__(self, session, csel):
+
                Screen.__init__(self, session)
                #raise Exception("we need a better summary screen here")
                self.csel = csel
                Screen.__init__(self, session)
                #raise Exception("we need a better summary screen here")
                self.csel = csel
@@ -106,6 +124,7 @@ class ChannelContextMenu(Screen):
                                isPlayable = not (current_sel_flags & (eServiceReference.isMarker|eServiceReference.isDirectory))
                                if isPlayable:
                                        if config.ParentalControl.configured.value:
                                isPlayable = not (current_sel_flags & (eServiceReference.isMarker|eServiceReference.isDirectory))
                                if isPlayable:
                                        if config.ParentalControl.configured.value:
+                                               from Components.ParentalControl import parentalControl
                                                if parentalControl.getProtectionLevel(csel.getCurrentSelection().toCompareString()) == -1:
                                                        append_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection())), level = 0)
                                                else:
                                                if parentalControl.getProtectionLevel(csel.getCurrentSelection().toCompareString()) == -1:
                                                        append_when_current_valid(current, menu, (_("add to parental protection"), boundFunction(self.addParentalProtection, csel.getCurrentSelection())), level = 0)
                                                else:
@@ -122,8 +141,14 @@ class ChannelContextMenu(Screen):
                                                if not inBouquet:
                                                        append_when_current_valid(current, menu, (_("add service to favourites"), self.addServiceToBouquetSelected), level = 0)
                                else:
                                                if not inBouquet:
                                                        append_when_current_valid(current, menu, (_("add service to favourites"), self.addServiceToBouquetSelected), level = 0)
                                else:
-                                       if current_root.getPath().find('FROM SATELLITES') != -1:
-                                               append_when_current_valid(current, menu, (_("remove selected satellite"), self.removeSatelliteServices), level = 0)
+                                       if 'FROM SATELLITES' in current_root.getPath() and _("Services") in eServiceCenter.getInstance().info(current).getName(current):
+                                               unsigned_orbpos = current.getUnsignedData(4) >> 16
+                                               if unsigned_orbpos == 0xFFFF: #Cable
+                                                       append_when_current_valid(current, menu, (_("remove cable services"), self.removeSatelliteServices), level = 0)
+                                               elif unsigned_orbpos == 0xEEEE: #Terrestrial
+                                                       append_when_current_valid(current, menu, (_("remove terrestrial services"), self.removeSatelliteServices), level = 0)
+                                               else:
+                                                       append_when_current_valid(current, menu, (_("remove selected satellite"), self.removeSatelliteServices), level = 0)
                                        if haveBouquets:
                                                if not inBouquet and current_sel_path.find("PROVIDERS") == -1:
                                                        append_when_current_valid(current, menu, (_("copy to bouquets"), self.copyCurrentToBouquetList), level = 0)
                                        if haveBouquets:
                                                if not inBouquet and current_sel_path.find("PROVIDERS") == -1:
                                                        append_when_current_valid(current, menu, (_("copy to bouquets"), self.copyCurrentToBouquetList), level = 0)
@@ -191,6 +216,7 @@ class ChannelContextMenu(Screen):
                self.close()
 
        def addParentalProtection(self, service):
                self.close()
 
        def addParentalProtection(self, service):
+               from Components.ParentalControl import parentalControl
                parentalControl.protectService(service.toCompareString())
                self.close()
 
                parentalControl.protectService(service.toCompareString())
                self.close()
 
@@ -199,6 +225,7 @@ class ChannelContextMenu(Screen):
 
        def pinEntered(self, service, result):
                if result:
 
        def pinEntered(self, service, result):
                if result:
+                       from Components.ParentalControl import parentalControl
                        parentalControl.unProtectService(service)
                        self.close()
                else:
                        parentalControl.unProtectService(service)
                        self.close()
                else:
@@ -210,6 +237,7 @@ class ChannelContextMenu(Screen):
                if self.session.pipshown:
                        del self.session.pip
                self.session.pip = self.session.instantiateDialog(PictureInPicture)
                if self.session.pipshown:
                        del self.session.pip
                self.session.pip = self.session.instantiateDialog(PictureInPicture)
+               self.session.pip.setAnimationMode(0)
                self.session.pip.show()
                newservice = self.csel.servicelist.getCurrent()
                if self.session.pip.playService(newservice):
                self.session.pip.show()
                newservice = self.csel.servicelist.getCurrent()
                if self.session.pip.playService(newservice):
@@ -238,14 +266,7 @@ class ChannelContextMenu(Screen):
                        self.close(False)
 
        def removeSatelliteServices(self):
                        self.close(False)
 
        def removeSatelliteServices(self):
-               curpath = self.csel.getCurrentSelection().getPath()
-               idx = curpath.find("satellitePosition == ")
-               if idx != -1:
-                       tmp = curpath[idx+21:]
-                       idx = tmp.find(')')
-                       if idx != -1:
-                               satpos = int(tmp[:idx])
-                               eDVBDB.getInstance().removeServices(-1, -1, -1, satpos)
+               self.csel.removeSatelliteServices()
                self.close()
 
        def copyCurrentToBouquetList(self):
                self.close()
 
        def copyCurrentToBouquetList(self):
@@ -541,7 +562,7 @@ class ChannelSelectionEdit:
                        refstr = refstr[pos+14:]
                        pos = refstr.find('"')
                        if pos != -1:
                        refstr = refstr[pos+14:]
                        pos = refstr.find('"')
                        if pos != -1:
-                               filename = '/etc/enigma2/' + refstr[:pos] # FIXMEEE !!! HARDCODED /etc/enigma2
+                               filename = eEnv.resolve('${sysconfdir}/enigma2/') + refstr[:pos]
                self.removeCurrentService()
                try:
                        if filename is not None:
                self.removeCurrentService()
                try:
                        if filename is not None:
@@ -549,6 +570,55 @@ class ChannelSelectionEdit:
                except OSError:
                        print "error during remove of", filename
 
                except OSError:
                        print "error during remove of", filename
 
+       def removeSatelliteServices(self):
+               current = self.getCurrentSelection()
+               unsigned_orbpos = current.getUnsignedData(4) >> 16
+               if unsigned_orbpos == 0XFFFF:
+                       msg = _("Are you sure to remove all cable services?")
+               elif unsigned_orbpos == 0XEEEE:
+                       msg = _("Are you sure to remove all terrestrial services?")
+               else:
+                       orbpos = current.getData(4) >> 16
+                       try:
+                               service_name = str(nimmanager.getSatDescription(orbpos))
+                       except:
+                               if orbpos > 1800: # west
+                                       orbpos = 3600 - orbpos
+                                       h = _("W")
+                               else:
+                                       h = _("E")
+                               service_name = ("%d.%d" + h) % (orbpos / 10, orbpos % 10)
+                       msg = _("Are you sure to remove all %s services?" % service_name)
+               self.session.openWithCallback(self.removeSatelliteServicesCallback, MessageBox, msg)
+
+       def removeSatelliteServicesCallback(self, res):
+               if not res:
+                       return
+
+               currentIndex = self.servicelist.getCurrentIndex()
+               current = self.getCurrentSelection()
+               unsigned_orbpos = current.getUnsignedData(4) >> 16
+               if unsigned_orbpos == 0XFFFF:
+                       eDVBDB.getInstance().removeServices(0xFFFF0000 - 0x100000000)
+               elif unsigned_orbpos == 0XEEEE:
+                       eDVBDB.getInstance().removeServices(0xEEEE0000 - 0x100000000)
+               else:
+                       curpath = self.getCurrentSelection().getPath()
+                       idx = curpath.find("satellitePosition == ")
+                       if idx != -1:
+                               tmp = curpath[idx+21:]
+                               idx = tmp.find(')')
+                               if idx != -1:
+                                       satpos = int(tmp[:idx])
+                                       eDVBDB.getInstance().removeServices(-1, -1, -1, satpos)
+
+               if hasattr(self, 'setMode') and hasattr(self, 'showSatellites'):
+                       self.setMode()
+                       self.showSatellites()
+                       self.servicelist.moveToIndex(currentIndex)
+                       if currentIndex != self.servicelist.getCurrentIndex():
+                               self.servicelist.instance.moveSelection(self.servicelist.instance.moveEnd)
+
 #  multiple marked entry stuff ( edit mode, later multiepg selection )
        def startMarkedEdit(self, type):
                self.savedPath = self.servicePath[:]
 #  multiple marked entry stuff ( edit mode, later multiepg selection )
        def startMarkedEdit(self, type):
                self.savedPath = self.servicePath[:]
@@ -697,8 +767,9 @@ MODE_RADIO = 1
 # type 27 = advanced codec HD NVOD reference service (NYI)
 # type 2 = digital radio sound service
 # type 10 = advanced codec digital radio sound service
 # type 27 = advanced codec HD NVOD reference service (NYI)
 # type 2 = digital radio sound service
 # type 10 = advanced codec digital radio sound service
+# type 31 = High Efficiency Video Coing digital television
 
 
-service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 22) || (type == 25) || (type == 134) || (type == 195)'
+service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 22) || (type == 25) || (type == 31) || (type == 134) || (type == 195)'
 service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2) || (type == 10)'
 
 class ChannelSelectionBase(Screen):
 service_types_radio = '1:7:2:0:0:0:0:0:0:0:(type == 2) || (type == 10)'
 
 class ChannelSelectionBase(Screen):
@@ -1053,7 +1124,13 @@ class ChannelSelectionBase(Screen):
                        self.servicelist.moveToChar(charstr[0])
 
        def keyAsciiCode(self):
                        self.servicelist.moveToChar(charstr[0])
 
        def keyAsciiCode(self):
-               unichar = unichr(getPrevAsciiCode())
+               #unichar = unichr(getPrevAsciiCode())
+               from Components.config import getCharValue
+               unichar = getCharValue(getPrevAsciiCode())
+               if unichar is None:
+                       return
+               if len(str(unichar)) > 1:
+                       return
                charstr = unichar.encode("utf-8")
                if len(charstr) == 1:
                        self.servicelist.moveToChar(charstr[0])
                charstr = unichar.encode("utf-8")
                if len(charstr) == 1:
                        self.servicelist.moveToChar(charstr[0])
@@ -1404,6 +1481,7 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
                self.onLayoutFinish.append(self.onCreate)
 
                self.info = session.instantiateDialog(RadioInfoBar) # our simple infobar
                self.onLayoutFinish.append(self.onCreate)
 
                self.info = session.instantiateDialog(RadioInfoBar) # our simple infobar
+               self.info.setAnimationMode(0)
 
                self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
                        {
 
                self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
                        {