add disconnect to elements, and disconnect renderer from sources on screen close
authorFelix Domke <tmbinc@elitedvb.net>
Sun, 25 Jun 2006 21:23:19 +0000 (21:23 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Sun, 25 Jun 2006 21:23:19 +0000 (21:23 +0000)
lib/python/Components/Element.py
lib/python/Screens/Screen.py

index 6f812b207a6f9a4d7b5e0849c0068dd214ea18f3..fc709139eb8802e6c9bb5b6320e71fca4801fffd 100644 (file)
@@ -25,6 +25,24 @@ class Element:
                self.connectUpstream(upstream)
                upstream.connectDownstream(self)
 
                self.connectUpstream(upstream)
                upstream.connectDownstream(self)
 
+       # we disconnect from down to up
+       def disconnectAll(self):
+               # 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"
+               
+               # disconnect all upstream elements from us
+               for upstream in self.upstream_elements:
+                       upstream.disconnectDownstream(self)
+       
+       def disconnectDownstream(self, downstream):
+               self.downstream_elements.remove(downstream)
+               if self.master == downstream:
+                       self.master = None
+               
+               if len(self.downstream_elements) == 0:
+                       self.disconnectAll()
+
        # default action: push downstream
        def changed(self):
                self.downstream_elements.changed()
        # default action: push downstream
        def changed(self):
                self.downstream_elements.changed()
index bbc6b1ec128bc7cd24449a96fc17d371db1f57a8..5f1cf6d610193b848db2aba773613a11ff83ce87 100644 (file)
@@ -64,6 +64,13 @@ class Screen(dict, HTMLSkin, GUISkin):
                # fixup circular references
                del self.helpList
                GUISkin.close(self)
                # fixup circular references
                del self.helpList
                GUISkin.close(self)
+
+               # first disconnect all render from their sources.
+               # we might split this out into a "unskin"-call,
+               # but currently we destroy the screen afterwards
+               # anyway.
+               for val in self.renderer:
+                       val.disconnectAll()  # disconnected converter/sources and probably destroy them
                
                del self.session
                for (name, val) in self.items():
                
                del self.session
                for (name, val) in self.items():