fix Scart.py, add some asserts to find this kind of bugs earlier
authorFelix Domke <tmbinc@elitedvb.net>
Tue, 18 Apr 2006 18:49:26 +0000 (18:49 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Tue, 18 Apr 2006 18:49:26 +0000 (18:49 +0000)
lib/python/Screens/Scart.py
lib/python/Screens/Screen.py
mytest.py

index cae46b233a44b177ee849eec7fe6f9f52106ec21..e8b7a4a725da1566f2ec9c2506157081a1f192f8 100644 (file)
@@ -13,11 +13,13 @@ class Scart(Screen):
                
                self.avswitch.setInput("SCART")
                
                
                self.avswitch.setInput("SCART")
                
-               self.onShown.append(self.showMessageBox)
+               self.onExecBegin.append(self.showMessageBox)
                                
        def showMessageBox(self):
                                
        def showMessageBox(self):
+               # only open messagebox on first execBegin
+               self.onShown.remove(self.showMessageBox)
                self.session.openWithCallback(self.switchToTV, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR)
                
                self.session.openWithCallback(self.switchToTV, MessageBox, _("If you see this, something is wrong with\nyour scart connection. Press OK to return."), MessageBox.TYPE_ERROR)
                
-       def switchToTV(self, val):
+       def switchToTV(self, *val):
                self.avswitch.setInput("ENCODER")
                self.close()
                self.avswitch.setInput("ENCODER")
                self.close()
index d4b3d729e32ac11ceb2de790d7d40a291c2429d1..e6abdef95a06f21153786b70ce53781d89dd2aac 100644 (file)
@@ -74,7 +74,7 @@ class Screen(dict, HTMLSkin, GUISkin):
                self.__dict__.clear()
        
        def close(self, *retval):
                self.__dict__.clear()
        
        def close(self, *retval):
-               self.session.close(*retval)
+               self.session.close(self, *retval)
 
        def setFocus(self, o):
                self.instance.setFocus(o.instance)
 
        def setFocus(self, o):
                self.instance.setFocus(o.instance)
index d594af38a1330d53864ba2341a439ad538e935f1..76f0d33385e701da091db49487b2a2bd79f15e17 100644 (file)
--- a/mytest.py
+++ b/mytest.py
@@ -87,6 +87,31 @@ class GUIOutputDevice(OutputDevice):
        def create(self, comp, desktop):
                comp.createGUIScreen(self.parent, desktop)
 
        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
 class Session:
        def __init__(self, desktop = None, summary_desktop = None, navigation = None):
                self.desktop = desktop
@@ -204,7 +229,7 @@ class Session:
                return dlg
         
        def pushCurrent(self):
                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.dialog_stack.append(self.current_dialog)
                        self.execEnd()
        
@@ -227,6 +252,10 @@ class Session:
                dlg.callback = callback
 
        def open(self, screen, *arguments, **kwargs):
                dlg.callback = callback
 
        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
                self.pushCurrent()
                dlg = self.current_dialog = self.instantiateDialog(screen, *arguments, **kwargs)
                dlg.isTmp = True
@@ -237,11 +266,20 @@ class Session:
        def keyEvent(self, code):
                print "code " + str(code)
 
        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
                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()
                self.current_dialog.returnValue = retval
                self.delay_timer.start(0, 1)
                self.execEnd()