From: Fraxinas Date: Tue, 25 May 2010 08:43:10 +0000 (+0200) Subject: experimentally merge audio + subtitle streams selection dialogs into one X-Git-Tag: 3.0.0~47 X-Git-Url: https://git.cweiske.de/enigma2.git/commitdiff_plain/46fd0ceb0b4850ffa9f2f3e1efd42b914eeef748?hp=441ac3dbbc2c5dfd21b09b00f6d376a115ac32a5 experimentally merge audio + subtitle streams selection dialogs into one --- diff --git a/data/menu.xml b/data/menu.xml index 6507bfe3..6e103542 100755 --- a/data/menu.xml +++ b/data/menu.xml @@ -17,7 +17,6 @@ self.openSetup("network")--> - self.session.scart.VCRSbChanged(3) diff --git a/data/skin_default.xml b/data/skin_default.xml index 8e0c1562..5c40c7d0 100755 --- a/data/skin_default.xml +++ b/data/skin_default.xml @@ -62,8 +62,47 @@ - - + + + + + + + + + + + + + + + + + + + + + {"templates": + {"default": (25, [ + MultiContentEntryText(pos = (0, 0), size = (35, 25), font = 0, flags = RT_HALIGN_LEFT, text = 1), # key, + MultiContentEntryText(pos = (40, 0), size = (55, 25), font = 0, flags = RT_HALIGN_LEFT, text = 2), # number, + MultiContentEntryText(pos = (100, 0), size = (80, 25), font = 0, flags = RT_HALIGN_LEFT, text = 3), # description, + MultiContentEntryText(pos = (190, 0), size = (140, 25), font = 0, flags = RT_HALIGN_LEFT, text = 4), # language, + MultiContentEntryText(pos = (340, 4), size = (60, 25), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # selection, + ], True, "showNever"), + "notselected": (25, [ + MultiContentEntryText(pos = (0, 0), size = (35, 25), font = 0, flags = RT_HALIGN_LEFT, text = 1), # key, + MultiContentEntryText(pos = (40, 0), size = (55, 25), font = 0, flags = RT_HALIGN_LEFT, text = 2), # number, + MultiContentEntryText(pos = (100, 0), size = (80, 25), font = 0, flags = RT_HALIGN_LEFT, text = 3), # description, + MultiContentEntryText(pos = (190, 0), size = (140, 25), font = 0, flags = RT_HALIGN_LEFT, text = 4), # language, + MultiContentEntryText(pos = (340, 4), size = (60, 25), font = 1, flags = RT_HALIGN_RIGHT, text = 5), # selection, + ], False, "showNever") + }, + "fonts": [gFont("Regular", 20), gFont("Regular", 16)], + "itemHeight": 25 + } + + @@ -941,9 +980,9 @@ self.instance.move(ePoint(orgpos.x() + (orgwidth - newwidth)/2, orgpos.y())) - + diff --git a/lib/python/Screens/AudioSelection.py b/lib/python/Screens/AudioSelection.py new file mode 100644 index 00000000..b97c25b2 --- /dev/null +++ b/lib/python/Screens/AudioSelection.py @@ -0,0 +1,308 @@ +from Screen import Screen +from Components.ServiceEventTracker import ServiceEventTracker +from Components.ActionMap import ActionMap +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) + +class AudioSelection(Screen, ConfigListScreen): + def __init__(self, session, infobar=None): + Screen.__init__(self, session) + + 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= + { + 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, + }, -3) + + self.settings = ConfigSubsection() + choicelist = [("audio",_("audio tracks")), ("subtitles",_("Subtitles"))] + self.settings.menupage = ConfigSelection(choices = choicelist) + self.settings.menupage.addNotifier(self.fillList) + self.onLayoutFinish.append(self.__layoutFinished) + + def __layoutFinished(self): + self["config"].instance.setSelectionEnable(False) + self.focus = FOCUS_STREAMS + + def fillList(self, arg=None): + streams = [] + conflist = [] + selectedidx = 0 + + service = self.session.nav.getCurrentService() + self.audioTracks = audio = service and service.audioTracks() + n = audio and audio.getNumberOfTracks() or 0 + + if self.settings.menupage.getValue() == "audio": + self.setTitle(_("Select audio track")) + if SystemInfo["CanDownmixAC3"]: + print "config.av.downmix_ac3.value=", config.av.downmix_ac3.value + 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"] = Boolean(True) + + if n > 0: + self.audioChannel = service.audioChannel() + print "self.audioChannel.getCurrentChannel()", self.audioChannel.getCurrentChannel() + 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"] = Boolean(True) + + selectedAudio = self.audioTracks.getCurrentTrack() + print "selectedAudio:", selectedAudio + + for x in range(n): + number = str(x) + i = audio.getTrackInfo(x) + languages = i.getLanguage().split('/') + description = i.getDescription() or _("") + 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": + _("") + else: + language += lang + cnt += 1 + + streams.append((x, "", number, description, language, selected)) + + #if hasattr(self, "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.runPlugin, p)) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_AUDIOMENU) ] + + #for p in Plugins: + #selection += 1 + #flist.append((p[0], "CALLFUNC", p[1])) + #if availableKeys: + #usedKeys.append(availableKeys[0]) + #del availableKeys[0] + #else: + #usedKeys.append("") + else: + streams = [(None, "", "", _("none"), "")] + + elif self.settings.menupage.getValue() == "subtitles": + self.setTitle(_("Subtitle selection")) + + self.settings.dummy = ConfigNothing() + conflist.append(getConfigListEntry("", self.settings.dummy)) + conflist.append(getConfigListEntry("", self.settings.dummy)) + + if self.subtitlesEnabled(): + sel = self.infobar.selected_subtitle + else: + sel = None + + idx = 0 + + subtitlelist = self.getSubtitleList() + + if len(subtitlelist): + for x in subtitlelist: + number = str(x[1]) + description = "?" + language = _("") + 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 = (" UTF-8 text "," SSA / AAS "," .SRT file ") + description = types[x[2]] + + streams.append((x, "", number, description, language, selected)) + idx += 1 + + else: + streams = [(None, "", "", _("none"), "")] + + conflist.append(getConfigListEntry(_("Menu"), self.settings.menupage)) + 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): + print "[enableSubtitle]", 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): + print "changeAC3Downmix config.av.downmix_ac3.value=", config.av.downmix_ac3.value, downmix.getValue() + 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): + print "changeMode", mode, mode.getValue() + if mode is not None: + self.audioChannel.selectChannel(int(mode.getValue())) + + def changeAudio(self, audio): + print "changeAudio", audio, "self.session.nav.getCurrentService().audioTracks().getNumberOfTracks():", self.session.nav.getCurrentService().audioTracks().getNumberOfTracks() + 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): + if self.focus == FOCUS_CONFIG: + ConfigListScreen.keyRight(self) + elif self.focus == FOCUS_STREAMS and self["streams"].count(): + self["streams"].setIndex(self["streams"].count()-1) + + def keyRed(self): + self.colorkey(0) + + def keyGreen(self): + self.colorkey(1) + + def keyYellow(self): + self.colorkey(2) + + def keyBlue(self): + pass + + def colorkey(self, idx): + self["config"].setCurrentIndex(idx) + ConfigListScreen.keyRight(self) + + def keyUp(self): + print "[keyUp]", self["streams"].getIndex() + 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): + print "[keyDown]", self["config"].getCurrentIndex(), len(self["config"].getList())-1 + 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): + print "[keyok]", self["streams"].list, self["streams"].getCurrent() + if self.focus == FOCUS_STREAMS and self["streams"].list: + cur = self["streams"].getCurrent() + if self.settings.menupage.getValue() == "audio" and cur[0]: + self.changeAudio(cur[2]) + self.__updatedInfo() + if self.settings.menupage.getValue() == "subtitles" and cur[0]: + if self.infobar.selected_subtitle == cur[0]: + self.enableSubtitle(None) + selectedidx = self["streams"].getIndex() + self.__updatedInfo() + self["streams"].setIndex(selectedidx) + else: + self.enableSubtitle(cur[0]) + self.__updatedInfo() + #self.close() + elif self.focus == FOCUS_CONFIG: + self.keyRight() + + def cancel(self): + self.close() diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index f98d4c33..a6b22e5c 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -1672,126 +1672,11 @@ class InfoBarAudioSelection: }) def audioSelection(self): - service = self.session.nav.getCurrentService() - self.audioTracks = audio = service and service.audioTracks() - n = audio and audio.getNumberOfTracks() or 0 - tlist = [] - if n > 0: - self.audioChannel = service.audioChannel() - - idx = 0 - while idx < n: - cnt = 0 - i = audio.getTrackInfo(idx) - languages = i.getLanguage().split('/') - description = i.getDescription() - language = "" - - for lang in languages: - if cnt: - language += ' / ' - if LanguageCodes.has_key(lang): - language += LanguageCodes[lang][0] - else: - language += lang - cnt += 1 - - if len(description): - description += " (" + language + ")" - else: - description = language - - tlist.append((description, idx)) - idx += 1 - - tlist.sort(key=lambda x: x[0]) - - selectedAudio = self.audioTracks.getCurrentTrack() - - selection = 0 - - for x in tlist: - if x[1] != selectedAudio: - selection += 1 - else: - break - - availableKeys = [] - usedKeys = [] - - if SystemInfo["CanDownmixAC3"]: - flist = [(_("AC3 downmix") + " - " +(_("Off"), _("On"))[config.av.downmix_ac3.value and 1 or 0], "CALLFUNC", self.changeAC3Downmix), - ((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode")] - usedKeys.extend(["red", "green"]) - availableKeys.extend(["yellow", "blue"]) - selection += 2 - else: - flist = [((_("Left"), _("Stereo"), _("Right"))[self.audioChannel.getCurrentChannel()], "mode")] - usedKeys.extend(["red"]) - availableKeys.extend(["green", "yellow", "blue"]) - selection += 1 - - if hasattr(self, "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.runPlugin, p)) for p in plugins.getPlugins(where = PluginDescriptor.WHERE_AUDIOMENU) ] - - for p in Plugins: - selection += 1 - flist.append((p[0], "CALLFUNC", p[1])) - if availableKeys: - usedKeys.append(availableKeys[0]) - del availableKeys[0] - else: - usedKeys.append("") - - flist.append(("--", "")) - usedKeys.append("") - selection += 1 - - keys = usedKeys + [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0" ] + [""] * n - self.session.openWithCallback(self.audioSelected, ChoiceBox, title=_("Select audio track"), list = flist + tlist, selection = selection, keys = keys, skin_name = "AudioTrackSelection") - else: - del self.audioTracks - - def changeAC3Downmix(self, arg): - choicelist = self.session.current_dialog["list"] - list = choicelist.list - t = list[0][1] - list[0][1]=(t[0], t[1], t[2], t[3], t[4], t[5], t[6], - _("AC3 downmix") + " - " + (_("On"), _("Off"))[config.av.downmix_ac3.value and 1 or 0]) - choicelist.setList(list) - if config.av.downmix_ac3.value: - config.av.downmix_ac3.value = False - else: - config.av.downmix_ac3.value = True - config.av.downmix_ac3.save() - - def audioSelected(self, audio): - if audio is not None: - if isinstance(audio[1], str): - if audio[1] == "mode": - keys = ["red", "green", "yellow"] - selection = self.audioChannel.getCurrentChannel() - tlist = ((_("left"), 0), (_("stereo"), 1), (_("right"), 2)) - self.session.openWithCallback(self.modeSelected, ChoiceBox, title=_("Select audio mode"), list = tlist, selection = selection, keys = keys, skin_name ="AudioModeSelection") - else: - del self.audioChannel - if self.session.nav.getCurrentService().audioTracks().getNumberOfTracks() > audio[1]: - self.audioTracks.selectTrack(audio[1]) - else: - del self.audioChannel - del self.audioTracks - - def modeSelected(self, mode): - if mode is not None: - self.audioChannel.selectChannel(mode[1]) - del self.audioChannel + from Screens.AudioSelection import AudioSelection + self.session.openWithCallback(self.audioSelected, AudioSelection, infobar=self) + + def audioSelected(self, ret=None): + print "[infobar::audioSelected]", ret class InfoBarSubserviceSelection: def __init__(self): diff --git a/lib/python/Screens/Makefile.am b/lib/python/Screens/Makefile.am index a4b158de..69600f01 100755 --- a/lib/python/Screens/Makefile.am +++ b/lib/python/Screens/Makefile.am @@ -1,13 +1,13 @@ installdir = $(pkglibdir)/python/Screens install_PYTHON = \ - ChannelSelection.py ClockDisplay.py ConfigMenu.py InfoBar.py Menu.py \ - MessageBox.py Screen.py ServiceScan.py TimerEdit.py \ + AudioSelection.py ChannelSelection.py ClockDisplay.py ConfigMenu.py InfoBar.py \ + Menu.py MessageBox.py Screen.py ServiceScan.py TimerEdit.py \ MovieSelection.py Setup.py About.py HarddiskSetup.py FixedMenu.py \ Satconfig.py ScanSetup.py NetworkSetup.py Ci.py TimerEntry.py Volume.py \ EpgSelection.py EventView.py Mute.py Standby.py ServiceInfo.py \ InfoBarGenerics.py HelpMenu.py Wizard.py __init__.py \ - Dish.py LanguageSelection.py StartWizard.py PiPSetup.py Subtitles.py \ + Dish.py LanguageSelection.py StartWizard.py PiPSetup.py \ TutorialWizard.py PluginBrowser.py MinuteInput.py Scart.py PVRState.py \ Console.py InputBox.py ChoiceBox.py SimpleSummary.py \ TimerSelection.py PictureInPicture.py TimeDateInput.py \ diff --git a/lib/python/Screens/Subtitles.py b/lib/python/Screens/Subtitles.py deleted file mode 100644 index 9ba7e0a5..00000000 --- a/lib/python/Screens/Subtitles.py +++ /dev/null @@ -1,103 +0,0 @@ -from Screen import Screen -from Components.ServiceEventTracker import ServiceEventTracker -from Components.ActionMap import ActionMap -from Components.ConfigList import ConfigListScreen -from Components.config import config, getConfigListEntry, ConfigNothing -from enigma import iPlayableService - -from Tools.ISO639 import LanguageCodes - -class Subtitles(Screen, ConfigListScreen): - def __init__(self, session, infobar=None): - Screen.__init__(self, session) - - self["actions"] = ActionMap(["SetupActions"], - { - "ok": self.ok, - "cancel": self.cancel, - }, -2) - - self.list = [] - ConfigListScreen.__init__(self, self.list) - self.infobar = infobar or self.session.infobar - self.fillList() - - self.__event_tracker = ServiceEventTracker(screen=self, eventmap= - { - iPlayableService.evUpdatedInfo: self.__updatedInfo - }) - self.cached_subtitle_checked = False - self.__selected_subtitle = None - - def fillList(self): - list = self.list - del list[:] - print "self.list", list - if self.subtitlesEnabled(): - list.append(getConfigListEntry(_("Disable Subtitles"), ConfigNothing(), None)) - sel = self.infobar.selected_subtitle - else: - sel = None - for x in self.getSubtitleList(): - if sel and sel[:4] == x[:4]: #ignore Language code in compare - text = _("Running") - else: - text = _("Enable") - if x[0] == 0: - if LanguageCodes.has_key(x[4]): - list.append(getConfigListEntry(text+" DVB "+LanguageCodes[x[4]][0], ConfigNothing(), x)) - else: - list.append(getConfigListEntry(text+" DVB "+x[4], ConfigNothing(), x)) - elif x[0] == 1: - if x[4] == 'und': #undefined - list.append(getConfigListEntry(text+" TTX "+_("Page")+" %x%02x"%(x[3],x[2]), ConfigNothing(), x)) - else: - if LanguageCodes.has_key(x[4]): - list.append(getConfigListEntry(text+" TTX "+_("Page")+" %x%02x"%(x[3],x[2])+" "+LanguageCodes[x[4]][0], ConfigNothing(), x)) - else: - list.append(getConfigListEntry(text+" TTX "+_("Page")+" %x%02x"%(x[3],x[2])+" "+x[4], ConfigNothing(), x)) - elif x[0] == 2: - types = (" UTF-8 text "," SSA / AAS "," .SRT file ") - if x[4] == 'und': #undefined - list.append(getConfigListEntry(text+types[x[2]]+_("Subtitles")+" %d" % x[1], ConfigNothing(), x)) - else: - if LanguageCodes.has_key(x[4]): - list.append(getConfigListEntry(text+types[x[2]]+_("Subtitles") + ' ' + LanguageCodes[x[4]][0], ConfigNothing(), x)) - else: - list.append(getConfigListEntry(text+types[x[2]]+_("Subtitles")+" %d " % x[1] +x[4], ConfigNothing(), x)) -# return _("Disable subtitles") - self["config"].list = list - self["config"].l.setList(list) - - 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 keyLeft(self): - ConfigListScreen.keyLeft(self) - - def keyRight(self): - ConfigListScreen.keyRight(self) - - def ok(self): - if self.list: - cur = self["config"].getCurrent() - self.enableSubtitle(cur[2]) - self.close(1) - - def cancel(self): - self.close()