X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a092316126c54b280949644cd40691aaa591910f..92929c357751afc31f7f1acbe3e724bdf307cf23:/lib/python/Components/PerServiceDisplay.py diff --git a/lib/python/Components/PerServiceDisplay.py b/lib/python/Components/PerServiceDisplay.py index 55ef3d18..25a296f9 100644 --- a/lib/python/Components/PerServiceDisplay.py +++ b/lib/python/Components/PerServiceDisplay.py @@ -1,28 +1,52 @@ -from GUIComponent import * -from VariableText import * -from VariableValue import * +from GUIComponent import GUIComponent +from VariableText import VariableText +from VariableValue import VariableValue from enigma import iPlayableService from enigma import eLabel, eSlider, eTimer -class PerServiceBase(GUIComponent): - def __init__(self, navcore, eventmap): - GUIComponent.__init__(self) - self.eventmap = eventmap + +class PerServiceBase(object): + EventMap = { } + + @staticmethod + def event(ev): + func_list = PerServiceBase.EventMap.setdefault(ev, []) + for func in func_list: + if func[0]: # with_event + func[1](ev) + else: + func[1]() + + def __init__(self, navcore, eventmap, with_event=False): self.navcore = navcore - self.navcore.event.append(self.event) + self.eventmap = eventmap self.poll_timer = eTimer() - self.poll_timer.timeout.get().append(self.poll) - + self.with_event = with_event + + self.poll_timer.callback.append(self.poll) + + EventMap = PerServiceBase.EventMap + if not len(EventMap): + self.navcore.event.append(PerServiceBase.event) + + EventMap = EventMap.setdefault + for x in eventmap.iteritems(): + EventMap(x[0], []).append((with_event, x[1])) + # start with stopped state, so simulate that - self.event(iPlayableService.evEnd) + evEndEntry = eventmap.get(iPlayableService.evEnd) + if evEndEntry: + if with_event: + evEndEntry(iPlayableService.evEnd) + else: + evEndEntry() + + def destroy(self): + EventMap = PerServiceBase.EventMap.setdefault + for x in self.eventmap.iteritems(): + EventMap(x[0], []).remove((self.with_event, x[1])) - def event(self, ev): - # loop up if we need to handle this event - if self.eventmap.has_key(ev): - # call handler - self.eventmap[ev]() - def enablePolling(self, interval=60000): if interval: self.poll_timer.start(interval) @@ -35,21 +59,24 @@ class PerServiceBase(GUIComponent): def poll(self): pass -class PerServiceDisplay(PerServiceBase, VariableText): +class PerServiceDisplay(PerServiceBase, VariableText, GUIComponent): """Mixin for building components which display something which changes on navigation events, for example "service name" """ def __init__(self, navcore, eventmap): + GUIComponent.__init__(self) VariableText.__init__(self) PerServiceBase.__init__(self, navcore, eventmap) - def createWidget(self, parent): - # by default, we use a label to display our data. - g = eLabel(parent) - return g + def destroy(self): + PerServiceBase.destroy(self) + GUIComponent.destroy(self) + + GUI_WIDGET = eLabel -class PerServiceDisplayProgress(GUIComponent, VariableValue, PerServiceBase): +class PerServiceDisplayProgress(PerServiceBase, VariableValue, GUIComponent): def __init__(self, navcore, eventmap): GUIComponent.__init__(self) VariableValue.__init__(self) + PerServiceBase.__init__(self, navcore, eventmap) self.eventmap = eventmap self.navcore = navcore self.navcore.event.append(self.event) @@ -57,7 +84,8 @@ class PerServiceDisplayProgress(GUIComponent, VariableValue, PerServiceBase): # start with stopped state, so simulate that self.event(iPlayableService.evEnd) - def createWidget(self, parent): - # by default, we use a label to display our data. - self.g = eSlider(parent) - return self.g + GUI_WIDGET = eSlider + + def destroy(self): + PerServiceBase.destroy(self) + GUIComponent.destroy(self)