delete all service references before playService .. otherwise the 2nd tuner is used...
[enigma2.git] / lib / python / Screens / Wizard.py
index b7c149dd80ab9e26e2fb995a78b4fff522c7e5d3..036c81de8ba21be74addca8180565eac8c0fdc31 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,119 +13,177 @@ 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 WelcomeWizard(Screen, HelpableScreen):
-
-       skin = """
-               <screen position="0,0" size="720,560" title="Welcome..." flags="wfNoBorder" >
-                       <widget name="text" position="50,100" size="440,200" font="Arial;23" />
-                       <widget name="list" position="50,300" zPosition="1" size="440,200" />
-                       <widget name="config" position="50,300" zPosition="1" size="440,200" transparent="1" />                 
-                       <widget name="step" position="50,50" size="440,25" font="Arial;23" />
-                       <widget name="stepslider" position="50,500" zPosition="1" size="440,20" backgroundColor="dark" />
-                       <widget name="rc" pixmap="/usr/share/enigma2/rc.png" position="500,600" zPosition="10" size="154,475" transparent="1" alphatest="on"/>
-                       <widget name="arrowdown" pixmap="/usr/share/enigma2/arrowdown.png" position="0,0" zPosition="10" size="37,70" transparent="1" alphatest="on"/>
-                       <widget name="arrowup" pixmap="/usr/share/enigma2/arrowup.png" position="-100,-100" zPosition="10" size="37,70" transparent="1" alphatest="on"/>
-               </screen>"""
+class Wizard(Screen, HelpableScreen):
 
        class parseWizard(ContentHandler):
                def __init__(self, wizard):
                        self.isPointsElement, self.isReboundsElement = 0, 0
                        self.wizard = wizard
                        self.currContent = ""
 
        class parseWizard(ContentHandler):
                def __init__(self, wizard):
                        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 }, "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"):
                        elif (name == "listentry"):
-                               self.wizard[self.lastStep]["list"].append(str(attrs.get('caption')))
+                               self.wizard[self.lastStep]["list"].append((str(attrs.get('caption')), str(attrs.get('step'))))
                        elif (name == "config"):
                                exec "from Screens." + str(attrs.get('module')) + " import *"
                                self.wizard[self.lastStep]["config"]["screen"] = eval(str(attrs.get('screen')))
                                if (attrs.has_key('args')):
                                        print "has args"
                                        self.wizard[self.lastStep]["config"]["args"] = str(attrs.get('args'))
                        elif (name == "config"):
                                exec "from Screens." + str(attrs.get('module')) + " import *"
                                self.wizard[self.lastStep]["config"]["screen"] = eval(str(attrs.get('screen')))
                                if (attrs.has_key('args')):
                                        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):
-               self.skin = WelcomeWizard.skin
+                               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()
                self.wizard = {}
                parser = make_parser()
-               print "Reading startwizard.xml"
+               print "Reading " + self.xmlfile
                wizardHandler = self.parseWizard(self.wizard)
                parser.setContentHandler(wizardHandler)
                wizardHandler = self.parseWizard(self.wizard)
                parser.setContentHandler(wizardHandler)
-               parser.parse('/usr/share/enigma2/startwizard.xml')
-               
+               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["rc"] = MovingPixmap()
-               self["arrowdown"] = MovingPixmap()
-               self["arrowup"] = MovingPixmap()
 
 
-               self["config"] = ConfigList([])
+               if showConfig:
+                       self["config"] = ConfigList([])
 
 
-               self["step"] = Label()
-                               
-               self["stepslider"] = Slider(1, self.numSteps)
+               if self.showSteps:
+                       self["step"] = Label()
+               
+               if self.showStepSlider:
+                       self["stepslider"] = Slider(1, self.numSteps)
                
                
-               self.list = []
-               self["list"] = MenuList(self.list)
+               if self.showList:
+                       self.list = []
+                       self["list"] = MenuList(self.list)
 
                self.onShown.append(self.updateValues)
 
                self.onShown.append(self.updateValues)
+
+               self.configInstance = None
                
                self["actions"] = NumberActionMap(["WizardActions", "NumberActions"],
                {
                        "ok": self.ok,
                
                self["actions"] = NumberActionMap(["WizardActions", "NumberActions"],
                {
                        "ok": self.ok,
-                       #"cancel": self.keyCancel,
+                       "back": self.back,
                        "left": self.left,
                        "right": self.right,
                        "up": self.up,
                        "down": self.down,
                        "left": self.left,
                        "right": self.right,
                        "up": self.up,
                        "down": self.down,
-                       #"1": self.keyNumberGlobal,
-                       #"2": self.keyNumberGlobal,
-                       #"3": self.keyNumberGlobal,
-                       #"4": self.keyNumberGlobal,
-                       #"5": self.keyNumberGlobal,
-                       #"6": self.keyNumberGlobal,
-                       #"7": self.keyNumberGlobal,
-                       #"8": self.keyNumberGlobal,
-                       #"9": self.keyNumberGlobal,
-                       #"0": self.keyNumberGlobal
+                       "1": self.keyNumberGlobal,
+                       "2": self.keyNumberGlobal,
+                       "3": self.keyNumberGlobal,
+                       "4": self.keyNumberGlobal,
+                       "5": self.keyNumberGlobal,
+                       "6": self.keyNumberGlobal,
+                       "7": self.keyNumberGlobal,
+                       "8": self.keyNumberGlobal,
+                       "9": self.keyNumberGlobal,
+                       "0": self.keyNumberGlobal
                }, -1)
                }, -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):
        def ok(self):
-               if (self.currStep == self.numSteps): # wizard finished
-                       config.misc.firstrun.value = 0;
-                       config.misc.firstrun.save()
-                       self.session.close()
+               print "OK"
+               currStep = self.currStep
+               if self.showConfig:
+                       if (self.wizard[currStep]["config"]["screen"] != None):
+                               # TODO: don't die, if no run() is available
+                               # there was a try/except here, but i can't see a reason
+                               # for this. If there is one, please do a more specific check
+                               # and/or a comment in which situation there is no run()
+                               self.configInstance.run()
+               
+               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 (currStep == self.numSteps): # wizard finished
+                       self.markDone()
+                       self.close()
                else:
                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()
+                       
+               print "Now: " + str(self.currStep)
 
 
+       def keyNumberGlobal(self, number):
+               if (self.wizard[self.currStep]["config"]["screen"] != None):
+                       self.configInstance.keyNumberGlobal(number)
+               
        def left(self):
                if (self.wizard[self.currStep]["config"]["screen"] != None):
                        self.configInstance.keyLeft()
        def left(self):
                if (self.wizard[self.currStep]["config"]["screen"] != None):
                        self.configInstance.keyLeft()
@@ -136,54 +195,90 @@ class WelcomeWizard(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):
        def updateValues(self):
-               self["step"].setText(_("Step ") + str(self.currStep) + "/" + str(self.numSteps))
-               self["stepslider"].setValue(self.currStep)
-
-               self["text"].setText(self.wizard[self.currStep]["text"])
+               print "Updating values in step " + str(self.currStep)
                
                
-               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, None))
-               self["list"].l.setList(self.list)
-
-               self["config"].instance.setZPosition(1)
-               if (self.wizard[self.currStep]["config"]["screen"] != None):
-                       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"])
-                       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([])
-
-               if self.wizard[self.currStep]["code"] != "":
-                       print self.wizard[self.currStep]["code"]
-                       exec(self.wizard[self.currStep]["code"])
-
-def listActiveWizards():
-       wizards = [ ]
+               self.stepHistory.append(self.currStep)
+               
+               if self.configInstance is not None:
+                       del self.configInstance["config"]
+                       self.configInstance.doClose()
+                       self.configInstance = None
+               
+               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"].destroy()
+                                               self.configInstance["config"] = self["config"]
+                               else:
+                                       self["config"].l.setList([])
+               else: # condition false
+                               self.currStep += 1
+                               self.updateValues()
 
 
-       if config.misc.firstrun.value:
-               wizards.append(WelcomeWizard)
+class WizardManager:
+       def __init__(self):
+               self.wizards = []
        
        
-       return wizards
+       def registerWizard(self, wizard, precondition):
+               self.wizards.append((wizard, precondition))
+       
+       def getWizards(self):
+               list = []
+               for x in self.wizards:
+                       if x[1] == 1: # precondition
+                               list.append(x[0])
+               return list
+
+wizardManager = WizardManager()