going back in the wizard should work better now
[enigma2.git] / lib / python / Screens / Wizard.py
index e4f69290a2b117ee00887f20d2624d449b7937f1..ca5181921494af5afb46a9aa0c3e4a25d49cc422 100644 (file)
@@ -1,10 +1,11 @@
 from Screen import Screen
 
 from Screen import Screen
 
+import string
+
 from Screens.HelpMenu import HelpableScreen
 from Components.Label import Label
 from Components.Slider import Slider
 from Components.ActionMap import HelpableActionMap, NumberActionMap
 from Screens.HelpMenu import HelpableScreen
 from Components.Label import Label
 from Components.Slider import Slider
 from Components.ActionMap import HelpableActionMap, NumberActionMap
-from Components.config import config, configElementBoolean
 from Components.Pixmap import *
 from Components.MenuList import MenuList
 from Components.ConfigList import ConfigList
 from Components.Pixmap import *
 from Components.MenuList import MenuList
 from Components.ConfigList import ConfigList
@@ -12,8 +13,6 @@ from Components.ConfigList import ConfigList
 from xml.sax import make_parser
 from xml.sax.handler import ContentHandler
 
 from xml.sax import make_parser
 from xml.sax.handler import ContentHandler
 
-config.misc.firstrun = configElementBoolean("config.misc.firstrun", 1);
-
 class Wizard(Screen, HelpableScreen):
 
        class parseWizard(ContentHandler):
 class Wizard(Screen, HelpableScreen):
 
        class parseWizard(ContentHandler):
@@ -21,15 +20,24 @@ class Wizard(Screen, HelpableScreen):
                        self.isPointsElement, self.isReboundsElement = 0, 0
                        self.wizard = wizard
                        self.currContent = ""
                        self.isPointsElement, self.isReboundsElement = 0, 0
                        self.wizard = wizard
                        self.currContent = ""
+                       self.lastStep = 0
                
                def startElement(self, name, attrs):
                
                def startElement(self, name, attrs):
-                       print name
+                       print "startElement", name
                        self.currContent = name
                        if (name == "step"):
                        self.currContent = name
                        if (name == "step"):
-                               self.lastStep = int(attrs.get('number'))
-                               self.wizard[self.lastStep] = {"text": "", "list": [], "config": {"screen": None, "args": None, "type": "" }, "code": ""}
+                               self.lastStep += 1
+                               if attrs.has_key('id'):
+                                       id = str(attrs.get('id'))
+                               else:
+                                       id = ""
+                               if attrs.has_key('nextstep'):
+                                       nextstep = str(attrs.get('nextstep'))
+                               else:
+                                       nextstep = None
+                               self.wizard[self.lastStep] = {"id": id, "condition": "", "text": "", "list": [], "config": {"screen": None, "args": None, "type": "" }, "code": "", "codeafter": "", "nextstep": nextstep}
                        elif (name == "text"):
                        elif (name == "text"):
-                               self.wizard[self.lastStep]["text"] = _(str(attrs.get('value')))
+                               self.wizard[self.lastStep]["text"] = string.replace(str(attrs.get('value')), "\\n", "\n")
                        elif (name == "listentry"):
                                self.wizard[self.lastStep]["list"].append((str(attrs.get('caption')), str(attrs.get('step'))))
                        elif (name == "config"):
                        elif (name == "listentry"):
                                self.wizard[self.lastStep]["list"].append((str(attrs.get('caption')), str(attrs.get('step'))))
                        elif (name == "config"):
@@ -39,46 +47,73 @@ class Wizard(Screen, HelpableScreen):
                                        print "has args"
                                        self.wizard[self.lastStep]["config"]["args"] = str(attrs.get('args'))
                                self.wizard[self.lastStep]["config"]["type"] = str(attrs.get('type'))
                                        print "has args"
                                        self.wizard[self.lastStep]["config"]["args"] = str(attrs.get('args'))
                                self.wizard[self.lastStep]["config"]["type"] = str(attrs.get('type'))
+                       elif (name == "code"):
+                               if attrs.has_key('pos') and str(attrs.get('pos')) == "after":
+                                       self.codeafter = True
+                               else:
+                                       self.codeafter = False
+                       elif (name == "condition"):
+                               pass
                def endElement(self, name):
                        self.currContent = ""
                        if name == 'code':
                def endElement(self, name):
                        self.currContent = ""
                        if name == 'code':
-                               self.wizard[self.lastStep]["code"] = self.wizard[self.lastStep]["code"].strip()
-                               
+                               if self.codeafter:
+                                       self.wizard[self.lastStep]["codeafter"] = self.wizard[self.lastStep]["codeafter"].strip()
+                               else:
+                                       self.wizard[self.lastStep]["code"] = self.wizard[self.lastStep]["code"].strip()
+                       elif name == 'condition':
+                               self.wizard[self.lastStep]["condition"] = self.wizard[self.lastStep]["condition"].strip()
+                                                               
                def characters(self, ch):
                        if self.currContent == "code":
                def characters(self, ch):
                        if self.currContent == "code":
-                                self.wizard[self.lastStep]["code"] = self.wizard[self.lastStep]["code"] + ch
-                               
-       def __init__(self, session):
+                               if self.codeafter:
+                                       self.wizard[self.lastStep]["codeafter"] = self.wizard[self.lastStep]["codeafter"] + ch
+                               else:
+                                       self.wizard[self.lastStep]["code"] = self.wizard[self.lastStep]["code"] + ch
+                       elif self.currContent == "condition":
+                                self.wizard[self.lastStep]["condition"] = self.wizard[self.lastStep]["condition"] + ch
+       def __init__(self, session, showSteps = True, showStepSlider = True, showList = True, showConfig = True):
                Screen.__init__(self, session)
                HelpableScreen.__init__(self)
 
                Screen.__init__(self, session)
                HelpableScreen.__init__(self)
 
+               self.stepHistory = []
+
                self.wizard = {}
                parser = make_parser()
                print "Reading " + self.xmlfile
                wizardHandler = self.parseWizard(self.wizard)
                parser.setContentHandler(wizardHandler)
                parser.parse('/usr/share/enigma2/' + self.xmlfile)
                self.wizard = {}
                parser = make_parser()
                print "Reading " + self.xmlfile
                wizardHandler = self.parseWizard(self.wizard)
                parser.setContentHandler(wizardHandler)
                parser.parse('/usr/share/enigma2/' + self.xmlfile)
-               
+
+               self.showSteps = showSteps
+               self.showStepSlider = showStepSlider
+               self.showList = showList
+               self.showConfig = showConfig
+
                self.numSteps = len(self.wizard)
                self.currStep = 1
 
                self["text"] = Label()
 
                self.numSteps = len(self.wizard)
                self.currStep = 1
 
                self["text"] = Label()
 
-               self["config"] = ConfigList([])
+               if showConfig:
+                       self["config"] = ConfigList([])
 
 
-               self["step"] = Label()
-                               
-               self["stepslider"] = Slider(1, self.numSteps)
+               if self.showSteps:
+                       self["step"] = Label()
                
                
-               self.list = []
-               self["list"] = MenuList(self.list)
+               if self.showStepSlider:
+                       self["stepslider"] = Slider(1, self.numSteps)
+               
+               if self.showList:
+                       self.list = []
+                       self["list"] = MenuList(self.list)
 
                self.onShown.append(self.updateValues)
                
                self["actions"] = NumberActionMap(["WizardActions", "NumberActions"],
                {
                        "ok": self.ok,
 
                self.onShown.append(self.updateValues)
                
                self["actions"] = NumberActionMap(["WizardActions", "NumberActions"],
                {
                        "ok": self.ok,
-                       #"cancel": self.keyCancel,
+                       "back": self.back,
                        "left": self.left,
                        "right": self.right,
                        "up": self.up,
                        "left": self.left,
                        "right": self.right,
                        "up": self.up,
@@ -94,34 +129,48 @@ class Wizard(Screen, HelpableScreen):
                        "9": self.keyNumberGlobal,
                        "0": self.keyNumberGlobal
                }, -1)
                        "9": self.keyNumberGlobal,
                        "0": self.keyNumberGlobal
                }, -1)
-               
-               #self["actions"] = HelpableActionMap(self, "OkCancelActions",
-                       #{
-                               #"ok": (self.ok, _("Close this Screen...")),
-                       #})
 
 
+       def back(self):
+               if len(self.stepHistory) > 1:
+                       self.currStep = self.stepHistory[-2]
+                       self.stepHistory = self.stepHistory[:-2]
+               if self.currStep < 1:
+                       self.currStep = 1
+               self.updateValues()
+               
+       def markDone(self):
+               pass
+       
+       def getStepWithID(self, id):
+               count = 0
+               for x in self.wizard:
+                       if self.wizard[x]["id"] == id:
+                               return count
+                       count += 1
+               return 0
+               
        def ok(self):
                print "OK"
        def ok(self):
                print "OK"
-               if (self.wizard[self.currStep]["config"]["screen"] != None):
-                       try: # don't die, if no run() is available
-                               self.configInstance.run()
-                       except:
-                               print "Failed to run configInstance"
+               currStep = self.currStep
+               if self.showConfig:
+                       if (self.wizard[currStep]["config"]["screen"] != None):
+                               try: # don't die, if no run() is available
+                                       self.configInstance.run()
+                               except:
+                                       print "Failed to run configInstance"
                
                
-               if (len(self.wizard[self.currStep]["list"]) > 0):
-                       nextStep = self.wizard[self.currStep]["list"][self["list"].l.getCurrentSelectionIndex()][1]
-                       if nextStep == "end":
-                               self.currStep = self.numSteps
-                       elif nextStep == "next":
-                               pass
-                       else:
-                               self.currStep = int(nextStep) - 1
+               if self.showList:
+                       if (len(self.wizard[currStep]["list"]) > 0):
+                               nextStep = self.wizard[currStep]["list"][self["list"].l.getCurrentSelectionIndex()][1]
+                               self.currStep = self.getStepWithID(nextStep)
 
 
-               if (self.currStep == self.numSteps): # wizard finished
-                       config.misc.firstrun.value = 0;
-                       config.misc.firstrun.save()
+               if (currStep == self.numSteps): # wizard finished
+                       self.markDone()
                        self.session.close()
                else:
                        self.session.close()
                else:
+                       self.runCode(self.wizard[currStep]["codeafter"])
+                       if self.wizard[currStep]["nextstep"] is not None:
+                               self.currStep = self.getStepWithID(self.wizard[currStep]["nextstep"])
                        self.currStep += 1
                        self.updateValues()
                        
                        self.currStep += 1
                        self.updateValues()
                        
@@ -142,66 +191,84 @@ class Wizard(Screen, HelpableScreen):
                print "right"
 
        def up(self):
                print "right"
 
        def up(self):
-               if (self.wizard[self.currStep]["config"]["screen"] != None):
-                       self["config"].instance.moveSelection(self["config"].instance.moveUp)
-               elif (len(self.wizard[self.currStep]["list"]) > 0):
-                       self["list"].instance.moveSelection(self["config"].instance.moveUp)
+               if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None):
+                               self["config"].instance.moveSelection(self["config"].instance.moveUp)
+               elif (self.showList and len(self.wizard[self.currStep]["list"]) > 0):
+                       self["list"].instance.moveSelection(self["list"].instance.moveUp)
                print "up"
                
        def down(self):
                print "up"
                
        def down(self):
-               if (self.wizard[self.currStep]["config"]["screen"] != None):
+               if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None):
                        self["config"].instance.moveSelection(self["config"].instance.moveDown)
                        self["config"].instance.moveSelection(self["config"].instance.moveDown)
-               elif (len(self.wizard[self.currStep]["list"]) > 0):
-                       self["list"].instance.moveSelection(self["config"].instance.moveDown)
+               elif (self.showList and len(self.wizard[self.currStep]["list"]) > 0):
+                       self["list"].instance.moveSelection(self["list"].instance.moveDown)
                print "down"
                
                print "down"
                
+       def runCode(self, code):
+               if code != "":
+                       print "code", code
+                       exec(code)
+               
        def updateValues(self):
                print "Updating values in step " + str(self.currStep)
        def updateValues(self):
                print "Updating values in step " + str(self.currStep)
-               self["step"].setText(_("Step ") + str(self.currStep) + "/" + str(self.numSteps))
-               self["stepslider"].setValue(self.currStep)
-
-               self["text"].setText(_(self.wizard[self.currStep]["text"]))
-
-               if self.wizard[self.currStep]["code"] != "":
-                       print self.wizard[self.currStep]["code"]
-                       exec(self.wizard[self.currStep]["code"])
                
                
-               self["list"].instance.setZPosition(1)
-               self.list = []
-               if (len(self.wizard[self.currStep]["list"]) > 0):
-                       self["list"].instance.setZPosition(2)
-                       for x in self.wizard[self.currStep]["list"]:
-                               self.list.append((x[0], None))
-               self["list"].l.setList(self.list)
-
-               self["config"].instance.setZPosition(1)
-               if (self.wizard[self.currStep]["config"]["screen"] != None):
-                       if self.wizard[self.currStep]["config"]["type"] == "standalone":
-                               print "Type is standalone"
-                               self.session.openWithCallback(self.ok, self.wizard[self.currStep]["config"]["screen"])
-                       else:
-                               self["config"].instance.setZPosition(2)
-                               print self.wizard[self.currStep]["config"]["screen"]
-                               if self.wizard[self.currStep]["config"]["args"] == None:
-                                       self.configInstance = self.session.instantiateDialog(self.wizard[self.currStep]["config"]["screen"])
+               self.stepHistory.append(self.currStep)
+               
+               self.condition = True
+               exec (self.wizard[self.currStep]["condition"])
+               if self.condition:
+                       if self.showSteps:
+                               self["step"].setText(_("Step ") + str(self.currStep) + "/" + str(self.numSteps))
+                       if self.showStepSlider:
+                               self["stepslider"].setValue(self.currStep)
+               
+                       print "wizard text", _(self.wizard[self.currStep]["text"])
+                       self["text"].setText(_(self.wizard[self.currStep]["text"]))
+       
+                       self.runCode(self.wizard[self.currStep]["code"])
+                       
+                       if self.showList:
+                               self["list"].instance.setZPosition(1)
+                               self.list = []
+                               if (len(self.wizard[self.currStep]["list"]) > 0):
+                                       self["list"].instance.setZPosition(2)
+                                       for x in self.wizard[self.currStep]["list"]:
+                                               self.list.append((_(x[0]), None))
+                               self["list"].l.setList(self.list)
+       
+                       if self.showConfig:
+                               self["config"].instance.setZPosition(1)
+                               if (self.wizard[self.currStep]["config"]["screen"] != None):
+                                       if self.wizard[self.currStep]["config"]["type"] == "standalone":
+                                               print "Type is standalone"
+                                               self.session.openWithCallback(self.ok, self.wizard[self.currStep]["config"]["screen"])
+                                       else:
+                                               self["config"].instance.setZPosition(2)
+                                               print "wizard screen", self.wizard[self.currStep]["config"]["screen"]
+                                               if self.wizard[self.currStep]["config"]["args"] == None:
+                                                       self.configInstance = self.session.instantiateDialog(self.wizard[self.currStep]["config"]["screen"])
+                                               else:
+                                                       self.configInstance = self.session.instantiateDialog(self.wizard[self.currStep]["config"]["screen"], eval(self.wizard[self.currStep]["config"]["args"]))
+                                               self["config"].l.setList(self.configInstance["config"].list)
+                                               self.configInstance["config"] = self["config"]
                                else:
                                else:
-                                       self.configInstance = self.session.instantiateDialog(self.wizard[self.currStep]["config"]["screen"], eval(self.wizard[self.currStep]["config"]["args"]))
-                               self["config"].l.setList(self.configInstance["config"].list)
-                               self.configInstance["config"] = self["config"]
-               else:
-                       self["config"].l.setList([])
+                                       self["config"].l.setList([])
+               else: # condition false
+                               self.currStep += 1
+                               self.updateValues()
 
 class WizardManager:
        def __init__(self):
                self.wizards = []
        
 
 class WizardManager:
        def __init__(self):
                self.wizards = []
        
-       def registerWizard(self, wizard):
-               self.wizards.append(wizard)
+       def registerWizard(self, wizard, precondition):
+               self.wizards.append((wizard, precondition))
        
        def getWizards(self):
        
        def getWizards(self):
-               if config.misc.firstrun.value:
-                       return self.wizards
-               else:
-                       return []
+               list = []
+               for x in self.wizards:
+                       if x[1] == 1: # precondition
+                               list.append(x[0])
+               return list
 
 wizardManager = WizardManager()
 
 wizardManager = WizardManager()