some minor speedups using caches and more selective updating
[enigma2.git] / mytest.py
index 41ce9c84c9038fe1329b683781063997b69b1a5b..8ea13e0a5e59468b7f3dea678d243a04851bcc3c 100644 (file)
--- a/mytest.py
+++ b/mytest.py
@@ -23,11 +23,13 @@ from Navigation import Navigation
 
 from skin import readSkin, applyAllAttributes
 
-from Components.config import configfile
-from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS
+from Tools.Directories import InitFallbackFiles, resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
+from Components.config import configfile, configElement, configText, ConfigSubsection, config, configSequence, configsequencearg
 InitFallbackFiles()
 eDVBDB.getInstance().reloadBouquets()
 
+config.misc.radiopic = configElement("config.misc.radiopic", configText, resolveFilename(SCOPE_SKIN_IMAGE)+"radio.mvi", 0)
+
 try:
        import e2reactor
        e2reactor.install()
@@ -87,6 +89,31 @@ class GUIOutputDevice(OutputDevice):
        def create(self, comp, desktop):
                comp.createGUIScreen(self.parent, desktop)
 
+# Session.open:
+# * push current active dialog ('current_dialog') onto stack
+# * call execEnd for this dialog
+#   * clear in_exec flag
+#   * hide screen
+# * instantiate new dialog into 'current_dialog'
+#   * create screens, components
+#   * read, apply skin
+#   * create GUI for screen
+# * call execBegin for new dialog
+#   * set in_exec
+#   * show gui screen
+#   * call components' / screen's onExecBegin
+# ... screen is active, until it calls 'close'...
+# Session.close:
+# * assert in_exec
+# * save return value
+# * start deferred close handler ('onClose')
+# * execEnd
+#   * clear in_exec
+#   * hide screen
+# .. a moment later:
+# Session.doClose:
+# * destroy screen
+
 class Session:
        def __init__(self, desktop = None, summary_desktop = None, navigation = None):
                self.desktop = desktop
@@ -101,12 +128,12 @@ class Session:
                self.summary_stack = [ ]
                self.summary = None
                
+               self.in_exec = False
+               
                for p in plugins.getPlugins(PluginDescriptor.WHERE_SESSIONSTART):
                        p(reason=0, session=self)
        
        def processDelay(self):
-               self.execEnd()
-               
                callback = self.current_dialog.callback
 
                retval = self.current_dialog.returnValue
@@ -122,27 +149,36 @@ class Session:
                if callback is not None:
                        callback(*retval)
 
-       def execBegin(self):
+       def execBegin(self, first=True):
+               assert not self.in_exec 
+               self.in_exec = True
                c = self.current_dialog
                
-               self.pushSummary()
-
-               summary = c.createSummary() or SimpleSummary
-               self.summary = self.instantiateSummaryDialog(summary, c)
-               self.summary.show()
+               # when this is an execbegin after a execend of a "higher" dialog,
+               # popSummary already did the right thing.
+               if first:
+                       self.pushSummary()
+                       summary = c.createSummary() or SimpleSummary
+                       self.summary = self.instantiateSummaryDialog(summary, c)
+                       self.summary.show()
+                       c.addSummary(self.summary)
 
-               c.addSummary(self.summary)
                c.execBegin()
 
                # when execBegin opened a new dialog, don't bother showing the old one.
                if c == self.current_dialog:
                        c.show()
                
-       def execEnd(self):
+       def execEnd(self, last=True):
+               assert self.in_exec
+               self.in_exec = False
+
                self.current_dialog.execEnd()
                self.current_dialog.hide()
-               self.current_dialog.removeSummary(self.summary)
-               self.popSummary()
+               
+               if last:
+                       self.current_dialog.removeSummary(self.summary)
+                       self.popSummary()
        
        def create(self, screen, arguments, **kwargs):
                # creates an instance of 'screen' (which is a class)
@@ -199,14 +235,14 @@ class Session:
                return dlg
         
        def pushCurrent(self):
-               if self.current_dialog:
+               if self.current_dialog is not None:
                        self.dialog_stack.append(self.current_dialog)
-                       self.execEnd()
+                       self.execEnd(last=False)
        
        def popCurrent(self):
                if len(self.dialog_stack):
                        self.current_dialog = self.dialog_stack.pop()
-                       self.execBegin()
+                       self.execBegin(first=False)
                else:
                        self.current_dialog = None
 
@@ -220,8 +256,13 @@ class Session:
        def openWithCallback(self, callback, screen, *arguments, **kwargs):
                dlg = self.open(screen, *arguments, **kwargs)
                dlg.callback = callback
+               return dlg
 
        def open(self, screen, *arguments, **kwargs):
+               if len(self.dialog_stack) and not self.in_exec:
+                       raise "modal open are allowed only from a screen which is modal!"
+                       # ...unless it's the very first screen.
+               
                self.pushCurrent()
                dlg = self.current_dialog = self.instantiateDialog(screen, *arguments, **kwargs)
                dlg.isTmp = True
@@ -229,12 +270,23 @@ class Session:
                self.execBegin()
                return dlg
 
-       def keyEvent(self, code):
-               print "code " + str(code)
-
-       def close(self, *retval):
+       def close(self, screen, *retval):
+               if not self.in_exec:
+                       print "close after exec!"
+                       return
+               
+               # be sure that the close is for the right dialog!
+               # if it's not, you probably closed after another dialog
+               # was opened. this can happen if you open a dialog
+               # onExecBegin, and forget to do this only once.
+               # after close of the top dialog, the underlying will
+               # gain focus again (for a short time), thus triggering
+               # the onExec, which opens the dialog again, closing the loop.
+               assert screen == self.current_dialog
+               
                self.current_dialog.returnValue = retval
                self.delay_timer.start(0, 1)
+               self.execEnd()
 
        def pushSummary(self):
                if self.summary is not None:
@@ -252,7 +304,6 @@ class Session:
 from Screens.Volume import Volume
 from Screens.Mute import Mute
 from GlobalActions import globalActionMap
-from Components.config import ConfigSubsection, configSequence, configElement, configsequencearg
 
 #TODO .. move this to a own .py file
 class VolumeControl:
@@ -311,6 +362,48 @@ class VolumeControl:
                else:
                        self.muteDialog.hide()
 
+from Screens.Standby import Standby
+
+class PowerKey:
+       """ PowerKey stuff - handles the powerkey press and powerkey release actions"""
+       
+       def __init__(self, session):
+               self.session = session
+               self.powerKeyTimer = eTimer()
+               self.powerKeyTimer.timeout.get().append(self.powertimer)
+               globalActionMap.actions["powerdown"]=self.powerdown
+               globalActionMap.actions["powerup"]=self.powerup
+               self.standbyblocked = 0
+#              self["PowerKeyActions"] = HelpableActionMap(self, "PowerKeyActions",
+                       #{
+                               #"powerdown": self.powerdown,
+                               #"powerup": self.powerup,
+                               #"discreteStandby": (self.standby, "Go standby"),
+                               #"discretePowerOff": (self.quit, "Go to deep standby"),
+                       #})
+
+       def powertimer(self):   
+               print "PowerOff - Now!"
+               self.quit()
+       
+       def powerdown(self):
+               self.standbyblocked = 0
+               self.powerKeyTimer.start(3000, True)
+
+       def powerup(self):
+               self.powerKeyTimer.stop()
+               if self.standbyblocked == 0:
+                       self.standbyblocked = 1
+                       self.standby()
+
+       def standby(self):
+               if self.session.current_dialog and self.session.current_dialog.ALLOW_SUSPEND:
+                       self.session.open(Standby, self)
+
+       def quit(self):
+               # halt
+               quitMainloop(1)
+
 def runScreenTest():
        plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
 
@@ -325,6 +418,8 @@ def runScreenTest():
        
        screensToRun.append(Screens.InfoBar.InfoBar)
 
+       ePythonConfigQuery.setQueryFunc(configfile.getResolvedKey)
+
        def runNextScreen(session, screensToRun, *result):
                if result:
                        quitMainloop(*result)
@@ -339,9 +434,8 @@ def runScreenTest():
        
        runNextScreen(session, screensToRun)
        
-       CONNECT(keyPressedSignal(), session.keyEvent)
-       
        vol = VolumeControl(session)
+       power = PowerKey(session)
        
        runReactor()
        
@@ -391,6 +485,9 @@ Components.RFmod.InitRFmod()
 
 import Components.NimManager
 
+import Screens.Ci
+Screens.Ci.InitCiConfig()
+
 # first, setup a screen
 try:
        runScreenTest()