add disconnect to elements, and disconnect renderer from sources on screen close
[vuplus_dvbapp] / lib / python / Screens / Screen.py
1 from Components.HTMLSkin import *
2 from Components.GUISkin import *
3
4 import sys
5
6 class Screen(dict, HTMLSkin, GUISkin):
7         """ bla """
8
9         def __init__(self, session):
10                 self.skinName = self.__class__.__name__
11                 self.session = session
12                 GUISkin.__init__(self)
13                 
14                 self.onClose = [ ]
15                 self.onExecBegin = [ ]
16                 self.onShown = [ ]
17                 
18                 self.onShow = [ ]
19                 self.onHide = [ ]
20                 
21                 self.execing = False
22                 self.shown = False
23                 
24                 # in order to support screens *without* a help,
25                 # we need the list in every screen. how ironic.
26                 self.helpList = [ ]
27                 
28         def execBegin(self):
29                 self.active_components = [ ]
30                 for x in self.onExecBegin:
31                         x()
32                         if self.session.current_dialog != self:
33                                 return
34
35 #               assert self.session == None, "a screen can only exec once per time"
36 #               self.session = session
37
38                 for val in self.values() + self.renderer:
39                         val.execBegin()
40                         if self.session.current_dialog != self:
41                                 return
42                         self.active_components.append(val)
43
44                 self.execing = True
45         
46                 for x in self.onShown:
47                         x()
48         
49         def execEnd(self):
50 #               for (name, val) in self.items():
51                 for val in self.active_components:
52                         val.execEnd()
53                 del self.active_components
54 #               assert self.session != None, "execEnd on non-execing screen!"
55 #               self.session = None
56                 self.execing = False
57         
58         # never call this directly - it will be called from the session!
59         def doClose(self):
60                 self.hide()
61                 for x in self.onClose:
62                         x()
63                 
64                 # fixup circular references
65                 del self.helpList
66                 GUISkin.close(self)
67
68                 # first disconnect all render from their sources.
69                 # we might split this out into a "unskin"-call,
70                 # but currently we destroy the screen afterwards
71                 # anyway.
72                 for val in self.renderer:
73                         val.disconnectAll()  # disconnected converter/sources and probably destroy them
74                 
75                 del self.session
76                 for (name, val) in self.items():
77                         val.destroy()
78                         del self[name]
79                 
80                 for val in self.renderer:
81                         val.destroy()
82                 
83                 self.renderer = [ ]
84                 
85                 # really delete all elements now
86                 self.__dict__.clear()
87         
88         def close(self, *retval):
89                 self.session.close(self, *retval)
90
91         def setFocus(self, o):
92                 self.instance.setFocus(o.instance)
93
94         def show(self):
95                 if self.shown:
96                         return
97                 self.shown = True
98                 self.instance.show()
99                 for x in self.onShow:
100                         x()
101                 for val in self.values() + self.renderer:
102                         if isinstance(val, GUIComponent):
103                                 val.onShow()
104
105         def hide(self):
106                 if not self.shown:
107                         return
108                 self.shown = False
109                 self.instance.hide()
110                 for x in self.onHide:
111                         x()
112                 for val in self.values() + self.renderer:
113                         if isinstance(val, GUIComponent):
114                                 val.onHide()