From bcbd5801c2be23b2ee1a22e7b088fc2fb654f1c9 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Fri, 27 Jun 2008 14:43:24 +0000 Subject: [PATCH] some cleanups, add missing destroy calls, fix incomplete destroy calls, small speedup --- lib/python/Components/Element.py | 9 +++--- lib/python/Components/PerServiceDisplay.py | 15 ++++++++-- lib/python/Components/ServiceEventTracker.py | 21 ++++++------- lib/python/Components/ServicePosition.py | 4 +++ lib/python/Components/Sources/Boolean.py | 1 + lib/python/Components/Sources/Clock.py | 1 + .../Components/Sources/CurrentService.py | 5 ++++ lib/python/Components/Sources/EventInfo.py | 5 ++++ lib/python/Components/Sources/FrontendInfo.py | 30 +++++++++++++++++-- .../Components/Sources/FrontendStatus.py | 1 + lib/python/Components/Sources/RdsDecoder.py | 4 +++ lib/python/Screens/InfoBarGenerics.py | 16 +++++----- lib/python/Screens/Screen.py | 5 ++-- lib/python/Screens/SessionGlobals.py | 15 +--------- 14 files changed, 89 insertions(+), 43 deletions(-) diff --git a/lib/python/Components/Element.py b/lib/python/Components/Element.py index 437d934b..2af57793 100644 --- a/lib/python/Components/Element.py +++ b/lib/python/Components/Element.py @@ -8,11 +8,12 @@ from Tools.CList import CList def cached(f): name = f.__name__ def wrapper(self): - if self.cache is None: + cache = self.cache + if cache is None: return f(self) - if name not in self.cache: - self.cache[name] = (True, f(self)) - return self.cache[name][1] + if name not in cache: + cache[name] = (True, f(self)) + return cache[name][1] return wrapper class Element(object): diff --git a/lib/python/Components/PerServiceDisplay.py b/lib/python/Components/PerServiceDisplay.py index 2d0a71e7..cb86bd84 100644 --- a/lib/python/Components/PerServiceDisplay.py +++ b/lib/python/Components/PerServiceDisplay.py @@ -22,12 +22,13 @@ class PerServiceBase(object): def event_callback(self, ev): # loop up if we need to handle this event - if self.eventmap.has_key(ev): + func = self.eventmap.get(ev) + if func: # call handler if self.with_event: - self.eventmap[ev](ev) + func(ev) else: - self.eventmap[ev]() + func() def enablePolling(self, interval=60000): if interval: @@ -48,6 +49,10 @@ class PerServiceDisplay(PerServiceBase, VariableText, GUIComponent): VariableText.__init__(self) PerServiceBase.__init__(self, navcore, eventmap) + def destroy(self): + PerServiceBase.destroy(self) + GUIComponent.destroy(self) + GUI_WIDGET = eLabel class PerServiceDisplayProgress(PerServiceBase, VariableValue, GUIComponent): @@ -63,3 +68,7 @@ class PerServiceDisplayProgress(PerServiceBase, VariableValue, GUIComponent): self.event(iPlayableService.evEnd) GUI_WIDGET = eSlider + + def destroy(self): + PerServiceBase.destroy(self) + GUIComponent.destroy(self) diff --git a/lib/python/Components/ServiceEventTracker.py b/lib/python/Components/ServiceEventTracker.py index 1c42ecc8..265d566e 100644 --- a/lib/python/Components/ServiceEventTracker.py +++ b/lib/python/Components/ServiceEventTracker.py @@ -26,22 +26,23 @@ class ServiceEventTracker: self.screen.session.nav.event.remove(self.__event) def __event(self, ev): - set = ServiceEventTracker - screen = self.screen - nav = screen.session.nav - cur_ref = nav.getCurrentlyPlayingServiceReference() - old_service_running = set.oldRef and cur_ref and cur_ref == set.oldRef and set.oldService and set.oldService == str(nav.getCurrentService()) - if not old_service_running: - set.oldService = None - set.oldRef = None + func = self.__eventmap.get(ev) + if func: + set = ServiceEventTracker + screen = self.screen + nav = screen.session.nav + cur_ref = nav.getCurrentlyPlayingServiceReference() + old_service_running = set.oldRef and cur_ref and cur_ref == set.oldRef and set.oldService and set.oldService == str(nav.getCurrentService()) + if not old_service_running: + set.oldService = None + set.oldRef = None # print "old_service_running", old_service_running - if ev in self.__eventmap: ssize = set.InfoBarStackSize stack = set.InfoBarStack if (not isinstance(screen, InfoBarBase) or # let pass all events to screens not derived from InfoBarBase (not old_service_running and ssize and stack[ssize-1] == screen) or # let pass events from currently running service just to current active screen (derived from InfoBarBase) (old_service_running and ssize > 1 and stack[ssize-2] == screen)): # let pass events from old running service just to previous active screen (derived from InfoBarBase) - self.__eventmap[ev]() + func() # else: # print "ignore event", ev, "for inactive infobar '" + str(self.screen) + "'" diff --git a/lib/python/Components/ServicePosition.py b/lib/python/Components/ServicePosition.py index 985f8841..b4964250 100644 --- a/lib/python/Components/ServicePosition.py +++ b/lib/python/Components/ServicePosition.py @@ -164,3 +164,7 @@ class ServicePositionGauge(PerServiceBase, GUIComponent): self.instance.setSeekPosition(pos) seek_pointer_position = property(getSeekPosition, setSeekPosition) + + def destroy(self): + PerServiceBase.destroy(self) + GUIComponent.destroy(self) diff --git a/lib/python/Components/Sources/Boolean.py b/lib/python/Components/Sources/Boolean.py index c92027ae..212d2198 100644 --- a/lib/python/Components/Sources/Boolean.py +++ b/lib/python/Components/Sources/Boolean.py @@ -41,3 +41,4 @@ class Boolean(Source, object): def destroy(self): if self.poll_timer: self.poll_timer.callback.remove(self.poll) + Source.destroy(self) diff --git a/lib/python/Components/Sources/Clock.py b/lib/python/Components/Sources/Clock.py index 5130b21d..ba672825 100644 --- a/lib/python/Components/Sources/Clock.py +++ b/lib/python/Components/Sources/Clock.py @@ -29,3 +29,4 @@ class Clock(Source): def destroy(self): self.clock_timer.callback.remove(self.poll) + Source.destroy(self) diff --git a/lib/python/Components/Sources/CurrentService.py b/lib/python/Components/Sources/CurrentService.py index acc624a2..2501c176 100644 --- a/lib/python/Components/Sources/CurrentService.py +++ b/lib/python/Components/Sources/CurrentService.py @@ -27,3 +27,8 @@ class CurrentService(PerServiceBase, Source): return self.navcore.getCurrentService() service = property(getCurrentService) + + def destroy(self): + PerServiceBase.destroy(self) + Source.destroy(self) + diff --git a/lib/python/Components/Sources/EventInfo.py b/lib/python/Components/Sources/EventInfo.py index f3fd6e88..5af0bf97 100644 --- a/lib/python/Components/Sources/EventInfo.py +++ b/lib/python/Components/Sources/EventInfo.py @@ -35,3 +35,8 @@ class EventInfo(PerServiceBase, Source, object): self.changed((self.CHANGED_CLEAR,)) else: self.changed((self.CHANGED_ALL,)) + + def destroy(self): + PerServiceBase.destroy(self) + Source.destroy(self) + diff --git a/lib/python/Components/Sources/FrontendInfo.py b/lib/python/Components/Sources/FrontendInfo.py index 142573c9..bcca7c3d 100644 --- a/lib/python/Components/Sources/FrontendInfo.py +++ b/lib/python/Components/Sources/FrontendInfo.py @@ -1,12 +1,27 @@ +from enigma import iPlayableService from Source import Source +from Components.PerServiceDisplay import PerServiceBase -class FrontendInfo(Source): - def __init__(self, service_source = None, frontend_source = None): +class FrontendInfo(Source, PerServiceBase): + def __init__(self, service_source = None, frontend_source = None, navcore = None): + self.navcore = None Source.__init__(self) + if navcore: + PerServiceBase.__init__(self, navcore, + { + iPlayableService.evTunedIn: self.updateFrontendData, + iPlayableService.evEnd: self.serviceEnd + }) self.service_source = service_source self.frontend_source = frontend_source self.updateFrontendData() + def serviceEnd(self): +# import pdb +# pdb.set_trace() + self.slot_number = self.frontend_type = None + self.changed((self.CHANGED_CLEAR, )) + def updateFrontendData(self): data = self.getFrontendData() if not data: @@ -24,8 +39,17 @@ class FrontendInfo(Source): frontend.getFrontendData(dict) return dict elif self.service_source: - service = self.service_source() + service = self.navcore and self.service_source() + feinfo = service and service.frontendInfo() + return feinfo and feinfo.getFrontendData() + elif self.navcore: + service = self.navcore.getCurrentService() feinfo = service and service.frontendInfo() return feinfo and feinfo.getFrontendData() else: return None + + def destroy(self): + if not self.frontend_source and not self.service_source: + PerServiceBase.destroy(self) + Source.destroy(self) diff --git a/lib/python/Components/Sources/FrontendStatus.py b/lib/python/Components/Sources/FrontendStatus.py index 3e469e0d..821c9f12 100644 --- a/lib/python/Components/Sources/FrontendStatus.py +++ b/lib/python/Components/Sources/FrontendStatus.py @@ -49,4 +49,5 @@ class FrontendStatus(Source): def destroy(self): self.poll_timer.callback.remove(self.updateFrontendStatus) + Source.destroy(self) diff --git a/lib/python/Components/Sources/RdsDecoder.py b/lib/python/Components/Sources/RdsDecoder.py index 886f81f6..3ec9a25d 100644 --- a/lib/python/Components/Sources/RdsDecoder.py +++ b/lib/python/Components/Sources/RdsDecoder.py @@ -27,3 +27,7 @@ class RdsDecoder(PerServiceBase, Source, object): self.changed((self.CHANGED_CLEAR,)) else: self.changed((self.CHANGED_SPECIFIC, what)) + + def destroy(self): + PerServiceBase.destroy(self) + Source.destroy(self) diff --git a/lib/python/Screens/InfoBarGenerics.py b/lib/python/Screens/InfoBarGenerics.py index e7f71daf..2227f8b9 100644 --- a/lib/python/Screens/InfoBarGenerics.py +++ b/lib/python/Screens/InfoBarGenerics.py @@ -1619,16 +1619,18 @@ class InfoBarSubserviceSelection: }, -1) self["SubserviceQuickzapAction"].setEnabled(False) - self.session.nav.event.append(self.checkSubservicesAvail) # we like to get service events + self.__event_tracker = ServiceEventTracker(screen=self, eventmap= + { + iPlayableService.evUpdatedInfo: self.checkSubservicesAvail + }) self.bsel = None - def checkSubservicesAvail(self, ev): - if ev == iPlayableService.evUpdatedEventInfo: - service = self.session.nav.getCurrentService() - subservices = service and service.subServices() - if not subservices or subservices.getNumberOfSubservices() == 0: - self["SubserviceQuickzapAction"].setEnabled(False) + def checkSubservicesAvail(self): + service = self.session.nav.getCurrentService() + subservices = service and service.subServices() + if not subservices or subservices.getNumberOfSubservices() == 0: + self["SubserviceQuickzapAction"].setEnabled(False) def nextSubservice(self): self.changeSubservice(+1) diff --git a/lib/python/Screens/Screen.py b/lib/python/Screens/Screen.py index 508309db..287847ba 100644 --- a/lib/python/Screens/Screen.py +++ b/lib/python/Screens/Screen.py @@ -75,10 +75,11 @@ class Screen(dict, GUISkin): x() def execEnd(self): + active_components = self.active_components # for (name, val) in self.items(): - for val in self.active_components: + self.active_components = None + for val in active_components: val.execEnd() - del self.active_components # assert self.session != None, "execEnd on non-execing screen!" # self.session = None self.execing = False diff --git a/lib/python/Screens/SessionGlobals.py b/lib/python/Screens/SessionGlobals.py index a9636cac..d65acb4d 100644 --- a/lib/python/Screens/SessionGlobals.py +++ b/lib/python/Screens/SessionGlobals.py @@ -1,4 +1,3 @@ -from enigma import iPlayableService from Screens.Screen import Screen from Components.Sources.CurrentService import CurrentService from Components.Sources.EventInfo import EventInfo @@ -16,20 +15,8 @@ class SessionGlobals(Screen): self["Event_Now"] = EventInfo(session.nav, EventInfo.NOW) self["Event_Next"] = EventInfo(session.nav, EventInfo.NEXT) self["FrontendStatus"] = FrontendStatus(service_source = session.nav.getCurrentService) - self["FrontendInfo"] = FrontendInfo(service_source = session.nav.getCurrentService) + self["FrontendInfo"] = FrontendInfo(navcore = session.nav) self["VideoPicture"] = Source() self["TunerInfo"] = TunerInfo() self["RecordState"] = RecordState(session) - session.nav.event.append(self.serviceEvent) - self.service_state = 0 - FrontpanelLed().connect(self["RecordState"]) - - def serviceEvent(self, evt): - if evt == iPlayableService.evStart: - self.service_state = 1 - elif evt == iPlayableService.evEnd: - self.service_state = 0 - elif evt == iPlayableService.evUpdatedInfo and self.service_state == 1: - self.service_state = 2 - self["FrontendInfo"].updateFrontendData() -- 2.30.2