Merge branch 'bug_537_vobsub' into experimental
[vuplus_dvbapp] / lib / python / Screens / AudioSelection.py
index a384174..068da87 100644 (file)
 from Screen import Screen
+from Components.ServiceEventTracker import ServiceEventTracker
 from Components.ActionMap import ActionMap
-from Components.MenuList import MenuList
-from Components.Label import Label
+from Components.ConfigList import ConfigListScreen
+from Components.ChoiceList import ChoiceList, ChoiceEntryComponent
+from Components.config import config, ConfigSubsection, getConfigListEntry, ConfigNothing, ConfigSelection, ConfigOnOff
+from Components.MultiContent import MultiContentEntryText
+from Components.Sources.List import List
+from Components.Sources.Boolean import Boolean
+from Components.SystemInfo import SystemInfo
+
+from enigma import iPlayableService
+
 from Tools.ISO639 import LanguageCodes
+from Tools.BoundFunction import boundFunction
+FOCUS_CONFIG, FOCUS_STREAMS = range(2)
+[PAGE_AUDIO, PAGE_SUBTITLES] = ["audio", "subtitles"]
 
-class AudioSelection(Screen):
-       def KeyOk(self):
-               selection = self["tracks"].getCurrent()
-               print "select track " + str(selection[1])
-               
-               self.audio.selectTrack(selection[1])
-               self.close()
-       def __init__(self, session, audio):
+class AudioSelection(Screen, ConfigListScreen):
+       def __init__(self, session, infobar=None, page=PAGE_AUDIO):
                Screen.__init__(self, session)
 
-               self["actions"] = ActionMap(["OkCancelActions"], 
+               self["streams"] = List([])
+               self["key_red"] = Boolean(False)
+               self["key_green"] = Boolean(False)
+               self["key_yellow"] = Boolean(True)
+               self["key_blue"] = Boolean(False)
+               
+               ConfigListScreen.__init__(self, [])
+               self.infobar = infobar or self.session.infobar
+
+               self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
                        {
-                               "cancel": self.close,
-                               "ok": self.KeyOk,
+                               iPlayableService.evUpdatedInfo: self.__updatedInfo
                        })
+               self.cached_subtitle_checked = False
+               self.__selected_subtitle = None
+        
+               self["actions"] = ActionMap(["ColorActions", "SetupActions", "DirectionActions"],
+               {
+                       "red": self.keyRed,
+                       "green": self.keyGreen,
+                       "yellow": self.keyYellow,
+                       "blue": self.keyBlue,
+                       "ok": self.keyOk,
+                       "cancel": self.cancel,
+                       "up": self.keyUp,
+                       "down": self.keyDown,
+               }, -2)
+
+               self.settings = ConfigSubsection()
+               choicelist = [(PAGE_AUDIO,_("audio tracks")), (PAGE_SUBTITLES,_("Subtitles"))]
+               self.settings.menupage = ConfigSelection(choices = choicelist, default=page)
+               self.onLayoutFinish.append(self.__layoutFinished)
+
+       def __layoutFinished(self):
+               self["config"].instance.setSelectionEnable(False)
+               self.focus = FOCUS_STREAMS
+               self.settings.menupage.addNotifier(self.fillList)
+
+       def fillList(self, arg=None):
+               streams = []
+               conflist = []
+               selectedidx = 0
+
+               if self.settings.menupage.getValue() == PAGE_AUDIO:
+                       self.setTitle(_("Select audio track"))
+                       service = self.session.nav.getCurrentService()
+                       self.audioTracks = audio = service and service.audioTracks()
+                       n = audio and audio.getNumberOfTracks() or 0
+                       if SystemInfo["CanDownmixAC3"]:
+                               self.settings.downmix = ConfigOnOff(default=config.av.downmix_ac3.value)
+                               self.settings.downmix.addNotifier(self.changeAC3Downmix, initial_call = False)
+                               conflist.append(getConfigListEntry(_("AC3 downmix"), self.settings.downmix))
+                               self["key_red"].setBoolean(True)
+
+                       if n > 0:
+                               self.audioChannel = service.audioChannel()
+                               choicelist = [("0",_("left")), ("1",_("stereo")), ("2", _("right"))]
+                               self.settings.channelmode = ConfigSelection(choices = choicelist, default = str(self.audioChannel.getCurrentChannel()))
+                               self.settings.channelmode.addNotifier(self.changeMode, initial_call = False)
+                               conflist.append(getConfigListEntry(_("Channel"), self.settings.channelmode))
+                               self["key_green"].setBoolean(True)
+                               selectedAudio = self.audioTracks.getCurrentTrack()
+                               for x in range(n):
+                                       number = str(x)
+                                       i = audio.getTrackInfo(x)
+                                       languages = i.getLanguage().split('/')
+                                       description = i.getDescription() or _("<unknown>")
+                                       selected = ""
+                                       language = ""
+
+                                       if selectedAudio == x:
+                                               selected = _("Running")
+                                               selectedidx = x
+
+                                       cnt = 0
+                                       for lang in languages:
+                                               if cnt:
+                                                       language += ' / '
+                                               if LanguageCodes.has_key(lang):
+                                                       language += LanguageCodes[lang][0]
+                                               elif lang == "und":
+                                                       _("<unknown>")
+                                               else:
+                                                       language += lang
+                                               cnt += 1
 
-               self.audio = audio
+                                       streams.append((x, "", number, description, language, selected))
 
-               tlist = []
-               n = audio.getNumberOfTracks()
-               for x in range(n):
-                       i = audio.getTrackInfo(x)
-                       langCode = i.getLanguage()
+                       else:
+                               streams = []
+                               conflist.append(('',))
+                               self["key_green"].setBoolean(False)
+
+               elif self.settings.menupage.getValue() == PAGE_SUBTITLES:
+                       self.setTitle(_("Subtitle selection"))
+                       conflist.append(('',))
+                       conflist.append(('',))
+                       self["key_red"].setBoolean(False)
+                       self["key_green"].setBoolean(False)
+
+                       if self.subtitlesEnabled():
+                               sel = self.infobar.selected_subtitle
+                       else:
+                               sel = None
+
+                       idx = 0
                        
-                       description = i.getDescription();
+                       subtitlelist = self.getSubtitleList()
+
+                       if len(subtitlelist):
+                               for x in subtitlelist:
+                                       number = str(x[1])
+                                       description = "?"
+                                       language = _("<unknown>")
+                                       selected = ""
+
+                                       if sel and x[:4] == sel[:4]:
+                                               selected = _("Running")
+                                               selectedidx = idx
+                                       
+                                       if x[4] != "und":
+                                               if LanguageCodes.has_key(x[4]):
+                                                       language = LanguageCodes[x[4]][0]
+                                               else:
+                                                       language = x[4]
+
+                                       if x[0] == 0:
+                                               description = "DVB"
+                                               number = "%x" % (x[1])
+
+                                       elif x[0] == 1:
+                                               description = "TTX"
+                                               number = "%x%02x" % (x[3],x[2])
+
+                                       elif x[0] == 2:
+                                               types = (_("<unknown>"), "UTF-8 text", "SSA", "AAS", ".SRT file", "VOB", "PGS (unsupported)")
+                                               description = types[x[2]]
+
+                                       streams.append((x, "", number, description, language, selected))
+                                       idx += 1
                        
-                       if langCode in LanguageCodes:
-                               language = LanguageCodes[langCode][0]
-                               if len(description):
-                                       description += " (" + language + ")"
+                       else:
+                               streams = []
+
+               conflist.append(getConfigListEntry(_("Menu"), self.settings.menupage))
+               
+               from Components.PluginComponent import plugins
+               from Plugins.Plugin import PluginDescriptor
+               
+               if hasattr(self.infobar, "runPlugin"):
+                       class PluginCaller:
+                               def __init__(self, fnc, *args):
+                                       self.fnc = fnc
+                                       self.args = args
+                               def __call__(self, *args, **kwargs):
+                                       self.fnc(*self.args)
+
+                       Plugins = [ (p.name, PluginCaller(self.infobar.runPlugin, p)) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_AUDIOMENU) ]
+
+                       if len(Plugins):
+                               self["key_blue"].setBoolean(True)
+                               conflist.append(getConfigListEntry(Plugins[0][0], ConfigNothing()))
+                               self.plugincallfunc = Plugins[0][1]
+                       if len(Plugins) > 1:
+                               print "plugin(s) installed but not displayed in the dialog box:", Plugins[1:]
+
+               self["config"].list = conflist
+               self["config"].l.setList(conflist)
+
+               self["streams"].list = streams
+               self["streams"].setIndex(selectedidx)
+
+       def __updatedInfo(self):
+               self.fillList()
+
+       def getSubtitleList(self):
+               s = self.infobar and self.infobar.getCurrentServiceSubtitle()
+               l = s and s.getSubtitleList() or [ ]
+               return l
+
+       def subtitlesEnabled(self):
+               return self.infobar.subtitles_enabled
+
+       def enableSubtitle(self, subtitles):
+               if self.infobar.selected_subtitle != subtitles:
+                       self.infobar.subtitles_enabled = False
+                       self.infobar.selected_subtitle = subtitles
+                       if subtitles:
+                               self.infobar.subtitles_enabled = True
+
+       def changeAC3Downmix(self, downmix):
+               if downmix.getValue() == True:
+                       config.av.downmix_ac3.value = True
+               else:
+                       config.av.downmix_ac3.value = False
+               config.av.downmix_ac3.save()
+
+       def changeMode(self, mode):
+               if mode is not None:
+                       self.audioChannel.selectChannel(int(mode.getValue()))
+
+       def changeAudio(self, audio):
+               track = int(audio)
+               if isinstance(track, int):
+                       if self.session.nav.getCurrentService().audioTracks().getNumberOfTracks() > track:
+                               self.audioTracks.selectTrack(track)
+
+       def keyLeft(self):
+               if self.focus == FOCUS_CONFIG:
+                       ConfigListScreen.keyLeft(self)
+               elif self.focus == FOCUS_STREAMS:
+                       self["streams"].setIndex(0)
+
+       def keyRight(self, config = False):
+               if config or self.focus == FOCUS_CONFIG:
+                       if self["config"].getCurrentIndex() < 3:
+                               ConfigListScreen.keyRight(self)
+                       elif hasattr(self, "plugincallfunc"):
+                               self.plugincallfunc()
+               if self.focus == FOCUS_STREAMS and self["streams"].count() and config == False:
+                       self["streams"].setIndex(self["streams"].count()-1)
+
+       def keyRed(self):
+               if self["key_red"].getBoolean():
+                       self.colorkey(0)
+
+       def keyGreen(self):
+               if self["key_green"].getBoolean():
+                       self.colorkey(1)
+
+       def keyYellow(self):
+               if self["key_yellow"].getBoolean():
+                       self.colorkey(2)
+
+       def keyBlue(self):
+               if self["key_blue"].getBoolean():
+                       self.colorkey(3)
+
+       def colorkey(self, idx):
+               self["config"].setCurrentIndex(idx)
+               self.keyRight(True)
+
+       def keyUp(self):
+               if self.focus == FOCUS_CONFIG:
+                       self["config"].instance.moveSelection(self["config"].instance.moveUp)
+               elif self.focus == FOCUS_STREAMS:
+                       if self["streams"].getIndex() == 0:
+                               self["config"].instance.setSelectionEnable(True)
+                               self["streams"].style = "notselected"
+                               self["config"].setCurrentIndex(len(self["config"].getList())-1)
+                               self.focus = FOCUS_CONFIG
+                       else:
+                               self["streams"].selectPrevious()
+
+       def keyDown(self):
+               if self.focus == FOCUS_CONFIG:
+                       if self["config"].getCurrentIndex() < len(self["config"].getList())-1:
+                               self["config"].instance.moveSelection(self["config"].instance.moveDown)
+                       else:
+                               self["config"].instance.setSelectionEnable(False)
+                               self["streams"].style = "default"
+                               self.focus = FOCUS_STREAMS
+               elif self.focus == FOCUS_STREAMS:
+                       self["streams"].selectNext()
+
+       def keyOk(self):
+               if self.focus == FOCUS_STREAMS and self["streams"].list:
+                       cur = self["streams"].getCurrent()
+                       if self.settings.menupage.getValue() == PAGE_AUDIO and cur[0] is not None:
+                               self.changeAudio(cur[2])
+                               self.__updatedInfo()
+                       if self.settings.menupage.getValue() == PAGE_SUBTITLES and cur[0] is not None:
+                               if self.infobar.selected_subtitle == cur[0]:
+                                       self.enableSubtitle(None)
+                                       selectedidx = self["streams"].getIndex()
+                                       self.__updatedInfo()
+                                       self["streams"].setIndex(selectedidx)
                                else:
-                                       description = language
+                                       self.enableSubtitle(cur[0])
+                                       self.__updatedInfo()
+                       self.close(0)
+               elif self.focus == FOCUS_CONFIG:
+                       self.keyRight()
 
-                       tlist.append((description, x))
+       def cancel(self):
+               self.close(0)
 
-               self["tracks"] = MenuList(tlist)
+class SubtitleSelection(AudioSelection):
+       def __init__(self, session, infobar=None):
+               AudioSelection.__init__(self, session, infobar, page=PAGE_SUBTITLES)
+               self.skinName = ["AudioSelection"]