1 from Tools import RedirectOutput
5 from Components.Language import language
9 from Screens.SimpleSummary import SimpleSummary
14 import ServiceReference
16 from Navigation import Navigation
18 from skin import readSkin, applyAllAttributes
20 from Components.config import configfile
21 from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS
23 eDVBDB.getInstance().reloadBouquets()
29 from twisted.internet import reactor
34 print "twisted not available"
38 # initialize autorun plugins and plugin menu entries
39 from Components.PluginComponent import plugins
41 from Screens.Wizard import wizardManager
42 from Screens.StartWizard import *
43 from Screens.TutorialWizard import *
44 from Tools.BoundFunction import boundFunction
45 from Plugins.Plugin import PluginDescriptor
49 def dump(dir, p = ""):
50 if isinstance(dir, dict):
51 for (entry, val) in dir.items():
52 dump(val, p + "(dict)/" + entry)
53 if hasattr(dir, "__dict__"):
54 for name, value in dir.__dict__.items():
55 if not had.has_key(str(value)):
57 dump(value, p + "/" + str(name))
59 print p + "/" + str(name) + ":" + str(dir.__class__) + "(cycle)"
61 print p + ":" + str(dir)
63 # + ":" + str(dir.__class__)
68 def create(self, screen): pass
72 class HTMLOutputDevice(OutputDevice):
73 def create(self, comp):
74 print comp.produceHTML()
76 html = HTMLOutputDevice()
78 class GUIOutputDevice(OutputDevice):
80 def create(self, comp, desktop):
81 comp.createGUIScreen(self.parent, desktop)
84 def __init__(self, desktop = None, summary_desktop = None, navigation = None):
85 self.desktop = desktop
86 self.summary_desktop = summary_desktop
88 self.delay_timer = eTimer()
89 self.delay_timer.timeout.get().append(self.processDelay)
91 self.current_dialog = None
93 self.dialog_stack = [ ]
94 self.summary_stack = [ ]
97 def processDelay(self):
100 callback = self.current_dialog.callback
102 retval = self.current_dialog.returnValue
104 if self.current_dialog.isTmp:
105 self.current_dialog.doClose()
106 # dump(self.current_dialog)
107 del self.current_dialog
109 del self.current_dialog.callback
112 if callback is not None:
116 c = self.current_dialog
120 summary = c.createSummary() or SimpleSummary
121 self.summary = self.instantiateSummaryDialog(summary, c)
124 c.addSummary(self.summary)
127 # when execBegin opened a new dialog, don't bother showing the old one.
128 if c == self.current_dialog:
132 self.current_dialog.execEnd()
133 self.current_dialog.hide()
134 self.current_dialog.removeSummary(self.summary)
137 def create(self, screen, arguments, **kwargs):
138 # creates an instance of 'screen' (which is a class)
140 return screen(self, *arguments, **kwargs)
142 errstr = "Screen %s(%s, %s): %s" % (str(screen), str(arguments), str(kwargs), sys.exc_info()[0])
144 traceback.print_exc(file=sys.stdout)
147 def instantiateDialog(self, screen, *arguments, **kwargs):
148 return self.doInstantiateDialog(screen, arguments, kwargs, self.desktop)
150 def instantiateSummaryDialog(self, screen, *arguments, **kwargs):
151 return self.doInstantiateDialog(screen, arguments, kwargs, self.summary_desktop)
153 def doInstantiateDialog(self, screen, arguments, kwargs, desktop):
157 dlg = self.create(screen, arguments, **kwargs)
159 print 'EXCEPTION IN DIALOG INIT CODE, ABORTING:'
161 traceback.print_exc(file=sys.stdout)
169 readSkin(dlg, None, dlg.skinName, desktop)
171 # create GUI view of this dialog
172 assert desktop is not None
176 for (key, value) in dlg.skinAttributes:
177 if key == "zPosition":
182 dlg.instance = eWindow(desktop, z)
184 applyAllAttributes(dlg.instance, desktop, dlg.skinAttributes)
185 gui = GUIOutputDevice()
186 gui.parent = dlg.instance
187 gui.create(dlg, desktop)
191 def pushCurrent(self):
192 if self.current_dialog:
193 self.dialog_stack.append(self.current_dialog)
196 def popCurrent(self):
197 if len(self.dialog_stack):
198 self.current_dialog = self.dialog_stack.pop()
201 self.current_dialog = None
203 def execDialog(self, dialog):
205 self.current_dialog = dialog
206 self.current_dialog.isTmp = False
207 self.current_dialog.callback = None # would cause re-entrancy problems.
210 def openWithCallback(self, callback, screen, *arguments, **kwargs):
211 dlg = self.open(screen, *arguments, **kwargs)
212 dlg.callback = callback
214 def open(self, screen, *arguments, **kwargs):
216 dlg = self.current_dialog = self.instantiateDialog(screen, *arguments, **kwargs)
222 def keyEvent(self, code):
223 print "code " + str(code)
225 def close(self, *retval):
226 self.current_dialog.returnValue = retval
227 self.delay_timer.start(0, 1)
229 def pushSummary(self):
230 if self.summary is not None:
232 self.summary_stack.append(self.summary)
235 def popSummary(self):
236 if self.summary is not None:
237 self.summary.doClose()
238 self.summary = self.summary_stack.pop()
239 if self.summary is not None:
242 from Screens.Volume import Volume
243 from Screens.Mute import Mute
244 from GlobalActions import globalActionMap
245 from Components.config import ConfigSubsection, configSequence, configElement, configsequencearg
247 #TODO .. move this to a own .py file
249 """Volume control, handles volUp, volDown, volMute actions and display
250 a corresponding dialog"""
251 def __init__(self, session):
252 global globalActionMap
253 globalActionMap.actions["volumeUp"]=self.volUp
254 globalActionMap.actions["volumeDown"]=self.volDown
255 globalActionMap.actions["volumeMute"]=self.volMute
257 config.audio = ConfigSubsection()
258 config.audio.volume = configElement("config.audio.volume", configSequence, [100], configsequencearg.get("INTEGER", (0, 100)))
260 self.volumeDialog = session.instantiateDialog(Volume)
261 self.muteDialog = session.instantiateDialog(Mute)
263 self.hideVolTimer = eTimer()
264 self.hideVolTimer.timeout.get().append(self.volHide)
266 vol = config.audio.volume.value[0]
267 self.volumeDialog.setValue(vol)
268 eDVBVolumecontrol.getInstance().setVolume(vol, vol)
271 config.audio.volume.value = eDVBVolumecontrol.getInstance().getVolume()
272 config.audio.volume.save()
275 if (eDVBVolumecontrol.getInstance().isMuted()):
277 eDVBVolumecontrol.getInstance().volumeUp()
278 self.volumeDialog.show()
279 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
281 self.hideVolTimer.start(3000, True)
284 if (eDVBVolumecontrol.getInstance().isMuted()):
286 eDVBVolumecontrol.getInstance().volumeDown()
287 self.volumeDialog.show()
288 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
290 self.hideVolTimer.start(3000, True)
293 self.volumeDialog.hide()
296 eDVBVolumecontrol.getInstance().volumeToggleMute()
297 self.volumeDialog.setValue(eDVBVolumecontrol.getInstance().getVolume())
299 if (eDVBVolumecontrol.getInstance().isMuted()):
300 self.muteDialog.show()
302 self.muteDialog.hide()
305 session = Session(desktop = getDesktop(0), summary_desktop = getDesktop(1), navigation = Navigation())
307 plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
311 for p in plugins.getPlugins(PluginDescriptor.WHERE_WIZARD):
312 screensToRun.append(p.__call__)
314 screensToRun += wizardManager.getWizards()
316 screensToRun.append(Screens.InfoBar.InfoBar)
318 def runNextScreen(session, screensToRun, *result):
320 quitMainloop(*result)
323 screen = screensToRun[0]
325 if len(screensToRun):
326 session.openWithCallback(boundFunction(runNextScreen, session, screensToRun[1:]), screen)
330 runNextScreen(session, screensToRun)
332 CONNECT(keyPressedSignal(), session.keyEvent)
334 vol = VolumeControl(session)
340 from Tools.DreamboxHardware import setFPWakeuptime
341 from time import time
342 nextRecordingTime = session.nav.RecordTimer.getNextRecordingTime()
343 if nextRecordingTime != -1:
344 if (nextRecordingTime - time() < 330): # no time to switch box back on
345 setFPWakeuptime(time() + 30) # so switch back on in 30 seconds
347 setFPWakeuptime(nextRecordingTime - (300))
349 session.nav.shutdown()
354 keymapparser.readKeymap()
356 skin.loadSkin(getDesktop(0))
358 import Components.InputDevice
359 Components.InputDevice.InitInputDevices()
361 import Components.AVSwitch
362 Components.AVSwitch.InitAVSwitch()
364 import Components.RecordingConfig
365 Components.RecordingConfig.InitRecordingConfig()
367 import Components.UsageConfig
368 Components.UsageConfig.InitUsageConfig()
370 import Components.Network
371 Components.Network.InitNetwork()
373 import Components.Lcd
374 Components.Lcd.InitLcd()
376 import Components.SetupDevices
377 Components.SetupDevices.InitSetupDevices()
379 import Components.RFmod
380 Components.RFmod.InitRFmod()
382 import Components.NimManager
384 # first, setup a screen
390 print 'EXCEPTION IN PYTHON STARTUP CODE:'
392 traceback.print_exc(file=sys.stdout)