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"""
 class ServiceEventTracker:
        """Tracks service events into a screen"""
-       
+       InfoBarStack = [ ]
+       InfoBarStackSize = 0
+
        def __init__(self, screen, eventmap):
                self.__eventmap = eventmap
        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):
                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):
 
        def __event(self, ev):
+               set = ServiceEventTracker
+               ssize = set.InfoBarStackSize
+               stack = set.InfoBarStack
                if ev in self.__eventmap:
                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.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
 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)
 
                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" />
        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)
                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)
                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.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
 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)
 
                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
        
        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)
 
        def __init__(self, session, args = None):
                Screen.__init__(self, session)
+               InfoBarBase.__init__(self)
                InfoBarNotifications.__init__(self)
                InfoBarCueSheetSupport.__init__(self, actionmap = "MediaPlayerCueSheetActions")
                InfoBarShowHide.__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.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
 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)
 
                        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
 
        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)
                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()
                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.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
 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)
 
                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)
        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)
 
                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
 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
 
 
 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,
        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)
 
        def __init__(self, session):
                Screen.__init__(self, session)
-
                self["actions"] = HelpableActionMap(self, "InfobarActions",
                        {
                                "showMovies": (self.showMovies, _("Play recorded movies...")),
                self["actions"] = HelpableActionMap(self, "InfobarActions",
                        {
                                "showMovies": (self.showMovies, _("Play recorded movies...")),
@@ -52,7 +51,7 @@ class InfoBar(InfoBarShowHide,
                        }, prio=2)
                
                for x in HelpableScreen, \
                        }, prio=2)
                
                for x in HelpableScreen, \
-                               InfoBarShowHide, \
+                               InfoBarBase, InfoBarShowHide, \
                                InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder, \
                                InfoBarInstantRecord, InfoBarAudioSelection, \
                                InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarSubserviceSelection, \
                                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)
 
                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,
                InfoBarMenu, \
                InfoBarSeek, InfoBarShowMovies, InfoBarAudioSelection, HelpableScreen, InfoBarNotifications,
                InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView,
@@ -137,7 +136,7 @@ class MoviePlayer(InfoBarShowHide, \
                        })
                
                for x in HelpableScreen, InfoBarShowHide, InfoBarMenu, \
                        })
                
                for x in HelpableScreen, InfoBarShowHide, InfoBarMenu, \
-                               InfoBarSeek, InfoBarShowMovies, \
+                               InfoBarBase, InfoBarSeek, InfoBarShowMovies, \
                                InfoBarAudioSelection, InfoBarNotifications, InfoBarSimpleEventView, \
                                InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, \
                                InfoBarMoviePlayerSummarySupport, InfoBarSubtitleSupport, \
                                InfoBarAudioSelection, InfoBarNotifications, InfoBarSimpleEventView, \
                                InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, \
                                InfoBarMoviePlayerSummarySupport, InfoBarSubtitleSupport, \