deliver service events only to last created class which is based on
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Tue, 22 Apr 2008 16:30:20 +0000 (16:30 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Tue, 22 Apr 2008 16:30:20 +0000 (16:30 +0000)
InfoBarBase

lib/python/Components/ServiceEventTracker.py
lib/python/Plugins/Extensions/CutListEditor/plugin.py
lib/python/Plugins/Extensions/DVDPlayer/plugin.py
lib/python/Plugins/Extensions/MediaPlayer/plugin.py
lib/python/Screens/ChannelSelection.py
lib/python/Screens/InfoBar.py

index 204604368a400960ceccf4e514a1bae1fe13921c..89c339f8543b7e9bdacf389dd03b5f2936d3bf46 100644 (file)
@@ -1,15 +1,49 @@
+class InfoBarBase:
+       def __init__(self):
+               ServiceEventTracker.setActiveInfoBar(self)
+               self.onClose.append(self.__close)
+
+       def __close(self):
+               ServiceEventTracker.popActiveInfoBar()
+
 class ServiceEventTracker:
        """Tracks service events into a screen"""
-       
+       InfoBarStack = [ ]
+       InfoBarStackSize = 0
+
        def __init__(self, screen, eventmap):
                self.__eventmap = eventmap
-               self.session = screen.session
-               self.session.nav.event.append(self.__event)
+               self.screen = screen
+               screen.session.nav.event.append(self.__event)
                screen.onClose.append(self.__del_event)
 
        def __del_event(self):
-               self.session.nav.event.remove(self.__event)
+               self.screen.session.nav.event.remove(self.__event)
 
        def __event(self, ev):
+               set = ServiceEventTracker
+               ssize = set.InfoBarStackSize
+               stack = set.InfoBarStack
                if ev in self.__eventmap:
-                       self.__eventmap[ev]()
+                       if not isinstance(self.screen, InfoBarBase) or (ssize and stack[ssize-1] == self.screen):
+                               self.__eventmap[ev]()
+#                      else:
+#                              print "ignore event", ev, "for inactive infobar '" + str(self.screen) + "'"
+
+       @staticmethod
+       def setActiveInfoBar(infobar):
+               set = ServiceEventTracker
+               assert infobar not in set.InfoBarStack, "FATAL: Infobar '" + str(infobar) + "' is already active!"
+               set.InfoBarStack.append(infobar)
+               set.InfoBarStackSize += 1
+#              print "ServiceEventTracker set active '" + str(infobar) + "'"
+
+       @staticmethod
+       def popActiveInfoBar():
+               set = ServiceEventTracker
+               stack = set.InfoBarStack
+               if set.InfoBarStackSize:
+                       set.InfoBarStackSize -= 1
+                       del stack[set.InfoBarStackSize]
+#                      if set.InfoBarStackSize:
+#                              print "ServiceEventTracker reset active '" + str(stack[set.InfoBarStackSize-1]) + "'"
index 4cbb8930f30ee81792fdb6b3d2716339f33ef9da..61acf042e8fe1265c28e3005356c6f06c1884b4c 100644 (file)
@@ -5,7 +5,7 @@ from Screens.MessageBox import MessageBox
 from Components.ServicePosition import ServicePositionGauge
 from Components.ActionMap import HelpableActionMap
 from Components.MultiContent import MultiContentEntryText
-from Components.ServiceEventTracker import ServiceEventTracker
+from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
 from Components.VideoWindow import VideoWindow
 from Screens.InfoBarGenerics import InfoBarSeek, InfoBarCueSheetSupport
 from Components.GUIComponent import GUIComponent
@@ -144,7 +144,7 @@ class CutList(GUIComponent):
                if self.instance is not None:
                        self.instance.moveSelectionTo(index)
 
-class CutListEditor(Screen, InfoBarSeek, InfoBarCueSheetSupport, HelpableScreen):
+class CutListEditor(Screen, InfoBarBase, InfoBarSeek, InfoBarCueSheetSupport, HelpableScreen):
        skin = """
        <screen position="0,0" size="720,576" title="Cutlist editor" flags="wfNoBorder">
                <eLabel text="Cutlist editor" position="65,60" size="300,25" font="Regular;20" />
@@ -171,6 +171,7 @@ class CutListEditor(Screen, InfoBarSeek, InfoBarCueSheetSupport, HelpableScreen)
                Screen.__init__(self, session)
                InfoBarSeek.__init__(self, actionmap = "CutlistSeekActions")
                InfoBarCueSheetSupport.__init__(self)
+               InfoBarBase.__init__(self)
                HelpableScreen.__init__(self)
                self.old_service = session.nav.getCurrentlyPlayingServiceReference()
                session.nav.playService(service)
index 3ecd9f8a6dea5c545cf9729b6a8a16ecc53e17aa..fd04869536181f3f8a31591ff6777ef99501bb82 100644 (file)
@@ -10,7 +10,7 @@ from Screens.InfoBarGenerics import InfoBarSeek, InfoBarPVRState, InfoBarCueShee
 from Components.ActionMap import ActionMap, NumberActionMap, HelpableActionMap
 from Components.Label import Label
 from Components.FileList import FileList
-from Components.ServiceEventTracker import ServiceEventTracker
+from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
 from Components.config import config
 from Components.ProgressBar import ProgressBar
 from ServiceReference import ServiceReference
@@ -147,7 +147,7 @@ class ChapterZap(Screen):
                self.Timer.callback.append(self.keyOK)
                self.Timer.start(3000, True)
 
-class DVDPlayer(Screen, InfoBarNotifications, InfoBarSeek, InfoBarCueSheetSupport, InfoBarPVRState, InfoBarShowHide, HelpableScreen):
+class DVDPlayer(Screen, InfoBarBase, InfoBarNotifications, InfoBarSeek, InfoBarCueSheetSupport, InfoBarPVRState, InfoBarShowHide, HelpableScreen):
        ALLOW_SUSPEND = True
        ENABLE_RESUME_SUPPORT = True
        
@@ -220,6 +220,7 @@ class DVDPlayer(Screen, InfoBarNotifications, InfoBarSeek, InfoBarCueSheetSuppor
 
        def __init__(self, session, args = None):
                Screen.__init__(self, session)
+               InfoBarBase.__init__(self)
                InfoBarNotifications.__init__(self)
                InfoBarCueSheetSupport.__init__(self, actionmap = "MediaPlayerCueSheetActions")
                InfoBarShowHide.__init__(self)
index 68645842ecc7a06f8bf6bd3f28c7c2577676bc44..93765628fa81126d725c5fca45f6c42d3e81a458 100644 (file)
@@ -12,7 +12,7 @@ from Components.FileList import FileList
 from Components.MediaPlayer import PlayList
 from Tools.Directories import resolveFilename, SCOPE_CONFIG, SCOPE_PLAYLIST, SCOPE_SKIN_IMAGE
 from Components.ServicePosition import ServicePositionGauge
-from Components.ServiceEventTracker import ServiceEventTracker
+from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
 from Components.Playlist import PlaylistIOInternal, PlaylistIOM3U, PlaylistIOPLS
 from Screens.InfoBarGenerics import InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications
 from ServiceReference import ServiceReference
@@ -42,7 +42,7 @@ class MediaPixmap(Pixmap):
                        self.default_pixmap = resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/no_coverArt.png")
                return Pixmap.applySkin(self, desktop)
 
-class MediaPlayer(Screen, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, HelpableScreen):
+class MediaPlayer(Screen, InfoBarBase, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSupport, InfoBarNotifications, HelpableScreen):
        ALLOW_SUSPEND = True
        ENABLE_RESUME_SUPPORT = True
 
@@ -51,6 +51,7 @@ class MediaPlayer(Screen, InfoBarSeek, InfoBarAudioSelection, InfoBarCueSheetSup
                InfoBarAudioSelection.__init__(self)
                InfoBarCueSheetSupport.__init__(self, actionmap = "MediaPlayerCueSheetActions")
                InfoBarNotifications.__init__(self)
+               InfoBarBase.__init__(self)
                HelpableScreen.__init__(self)
                self.summary = None
                self.oldService = self.session.nav.getCurrentlyPlayingServiceReference()
index eb372c7aff7e8f0403de373121fd7d38014ae869..1e7f9f2a93efbb7c874048dd7d435db464978b81 100644 (file)
@@ -5,7 +5,7 @@ from Components.Button import Button
 from Components.ServiceList import ServiceList
 from Components.ActionMap import NumberActionMap, ActionMap, HelpableActionMap
 from Components.MenuList import MenuList
-from Components.ServiceEventTracker import ServiceEventTracker
+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
@@ -1322,13 +1322,14 @@ class RadioInfoBar(Screen):
                Screen.__init__(self, session)
                self["RdsDecoder"] = RdsDecoder(self.session.nav)
 
-class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG):
+class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelectionEPG, InfoBarBase):
        ALLOW_SUSPEND = True
 
        def __init__(self, session, infobar):
                ChannelSelectionBase.__init__(self, session)
                ChannelSelectionEdit.__init__(self)
                ChannelSelectionEPG.__init__(self)
+               InfoBarBase.__init__(self)
                self.infobar = infobar
                self.onLayoutFinish.append(self.onCreate)
 
index ad38f46ab5ec286b567db1170f54f0268fb03477..99979b13b8e3a3eaa3d9d0af9da5bd92e82046d1 100644 (file)
@@ -25,12 +25,12 @@ from Screens.InfoBarGenerics import InfoBarShowHide, \
 profile("LOAD:InitBar_Components")
 from Components.ActionMap import HelpableActionMap
 from Components.config import config
-from Components.ServiceEventTracker import ServiceEventTracker
+from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
 
 profile("LOAD:HelpableScreen")
 from Screens.HelpMenu import HelpableScreen
 
-class InfoBar(InfoBarShowHide,
+class InfoBar(InfoBarBase, InfoBarShowHide,
        InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder,
        InfoBarInstantRecord, InfoBarAudioSelection, 
        HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish,
@@ -43,7 +43,6 @@ class InfoBar(InfoBarShowHide,
 
        def __init__(self, session):
                Screen.__init__(self, session)
-
                self["actions"] = HelpableActionMap(self, "InfobarActions",
                        {
                                "showMovies": (self.showMovies, _("Play recorded movies...")),
@@ -52,7 +51,7 @@ class InfoBar(InfoBarShowHide,
                        }, prio=2)
                
                for x in HelpableScreen, \
-                               InfoBarShowHide, \
+                               InfoBarBase, InfoBarShowHide, \
                                InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder, \
                                InfoBarInstantRecord, InfoBarAudioSelection, \
                                InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarSubserviceSelection, \
@@ -118,7 +117,7 @@ class InfoBar(InfoBarShowHide,
                if service is not None:
                        self.session.open(MoviePlayer, service)
 
-class MoviePlayer(InfoBarShowHide, \
+class MoviePlayer(InfoBarBase, InfoBarShowHide, \
                InfoBarMenu, \
                InfoBarSeek, InfoBarShowMovies, InfoBarAudioSelection, HelpableScreen, InfoBarNotifications,
                InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView,
@@ -137,7 +136,7 @@ class MoviePlayer(InfoBarShowHide, \
                        })
                
                for x in HelpableScreen, InfoBarShowHide, InfoBarMenu, \
-                               InfoBarSeek, InfoBarShowMovies, \
+                               InfoBarBase, InfoBarSeek, InfoBarShowMovies, \
                                InfoBarAudioSelection, InfoBarNotifications, InfoBarSimpleEventView, \
                                InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, \
                                InfoBarMoviePlayerSummarySupport, InfoBarSubtitleSupport, \