aboutsummaryrefslogtreecommitdiff
path: root/lib/python
diff options
context:
space:
mode:
Diffstat (limited to 'lib/python')
-rw-r--r--lib/python/Components/Converter/Makefile.am2
-rw-r--r--lib/python/Components/Converter/RadioText.py0
-rw-r--r--lib/python/Components/Converter/RdsInfo.py53
-rw-r--r--lib/python/Components/Sources/Makefile.am2
-rw-r--r--lib/python/Components/Sources/RadioText.py0
-rw-r--r--lib/python/Components/Sources/RdsDecoder.py29
-rw-r--r--lib/python/Screens/ChannelSelection.py58
-rw-r--r--lib/python/Screens/InfoBar.py12
-rw-r--r--lib/python/Screens/InfoBarGenerics.py51
-rw-r--r--lib/python/Screens/Makefile.am2
-rw-r--r--lib/python/Screens/RdsDisplay.py272
11 files changed, 453 insertions, 28 deletions
diff --git a/lib/python/Components/Converter/Makefile.am b/lib/python/Components/Converter/Makefile.am
index b25a32d8..a5d95f53 100644
--- a/lib/python/Components/Converter/Makefile.am
+++ b/lib/python/Components/Converter/Makefile.am
@@ -3,5 +3,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 ServiceInfo.py \
- ConditionalShowHide.py ServicePosition.py ValueRange.py RadioText.py Streaming.py
+ ConditionalShowHide.py ServicePosition.py ValueRange.py RdsInfo.py Streaming.py
diff --git a/lib/python/Components/Converter/RadioText.py b/lib/python/Components/Converter/RadioText.py
deleted file mode 100644
index e69de29b..00000000
--- a/lib/python/Components/Converter/RadioText.py
+++ /dev/null
diff --git a/lib/python/Components/Converter/RdsInfo.py b/lib/python/Components/Converter/RdsInfo.py
new file mode 100644
index 00000000..3a7b2be3
--- /dev/null
+++ b/lib/python/Components/Converter/RdsInfo.py
@@ -0,0 +1,53 @@
+from enigma import iRdsDecoder, iPlayableService
+from Components.Converter.Converter import Converter
+from Components.Element import cached
+
+class RdsInfo(Converter, object):
+ RASS_INTERACTIVE_AVAILABLE = 0
+ RTP_TEXT_CHANGED = 1
+ RADIO_TEXT_CHANGED = 2
+
+ def __init__(self, type):
+ Converter.__init__(self, type)
+ self.type = {
+ "RadioText": self.RADIO_TEXT_CHANGED,
+ "RtpText": self.RTP_TEXT_CHANGED,
+ "RasInteractiveAvailable": self.RASS_INTERACTIVE_AVAILABLE
+ }[type]
+
+ self.interesting_events = {
+ self.RADIO_TEXT_CHANGED: [iPlayableService.evUpdatedRadioText],
+ self.RTP_TEXT_CHANGED: [iPlayableService.evUpdatedRtpText],
+ self.RASS_INTERACTIVE_AVAILABLE: [iPlayableService.evUpdatedRassInteractivePicMask]
+ }[self.type]
+
+ @cached
+ def getText(self):
+ decoder = self.source.decoder
+ text = ""
+ if decoder:
+ if self.type == self.RADIO_TEXT_CHANGED:
+ text = decoder.getText(iRdsDecoder.RadioText)
+ elif self.type == self.RTP_TEXT_CHANGED:
+ text = decoder.getText(iRdsDecoder.RtpText)
+ else:
+ print "unknown RdsInfo Converter type", self.type
+ return text
+
+ text = property(getText)
+
+ @cached
+ def getBoolean(self):
+ decoder = self.source.decoder
+ if self.type == self.RASS_INTERACTIVE_AVAILABLE:
+ mask = decoder and decoder.getRassInteractiveMask()
+ return (mask and mask[0] & 1 and True) or False
+ elif self.type == self.RADIO_TEXT_CHANGED:
+ return (len(decoder.getText(iRdsDecoder.RadioText)) and True) or False
+ elif self.type == self.RTP_TEXT_CHANGED:
+ return (len(decoder.getText(iRdsDecoder.RtpText)) and True) or False
+ boolean = property(getBoolean)
+
+ def changed(self, what):
+ if what[0] != self.CHANGED_SPECIFIC or what[1] in self.interesting_events:
+ Converter.changed(self, what)
diff --git a/lib/python/Components/Sources/Makefile.am b/lib/python/Components/Sources/Makefile.am
index 5e6a30a5..b5e16d98 100644
--- a/lib/python/Components/Sources/Makefile.am
+++ b/lib/python/Components/Sources/Makefile.am
@@ -2,5 +2,5 @@ installdir = $(LIBDIR)/enigma2/python/Components/Sources
install_PYTHON = \
__init__.py Clock.py EventInfo.py Source.py MenuList.py CurrentService.py \
- FrontendStatus.py Boolean.py Config.py ServiceList.py RadioText.py StreamService.py \
+ FrontendStatus.py Boolean.py Config.py ServiceList.py RdsDecoder.py StreamService.py \
StaticText.py
diff --git a/lib/python/Components/Sources/RadioText.py b/lib/python/Components/Sources/RadioText.py
deleted file mode 100644
index e69de29b..00000000
--- a/lib/python/Components/Sources/RadioText.py
+++ /dev/null
diff --git a/lib/python/Components/Sources/RdsDecoder.py b/lib/python/Components/Sources/RdsDecoder.py
new file mode 100644
index 00000000..886f81f6
--- /dev/null
+++ b/lib/python/Components/Sources/RdsDecoder.py
@@ -0,0 +1,29 @@
+from Components.PerServiceDisplay import PerServiceBase
+from Components.Element import cached
+from enigma import iPlayableService
+from Source import Source
+
+class RdsDecoder(PerServiceBase, Source, object):
+ def __init__(self, navcore):
+ Source.__init__(self)
+ PerServiceBase.__init__(self, navcore,
+ {
+ iPlayableService.evStart: self.gotEvent,
+ iPlayableService.evUpdatedRadioText: self.gotEvent,
+ iPlayableService.evUpdatedRtpText: self.gotEvent,
+ iPlayableService.evUpdatedRassInteractivePicMask: self.gotEvent,
+ iPlayableService.evEnd: self.gotEvent
+ }, with_event=True)
+
+ @cached
+ def getDecoder(self):
+ service = self.navcore.getCurrentService()
+ return service and service.rdsDecoder()
+
+ decoder = property(getDecoder)
+
+ def gotEvent(self, what):
+ if what in [iPlayableService.evStart, iPlayableService.evEnd]:
+ self.changed((self.CHANGED_CLEAR,))
+ else:
+ self.changed((self.CHANGED_SPECIFIC, what))
diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py
index 5a0f1177..7f9f797e 100644
--- a/lib/python/Screens/ChannelSelection.py
+++ b/lib/python/Screens/ChannelSelection.py
@@ -1,7 +1,7 @@
from Screen import Screen
from Components.Button import Button
from Components.ServiceList import ServiceList
-from Components.ActionMap import NumberActionMap, ActionMap
+from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap
from Components.MenuList import MenuList
from Components.ServiceEventTracker import ServiceEventTracker
from EpgSelection import EPGSelection
@@ -11,11 +11,13 @@ from Screens.FixedMenu import FixedMenu
from Tools.NumericalTextInput import NumericalTextInput
from Components.NimManager import nimmanager
from Components.Sources.Clock import Clock
+from Components.Sources.RdsDecoder import RdsDecoder
from Components.Input import Input
from Components.ParentalControl import parentalControl
from Screens.InputBox import InputBox, PinInput
from Screens.MessageBox import MessageBox
from Screens.ServiceInfo import ServiceInfo
+from Screens.RdsDisplay import RassInteractive
from ServiceReference import ServiceReference
from Tools.BoundFunction import boundFunction
from re import *
@@ -1256,32 +1258,30 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect
self.revertMode = None
self.close(None)
-from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord, InfoBarRadioText
+from Screens.InfoBarGenerics import InfoBarEvent, InfoBarServiceName
-class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord):
+class RadioInfoBar(Screen, InfoBarEvent, InfoBarServiceName):
def __init__(self, session):
Screen.__init__(self, session)
InfoBarEvent.__init__(self)
InfoBarServiceName.__init__(self)
- InfoBarInstantRecord.__init__(self)
self["CurrentTime"] = Clock()
+ self["RdsDecoder"] = RdsDecoder(self.session.nav)
-class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, InfoBarRadioText):
-
+class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG):
ALLOW_SUSPEND = True
- def __init__(self, session):
+ def __init__(self, session, infobar):
ChannelSelectionBase.__init__(self, session)
ChannelSelectionEdit.__init__(self)
ChannelSelectionEPG.__init__(self)
- InfoBarRadioText.__init__(self)
-
+ self.infobar = infobar
config.radio = ConfigSubsection();
config.radio.lastservice = ConfigText()
config.radio.lastroot = ConfigText()
self.onLayoutFinish.append(self.onCreate)
- self.info = session.instantiateDialog(RadioInfoBar)
+ self.info = session.instantiateDialog(RadioInfoBar) # our simple infobar
self["actions"] = ActionMap(["OkCancelActions", "TvRadioActions"],
{
@@ -1297,6 +1297,37 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
iPlayableService.evEnd: self.__evServiceEnd
})
+########## RDS Radiotext / Rass Support BEGIN
+ self.infobar = infobar # reference to real infobar (the one and only)
+ self["RdsDecoder"] = self.info["RdsDecoder"]
+ self["RdsActions"] = HelpableActionMap(self, "InfobarRdsActions",
+ {
+ "startRassInteractive": (self.startRassInteractive, _("View Rass interactive..."))
+ },-1)
+ self["RdsActions"].setEnabled(False)
+ infobar.rds_display.onRassInteractivePossibilityChanged.append(self.RassInteractivePossibilityChanged)
+
+ def startRassInteractive(self):
+ self.info.hide();
+ self.infobar.rass_interactive = self.session.openWithCallback(self.RassInteractiveClosed, RassInteractive)
+
+ def RassInteractiveClosed(self):
+ self.info.show()
+ self.infobar.rass_interactive = None
+ self.infobar.RassSlidePicChanged()
+
+ def RassInteractivePossibilityChanged(self, state):
+ self["RdsActions"].setEnabled(state)
+########## RDS Radiotext / Rass Support END
+
+ def closeRadio(self):
+ self.infobar.rds_display.onRassInteractivePossibilityChanged.remove(self.RassInteractivePossibilityChanged)
+ self.info.hide()
+ #set previous tv service
+ lastservice=eServiceReference(config.tv.lastservice.value)
+ self.session.nav.playService(lastservice)
+ self.close(None)
+
def __evServiceStart(self):
service = self.session.nav.getCurrentService()
if service:
@@ -1371,13 +1402,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS
config.radio.lastservice.save()
self.saveRoot()
- def closeRadio(self):
- self.info.hide()
- #set previous tv service
- lastservice=eServiceReference(config.tv.lastservice.value)
- self.session.nav.playService(lastservice)
- self.close(None)
-
class SimpleChannelSelection(ChannelSelectionBase):
def __init__(self, session, title):
ChannelSelectionBase.__init__(self, session)
diff --git a/lib/python/Screens/InfoBar.py b/lib/python/Screens/InfoBar.py
index 24c2b40b..ab40838d 100644
--- a/lib/python/Screens/InfoBar.py
+++ b/lib/python/Screens/InfoBar.py
@@ -12,7 +12,7 @@ from Components.config import config
from Tools.Notifications import AddNotificationWithCallback
from Screens.InfoBarGenerics import InfoBarShowHide, \
- InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarRadioText, \
+ InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarRdsDecoder, \
InfoBarEPG, InfoBarEvent, InfoBarServiceName, InfoBarSeek, InfoBarInstantRecord, \
InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, \
InfoBarSubserviceSelection, InfoBarTuner, InfoBarShowMovies, InfoBarTimeshift, \
@@ -23,7 +23,7 @@ from Screens.InfoBarGenerics import InfoBarShowHide, \
from Screens.HelpMenu import HelpableScreen, HelpMenu
class InfoBar(InfoBarShowHide,
- InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRadioText,
+ InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder,
InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord, InfoBarAudioSelection,
HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish,
InfoBarSubserviceSelection, InfoBarTuner, InfoBarTimeshift, InfoBarSeek,
@@ -47,7 +47,7 @@ class InfoBar(InfoBarShowHide,
for x in HelpableScreen, \
InfoBarShowHide, \
- InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRadioText, \
+ InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder, \
InfoBarEvent, InfoBarServiceName, InfoBarInstantRecord, InfoBarAudioSelection, \
InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarSubserviceSelection, \
InfoBarTuner, InfoBarTimeshift, InfoBarSeek, InfoBarSummarySupport, InfoBarTimeshiftState, \
@@ -67,7 +67,11 @@ class InfoBar(InfoBarShowHide,
if config.usage.e1like_radio_mode.value:
self.showRadioChannelList(True)
else:
- self.session.open(ChannelSelectionRadio)
+ self.rds_display.hide() # in InfoBarRdsDecoder
+ self.session.openWithCallback(self.ChannelSelectionRadioClosed, ChannelSelectionRadio, self)
+
+ def ChannelSelectionRadioClosed(self, *arg):
+ self.rds_display.show() # in InfoBarRdsDecoder
def showMovies(self):
self.session.openWithCallback(self.movieSelected, MovieSelection)
diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py
index 2ccd52de..78a67b7c 100644
--- a/lib/python/Screens/InfoBarGenerics.py
+++ b/lib/python/Screens/InfoBarGenerics.py
@@ -12,7 +12,6 @@ from Components.ProgressBar import *
from Components.ServiceEventTracker import ServiceEventTracker
from Components.Sources.CurrentService import CurrentService
from Components.Sources.EventInfo import EventInfo
-from Components.Sources.RadioText import RadioText
from Components.Sources.FrontendStatus import FrontendStatus
from Components.Sources.Boolean import Boolean
from Components.Sources.Clock import Clock
@@ -32,6 +31,7 @@ from Screens.MinuteInput import MinuteInput
from Screens.TimerSelection import TimerSelection
from Screens.PictureInPicture import PictureInPicture
from Screens.SubtitleDisplay import SubtitleDisplay
+from Screens.RdsDisplay import RdsInfoDisplay, RassInteractive
from Screens.SleepTimerEdit import SleepTimerEdit
from ServiceReference import ServiceReference
@@ -538,10 +538,53 @@ class InfoBarEvent:
self["Event_Now"] = EventInfo(self.session.nav, EventInfo.NOW)
self["Event_Next"] = EventInfo(self.session.nav, EventInfo.NEXT)
-class InfoBarRadioText:
- """provides radio (RDS) text info display"""
+class InfoBarRdsDecoder:
+ """provides RDS and Rass support/display"""
def __init__(self):
- self["RadioText"] = RadioText(self.session.nav)
+ self.rds_display = self.session.instantiateDialog(RdsInfoDisplay)
+ self.rass_interactive = None
+
+ self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+ {
+ iPlayableService.evEnd: self.__serviceStopped,
+ iPlayableService.evUpdatedRassSlidePic: self.RassSlidePicChanged
+ })
+
+ self["RdsActions"] = HelpableActionMap(self, "InfobarRdsActions",
+ {
+ "startRassInteractive": (self.startRassInteractive, _("View Rass interactive..."))
+ },-1)
+
+ self["RdsActions"].setEnabled(False)
+
+ self.onLayoutFinish.append(self.rds_display.show)
+ self.rds_display.onRassInteractivePossibilityChanged.append(self.RassInteractivePossibilityChanged)
+
+ def RassInteractivePossibilityChanged(self, state):
+ self["RdsActions"].setEnabled(state)
+
+ def RassSlidePicChanged(self):
+ if not self.rass_interactive:
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ if decoder:
+ decoder.showRassSlidePicture()
+
+ def __serviceStopped(self):
+ if self.rass_interactive is not None:
+ rass_interactive = self.rass_interactive
+ self.rass_interactive = None
+ rass_interactive.close()
+
+ def startRassInteractive(self):
+ self.rds_display.hide()
+ self.rass_interactive = self.session.openWithCallback(self.RassInteractiveClosed, RassInteractive)
+
+ def RassInteractiveClosed(self, *val):
+ if self.rass_interactive is not None:
+ self.rass_interactive = None
+ self.RassSlidePicChanged()
+ self.rds_display.show()
class InfoBarServiceName:
def __init__(self):
diff --git a/lib/python/Screens/Makefile.am b/lib/python/Screens/Makefile.am
index d5512e7e..920a97fb 100644
--- a/lib/python/Screens/Makefile.am
+++ b/lib/python/Screens/Makefile.am
@@ -12,4 +12,4 @@ install_PYTHON = \
Console.py InputBox.py ChoiceBox.py SimpleSummary.py ImageWizard.py \
MediaPlayer.py TimerSelection.py PictureInPicture.py TimeDateInput.py \
SubtitleDisplay.py SubservicesQuickzap.py ParentalControlSetup.py NumericalTextInputHelpDialog.py \
- SleepTimerEdit.py Ipkg.py
+ SleepTimerEdit.py Ipkg.py RdsDisplay.py
diff --git a/lib/python/Screens/RdsDisplay.py b/lib/python/Screens/RdsDisplay.py
new file mode 100644
index 00000000..4190b945
--- /dev/null
+++ b/lib/python/Screens/RdsDisplay.py
@@ -0,0 +1,272 @@
+from enigma import iPlayableService, loadPNG, iRdsDecoder, ePoint, gRGB
+from Screens.Screen import Screen
+from Components.Sources.RdsDecoder import RdsDecoder
+from Components.ActionMap import NumberActionMap
+from Components.ServiceEventTracker import ServiceEventTracker
+from Components.Pixmap import Pixmap
+from Components.Label import Label
+from Tools.Directories import resolveFilename, SCOPE_SKIN_IMAGE
+
+class RdsInfoDisplay(Screen):
+ ALLOW_SUSPEND = True
+
+ def __init__(self, session):
+ Screen.__init__(self, session)
+
+ self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+ {
+ iPlayableService.evEnd: self.__serviceStopped,
+ iPlayableService.evUpdatedRadioText: self.RadioTextChanged,
+ iPlayableService.evUpdatedRtpText: self.RtpTextChanged,
+ iPlayableService.evUpdatedRassInteractivePicMask: self.RassInteractivePicMaskChanged,
+ })
+
+ self["RadioText"] = Label()
+ self["RtpText"] = Label()
+ self["RassLogo"] = Pixmap()
+
+ self.onLayoutFinish.append(self.hideWidgets)
+ self.rassInteractivePossible=False
+ self.onRassInteractivePossibilityChanged = [ ]
+
+ def hideWidgets(self):
+ for x in (self["RadioText"],self["RtpText"],self["RassLogo"]):
+ x.hide()
+
+ def RadioTextChanged(self):
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ rdsText = decoder and decoder.getText(iRdsDecoder.RadioText)
+ if rdsText and len(rdsText):
+ self["RadioText"].setText(rdsText)
+ self["RadioText"].show()
+ else:
+ self["RadioText"].hide()
+
+ def RtpTextChanged(self):
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ rtpText = decoder and decoder.getText(iRdsDecoder.RtpText)
+ if rtpText and len(rtpText):
+ self["RtpText"].setText(rtpText)
+ self["RtpText"].show()
+ else:
+ self["RtpText"].hide()
+
+ def RassInteractivePicMaskChanged(self):
+ if not self.rassInteractivePossible:
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ mask = decoder and decoder.getRassInteractiveMask()
+ if mask[0] & 1: #rass interactive index page available
+ self["RassLogo"].show()
+ self.rassInteractivePossible = True
+ for x in self.onRassInteractivePossibilityChanged:
+ x(True)
+
+ def __serviceStopped(self):
+ self.hideWidgets()
+ if self.rassInteractivePossible:
+ self.rassInteractivePossible = False
+ for x in self.onRassInteractivePossibilityChanged:
+ x(False)
+
+class RassInteractive(Screen):
+ def __init__(self, session):
+ Screen.__init__(self, session)
+
+ self["actions"] = NumberActionMap( [ "NumberActions", "RassInteractiveActions" ],
+ {
+ "exit": self.close,
+ "0": lambda x : self.numPressed(0),
+ "1": lambda x : self.numPressed(1),
+ "2": lambda x : self.numPressed(2),
+ "3": lambda x : self.numPressed(3),
+ "4": lambda x : self.numPressed(4),
+ "5": lambda x : self.numPressed(5),
+ "6": lambda x : self.numPressed(6),
+ "7": lambda x : self.numPressed(7),
+ "8": lambda x : self.numPressed(8),
+ "9": lambda x : self.numPressed(9),
+ "nextPage": self.nextPage,
+ "prevPage": self.prevPage,
+ "nextSubPage": self.nextSubPage,
+ "prevSubPage": self.prevSubPage
+ })
+
+ self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+ {
+ iPlayableService.evUpdatedRassInteractivePicMask: self.recvRassInteractivePicMaskChanged
+ })
+
+ self["subpages_1"] = Pixmap()
+ self["subpages_2"] = Pixmap()
+ self["subpages_3"] = Pixmap()
+ self["subpages_4"] = Pixmap()
+ self["subpages_5"] = Pixmap()
+ self["subpages_6"] = Pixmap()
+ self["subpages_7"] = Pixmap()
+ self["subpages_8"] = Pixmap()
+ self["subpages_9"] = Pixmap()
+ self["Marker"] = Label(">")
+
+ self.subpage = {
+ 1 : self["subpages_1"],
+ 2 : self["subpages_2"],
+ 3 : self["subpages_3"],
+ 4 : self["subpages_4"],
+ 5 : self["subpages_5"],
+ 6 : self["subpages_6"],
+ 7 : self["subpages_7"],
+ 8 : self["subpages_8"],
+ 9 : self["subpages_9"] }
+
+ self.subpage_png = {
+ 1 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page1.png")),
+ 2 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page2.png")),
+ 3 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page3.png")),
+ 4 : loadPNG(resolveFilename(SCOPE_SKIN_IMAGE, "rass_page4.png")) }
+
+ self.current_page=0;
+ self.current_subpage=0;
+ self.showRassPage(0,0)
+ self.onLayoutFinish.append(self.updateSubPagePixmaps)
+
+ def updateSubPagePixmaps(self):
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ if not decoder: # this should never happen
+ print "NO RDS DECODER in showRassPage"
+ else:
+ mask = decoder.getRassInteractiveMask()
+ page = 1
+ while page < 10:
+ subpage_cnt = self.countAvailSubpages(page, mask)
+ subpage = self.subpage[page]
+ if subpage_cnt > 0:
+ if subpage.instance:
+ png = self.subpage_png[subpage_cnt]
+ if png:
+ subpage.instance.setPixmap(png)
+ subpage.show()
+ else:
+ print "rass png missing"
+ else:
+ subpage.hide()
+ page += 1
+
+ def recvRassInteractivePicMaskChanged(self):
+ self.updateSubPagePixmaps()
+
+ def showRassPage(self, page, subpage):
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ if not decoder: # this should never happen
+ print "NO RDS DECODER in showRassPage"
+ else:
+ decoder.showRassInteractivePic(page, subpage)
+ page_diff = page - self.current_page
+ self.current_page = page
+ if page_diff:
+ current_pos = self["Marker"].getPosition()
+ y = current_pos[1]
+ y += page_diff * 25
+ self["Marker"].setPosition(current_pos[0],y)
+
+ def getMaskForPage(self, page, masks=None):
+ if not masks:
+ service = self.session.nav.getCurrentService()
+ decoder = service and service.rdsDecoder()
+ if not decoder: # this should never happen
+ print "NO RDS DECODER in getMaskForPage"
+ masks = decoder.getRassInteractiveMask()
+ if masks:
+ mask = masks[(page*4)/8]
+ if page % 2:
+ mask >>= 4
+ else:
+ mask &= 0xF
+ return mask
+
+ def countAvailSubpages(self, page, masks):
+ mask = self.getMaskForPage(page, masks)
+ cnt = 0
+ while mask:
+ if mask & 1:
+ cnt += 1
+ mask >>= 1
+ return cnt
+
+ def nextPage(self):
+ mask = 0
+ page = self.current_page
+ while mask == 0:
+ page += 1
+ if page > 9:
+ page = 0
+ mask = self.getMaskForPage(page)
+ self.numPressed(page)
+
+ def prevPage(self):
+ mask = 0
+ page = self.current_page
+ while mask == 0:
+ if page > 0:
+ page -= 1
+ else:
+ page = 9
+ mask = self.getMaskForPage(page)
+ self.numPressed(page)
+
+ def nextSubPage(self):
+ self.numPressed(self.current_page)
+
+ def prevSubPage(self):
+ num = self.current_page
+ mask = self.getMaskForPage(num)
+ cur_bit = 1 << self.current_subpage
+ tmp = cur_bit
+ while True:
+ if tmp == 1:
+ tmp = 8
+ else:
+ tmp >>= 1
+ if tmp == cur_bit: # no other subpage avail
+ return
+ if mask & tmp: # next subpage found
+ subpage = 0
+ while tmp > 1: # convert bit to subpage
+ subpage += 1
+ tmp >>= 1
+ self.current_subpage = subpage
+ self.showRassPage(num, subpage)
+ return
+
+ def numPressed(self, num):
+ mask = self.getMaskForPage(num)
+ if self.current_page == num:
+ self.skip = 0
+ cur_bit = 1 << self.current_subpage
+ tmp = cur_bit
+ else:
+ self.skip = 1
+ cur_bit = 16
+ tmp = 1
+ while True:
+ if not self.skip:
+ if tmp == 8 and cur_bit < 16:
+ tmp = 1
+ else:
+ tmp <<= 1
+ else:
+ self.skip = 0
+ if tmp == cur_bit: # no other subpage avail
+ return
+ if mask & tmp: # next subpage found
+ subpage = 0
+ while tmp > 1: # convert bit to subpage
+ subpage += 1
+ tmp >>= 1
+ self.current_subpage = subpage
+ self.showRassPage(num, subpage)
+ return