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