1 from Tools.Profile import profile
3 profile("LOAD:GUISkin")
4 from Components.GUISkin import GUISkin
6 from Components.Sources.Source import Source
7 profile("LOAD:GUIComponent")
8 from Components.GUIComponent import GUIComponent
9 profile("LOAD:eRCInput")
10 from enigma import eRCInput
12 class Screen(dict, GUISkin):
14 False, SUSPEND_STOPS, SUSPEND_PAUSES = range(3)
19 def __init__(self, session, parent = None):
21 self.skinName = self.__class__.__name__
22 self.session = session
24 GUISkin.__init__(self)
27 self.onFirstExecBegin = [ ]
28 self.onExecBegin = [ ]
37 # already shown is false until the screen is really shown (after creation)
38 self.already_shown = False
42 # in order to support screens *without* a help,
43 # we need the list in every screen. how ironic.
46 self.close_on_next_exec = None
48 # stand alone screens (for example web screens)
49 # don't care about having or not having focus.
50 self.stand_alone = False
52 self.onShow.append(self.saveKeyboardMode)
53 self.onHide.append(self.restoreKeyboardMode)
54 self.keyboardMode = None
56 def saveKeyboardMode(self):
57 rcinput = eRCInput.getInstance()
58 self.keyboardMode = rcinput.getKeyboardMode()
60 def setKeyboardModeAscii(self):
61 rcinput = eRCInput.getInstance()
62 rcinput.setKeyboardMode(rcinput.kmAscii)
64 def setKeyboardModeNone(self):
65 rcinput = eRCInput.getInstance()
66 rcinput.setKeyboardMode(rcinput.kmNone)
68 def restoreKeyboardMode(self):
69 rcinput = eRCInput.getInstance()
70 if self.keyboardMode is not None:
71 rcinput.setKeyboardMode(self.keyboardMode)
74 self.active_components = [ ]
75 if self.close_on_next_exec is not None:
76 tmp = self.close_on_next_exec
77 self.close_on_next_exec = None
81 single = self.onFirstExecBegin
82 self.onFirstExecBegin = []
83 for x in self.onExecBegin + single:
85 if not self.stand_alone and self.session.current_dialog != self:
88 # assert self.session == None, "a screen can only exec once per time"
89 # self.session = session
91 for val in self.values() + self.renderer:
93 if not self.stand_alone and self.session.current_dialog != self:
95 self.active_components.append(val)
99 for x in self.onShown:
103 active_components = self.active_components
104 # for (name, val) in self.items():
105 self.active_components = None
106 for val in active_components:
108 # assert self.session != None, "execEnd on non-execing screen!"
109 # self.session = None
112 # never call this directly - it will be called from the session!
115 for x in self.onClose:
118 # fixup circular references
122 # first disconnect all render from their sources.
123 # we might split this out into a "unskin"-call,
124 # but currently we destroy the screen afterwards
126 for val in self.renderer:
127 val.disconnectAll() # disconnected converter/sources and probably destroy them. Sources will not be destroyed.
130 for (name, val) in self.items():
136 # really delete all elements now
137 self.__dict__.clear()
139 def close(self, *retval):
141 self.close_on_next_exec = retval
143 self.session.close(self, *retval)
145 def setFocus(self, o):
146 self.instance.setFocus(o.instance)
149 if (self.shown and self.already_shown) or not self.instance:
152 self.already_shown = True
154 for x in self.onShow:
156 for val in self.values() + self.renderer:
157 if isinstance(val, GUIComponent) or isinstance(val, Source):
161 if not self.shown or not self.instance:
165 for x in self.onHide:
167 for val in self.values() + self.renderer:
168 if isinstance(val, GUIComponent) or isinstance(val, Source):
172 return str(type(self))
174 def getRelatedScreen(self, name):
175 if name == "session":
176 return self.session.screen
177 elif name == "parent":
179 elif name == "global":
180 return self.global_screen