X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/9d3112aad388b4369a339b851aa2507a02bb2d4f..a7ed9db9532b7ac58dc3b923c0e3f9ee1789ddeb:/lib/python/Components/Element.py diff --git a/lib/python/Components/Element.py b/lib/python/Components/Element.py index baab4cfb..3297a4ad 100644 --- a/lib/python/Components/Element.py +++ b/lib/python/Components/Element.py @@ -8,13 +8,21 @@ 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 ElementError(Exception): + def __init__(self, message): + self.msg = message + + def __str__(self): + return self.msg + class Element(object): CHANGED_DEFAULT = 0 # initial "pull" state CHANGED_ALL = 1 # really everything changed @@ -22,9 +30,12 @@ class Element(object): CHANGED_SPECIFIC = 3 # second tuple will specify what exactly changed CHANGED_POLL = 4 # a timer expired + SINGLE_SOURCE = True + def __init__(self): self.downstream_elements = CList() self.master = None + self.sources = [ ] self.source = None self.__suspended = True self.cache = None @@ -35,7 +46,9 @@ class Element(object): self.master = downstream def connectUpstream(self, upstream): - assert self.source is None + assert not self.SINGLE_SOURCE or self.source is None + self.sources.append(upstream) + # self.source always refers to the last recent source added. self.source = upstream self.changed((self.CHANGED_DEFAULT,)) @@ -48,11 +61,17 @@ class Element(object): # we should not disconnect from upstream if # there are still elements depending on us. assert len(self.downstream_elements) == 0, "there are still downstream elements left" - + # Sources don't have a source themselves. don't do anything here. - if self.source is not None: - self.source.disconnectDownstream(self) - + for s in self.sources: + s.disconnectDownstream(self) + + if self.source: + # sources are owned by the Screen, so don't destroy them here. + self.destroy() + self.source = None + self.sources = [ ] + def disconnectDownstream(self, downstream): self.downstream_elements.remove(downstream) if self.master == downstream: @@ -67,10 +86,6 @@ class Element(object): self.downstream_elements.changed(*args, **kwargs) self.cache = None - def reconnectUpstream(self, new_upstream): - assert self.source is not None - self.source = new_upstream - def setSuspend(self, suspended): changed = self.__suspended != suspended if not self.__suspended and suspended: @@ -79,8 +94,9 @@ class Element(object): self.doSuspend(0) self.__suspended = suspended - if self.source is not None and changed: - self.source.checkSuspend() + if changed: + for s in self.sources: + s.checkSuspend() suspended = property(lambda self: self.__suspended, setSuspend) @@ -89,3 +105,6 @@ class Element(object): def doSuspend(self, suspend): pass + + def destroy(self): + pass