From 77bb53beb46f6984e1529c4f703523c146956d0f Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Mon, 26 Jun 2006 21:10:10 +0000 Subject: [PATCH] add Boolean source, add ServiceInfo boolean sources, add ConditionalShowHide converter, add FixedLabel and Pixmap renderer --- .../Components/Converter/ClockToText.py | 2 +- .../Converter/ConditionalShowHide.py | 11 ++++ .../Components/Converter/FrontendInfo.py | 2 +- lib/python/Components/Converter/Makefile.am | 3 +- .../Components/Converter/ServiceInfo.py | 63 +++++++++++++++++++ .../Components/Converter/ServiceName.py | 2 +- lib/python/Components/Renderer/FixedLabel.py | 6 ++ lib/python/Components/Renderer/Makefile.am | 5 +- lib/python/Components/Renderer/Pixmap.py | 6 ++ lib/python/Components/Sources/Boolean.py | 25 ++++++++ .../Components/Sources/CurrentService.py | 12 ++-- lib/python/Components/Sources/Makefile.am | 2 +- 12 files changed, 125 insertions(+), 14 deletions(-) create mode 100644 lib/python/Components/Converter/ConditionalShowHide.py create mode 100644 lib/python/Components/Converter/ServiceInfo.py create mode 100644 lib/python/Components/Renderer/FixedLabel.py create mode 100644 lib/python/Components/Renderer/Pixmap.py create mode 100644 lib/python/Components/Sources/Boolean.py diff --git a/lib/python/Components/Converter/ClockToText.py b/lib/python/Components/Converter/ClockToText.py index 61c176eb..3abfffc5 100644 --- a/lib/python/Components/Converter/ClockToText.py +++ b/lib/python/Components/Converter/ClockToText.py @@ -1,4 +1,4 @@ -from Components.Converter.Converter import Converter +from Converter import Converter from time import localtime, strftime class ClockToText(Converter, object): diff --git a/lib/python/Components/Converter/ConditionalShowHide.py b/lib/python/Components/Converter/ConditionalShowHide.py new file mode 100644 index 00000000..56fb1453 --- /dev/null +++ b/lib/python/Components/Converter/ConditionalShowHide.py @@ -0,0 +1,11 @@ +from Converter import Converter + +class ConditionalShowHide(Converter, object): + + def __init__(self, type, *args, **kwargs): + Converter.__init__(self) + self.invert = type == "Invert" + + def changed(self): + for x in self.downstream_elements: + x.visible = self.source.boolean diff --git a/lib/python/Components/Converter/FrontendInfo.py b/lib/python/Components/Converter/FrontendInfo.py index a1064b97..afff2a7a 100644 --- a/lib/python/Components/Converter/FrontendInfo.py +++ b/lib/python/Components/Converter/FrontendInfo.py @@ -41,7 +41,7 @@ class FrontendInfo(Converter, object): text = property(getText) - bool = property(getBool) + boolean = property(getBool) def getValue(self): assert self.type != self.LOCK, "the value/range output of FrontendInfo can not be used for lock info" diff --git a/lib/python/Components/Converter/Makefile.am b/lib/python/Components/Converter/Makefile.am index 59cb068f..a84628a0 100644 --- a/lib/python/Components/Converter/Makefile.am +++ b/lib/python/Components/Converter/Makefile.am @@ -2,4 +2,5 @@ installdir = $(LIBDIR)/enigma2/python/Components/Converter install_PYTHON = \ __init__.py ClockToText.py Converter.py EventName.py StaticText.py EventTime.py \ - Poll.py RemainingToText.py StringList.py ServiceName.py FrontendInfo.py + Poll.py RemainingToText.py StringList.py ServiceName.py FrontendInfo.py ServiceInfo.py \ + ConditionalShowHide.py diff --git a/lib/python/Components/Converter/ServiceInfo.py b/lib/python/Components/Converter/ServiceInfo.py new file mode 100644 index 00000000..413aa191 --- /dev/null +++ b/lib/python/Components/Converter/ServiceInfo.py @@ -0,0 +1,63 @@ +from Components.Converter.Converter import Converter +from enigma import iServiceInformation, iPlayableService + +class ServiceInfo(Converter, object): + HAS_TELETEXT = 0 + IS_MULTICHANNEL = 1 + IS_CRYPTED = 2 + IS_WIDESCREEN = 3 + SUBSERVICES_AVAILABLE = 4 + + def __init__(self, type, *args, **kwargs): + Converter.__init__(self) + self.type = { + "HasTelext": self.HAS_TELETEXT, + "IsMultichannel": self.IS_MULTICHANNEL, + "IsCrypted": self.IS_CRYPTED, + "IsWidescreen": self.IS_WIDESCREEN, + "SubservicesAvailable": self.SUBSERVICES_AVAILABLE, + }[type] + + self.interesting_events = { + self.HAS_TELETEXT: [iPlayableService.evEnd, iPlayableService.evUpdatedInfo], + self.IS_MULTICHANNEL: [iPlayableService.evUpdatedInfo, iPlayableService.evEnd], + self.IS_CRYPTED: [iPlayableService.evUpdatedInfo, iPlayableService.evEnd], + self.IS_WIDESCREEN: [iPlayableService.evUpdatedEventInfo, iPlayableService.evEnd], + self.SUBSERVICES_AVAILABLE: [iPlayableService.evUpdatedEventInfo, iPlayableService.evEnd] + }[self.type] + + def getServiceInfoValue(self, info, what): + v = info.getInfo(what) + if v != -2: + return "N/A" + return info.getInfoString(what) + + def getBoolean(self): + service = self.source.service + info = service and service.info() + if not info: + return False + + if self.type == self.HAS_TELETEXT: + tpid = info.getInfo(iServiceInformation.sTXTPID) + return tpid != -1 + elif self.type == self.IS_MULTICHANNEL: + # FIXME. but currently iAudioTrackInfo doesn't provide more information. + audio = service.audioTracks() + if audio: + n = audio.getNumberOfTracks() + for x in range(n): + i = audio.getTrackInfo(x) + description = i.getDescription(); + if description.find("AC3") != -1 or description.find("DTS") != -1: + return True + return False + elif self.type == self.IS_CRYPTED: + return info.getInfo(iServiceInformation.sIsCrypted) == 1 + elif self.type == self.IS_WIDESCREEN: + return info.getInfo(iServiceInformation.sAspect) in [3, 4, 7, 8, 0xB, 0xC, 0xF, 0x10] + elif self.type == self.SUBSERVICES_AVAILABLE: + subservices = service.subServices() + return subservices and subservices.getNumberOfSubservices() > 0 + + boolean = property(getBoolean) diff --git a/lib/python/Components/Converter/ServiceName.py b/lib/python/Components/Converter/ServiceName.py index 79e0c997..094dbdfa 100644 --- a/lib/python/Components/Converter/ServiceName.py +++ b/lib/python/Components/Converter/ServiceName.py @@ -25,7 +25,7 @@ class ServiceName(Converter, object): return "" if self.type == self.NAME: - return service.getName() + return info.getName() elif self.type == self.PROVIDER: return self.getServiceInfoValue(info, iServiceInformation.sProvider) diff --git a/lib/python/Components/Renderer/FixedLabel.py b/lib/python/Components/Renderer/FixedLabel.py new file mode 100644 index 00000000..15f64b51 --- /dev/null +++ b/lib/python/Components/Renderer/FixedLabel.py @@ -0,0 +1,6 @@ +from Renderer import Renderer + +from enigma import eLabel + +class FixedLabel(Renderer): + GUI_WIDGET = eLabel diff --git a/lib/python/Components/Renderer/Makefile.am b/lib/python/Components/Renderer/Makefile.am index a8ca2939..cc220cb6 100644 --- a/lib/python/Components/Renderer/Makefile.am +++ b/lib/python/Components/Renderer/Makefile.am @@ -1,6 +1,5 @@ installdir = $(LIBDIR)/enigma2/python/Components/Renderer install_PYTHON = \ - __init__.py Label.py Progress.py Listbox.py Renderer.py - - + __init__.py Label.py Progress.py Listbox.py Renderer.py Pixmap.py \ + FixedLabel.py \ No newline at end of file diff --git a/lib/python/Components/Renderer/Pixmap.py b/lib/python/Components/Renderer/Pixmap.py new file mode 100644 index 00000000..d67cd559 --- /dev/null +++ b/lib/python/Components/Renderer/Pixmap.py @@ -0,0 +1,6 @@ +from Renderer import Renderer + +from enigma import ePixmap + +class Pixmap(Renderer): + GUI_WIDGET = ePixmap diff --git a/lib/python/Components/Sources/Boolean.py b/lib/python/Components/Sources/Boolean.py new file mode 100644 index 00000000..c25b4626 --- /dev/null +++ b/lib/python/Components/Sources/Boolean.py @@ -0,0 +1,25 @@ +from Source import Source +from enigma import eTimer + +# a small warning: +# you can use that boolean well to express screen-private +# conditional expressions. +# +# however, if you think that there is ANY interest that another +# screen could use your expression, please put your calculation +# into a seperate Source, providing a "boolean"-property. +class Boolean(Source, object): + def __init__(self, fixed = False, function = None, poll = 0): + Source.__init__(self) + if poll > 0: + self.poll_timer = eTimer() + self.poll_timer.timeout.get().append(self.changed) + self.poll_timer.start(poll) + + def getBoolean(self): + if self.function is not None: + return self.function() + else: + return self.fixed + + boolean = property(getBoolean) diff --git a/lib/python/Components/Sources/CurrentService.py b/lib/python/Components/Sources/CurrentService.py index bec6d2dc..2bd493e7 100644 --- a/lib/python/Components/Sources/CurrentService.py +++ b/lib/python/Components/Sources/CurrentService.py @@ -8,15 +8,15 @@ class CurrentService(PerServiceBase, Source): PerServiceBase.__init__(self, navcore, { iPlayableService.evStart: self.changed, - iPlayableService.evEnd: self.changed + iPlayableService.evEnd: self.changed, + # FIXME: we should check 'interesting_events' + # which is not always provided. + iPlayableService.evUpdatedInfo: self.changed, + iPlayableService.evUpdatedEventInfo: self.changed }) self.navcore = navcore def getCurrentService(self): - service = self.navcore.getCurrentService() - return service - - def stopEvent(self): - self.changed() + return self.navcore.getCurrentService() service = property(getCurrentService) diff --git a/lib/python/Components/Sources/Makefile.am b/lib/python/Components/Sources/Makefile.am index c3a75f86..923c6512 100644 --- a/lib/python/Components/Sources/Makefile.am +++ b/lib/python/Components/Sources/Makefile.am @@ -2,4 +2,4 @@ installdir = $(LIBDIR)/enigma2/python/Components/Sources install_PYTHON = \ __init__.py Clock.py EventInfo.py Source.py MenuList.py CurrentService.py \ - FrontendStatus.py + FrontendStatus.py Boolean.py -- 2.30.2