InfoBarGenerics.py: fix handling for unused key indication when two times the same...
[enigma2.git] / lib / python / Screens / Wizard.py
old mode 100644 (file)
new mode 100755 (executable)
index 17a8150..1bff028
@@ -1,16 +1,15 @@
 from Screen import Screen
 from Screen import Screen
-
-import string
-
 from Screens.HelpMenu import HelpableScreen
 from Screens.HelpMenu import HelpableScreen
-from Components.config import config, KEY_LEFT, KEY_RIGHT, KEY_DELETE, KEY_BACKSPACE
+from Screens.MessageBox import MessageBox
+from Components.config import config, ConfigText, ConfigPassword, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, KEY_DELETE, KEY_BACKSPACE, KEY_OK, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT, KEY_NUMBERS
+
 from Components.Label import Label
 from Components.Label import Label
+from Components.Sources.StaticText import StaticText
 from Components.Slider import Slider
 from Components.ActionMap import NumberActionMap
 from Components.MenuList import MenuList
 from Components.ConfigList import ConfigList
 from Components.Sources.List import List
 from Components.Slider import Slider
 from Components.ActionMap import NumberActionMap
 from Components.MenuList import MenuList
 from Components.ConfigList import ConfigList
 from Components.Sources.List import List
-
 from enigma import eTimer
 
 from xml.sax import make_parser
 from enigma import eTimer
 
 from xml.sax import make_parser
@@ -19,8 +18,8 @@ from xml.sax.handler import ContentHandler
 class WizardSummary(Screen):
        skin = """
        <screen position="0,0" size="132,64">
 class WizardSummary(Screen):
        skin = """
        <screen position="0,0" size="132,64">
-               <widget name="text" position="6,4" size="120,42" font="Regular;14" transparent="1" />
-               <widget source="parent.list" render="Label" position="6,25" size="120,21" font="Regular;16">
+               <widget source="text" render="Label" position="6,0" size="120,16" font="Regular;16" transparent="1" />
+               <widget source="parent.list" render="Label" position="6,18" size="120,46" font="Regular;12">
                        <convert type="StringListSelection" />
                </widget>
        </screen>"""
                        <convert type="StringListSelection" />
                </widget>
        </screen>"""
@@ -36,7 +35,7 @@ class WizardSummary(Screen):
                #self.skinName.append("Wizard")
                #print "*************+++++++++++++++++****************++++++++++******************* WizardSummary", self.skinName
                        #
                #self.skinName.append("Wizard")
                #print "*************+++++++++++++++++****************++++++++++******************* WizardSummary", self.skinName
                        #
-               self["text"] = Label("")
+               self["text"] = StaticText("")
                self.onShow.append(self.setCallback)
                
        def setCallback(self):
                self.onShow.append(self.setCallback)
                
        def setCallback(self):
@@ -85,10 +84,12 @@ class Wizard(Screen):
                                else:
                                        timeoutstep = ''
                                self.wizard[self.lastStep] = {"id": id, "condition": "", "text": "", "timeout": timeout, "timeoutaction": timeoutaction, "timeoutstep": timeoutstep, "list": [], "config": {"screen": None, "args": None, "type": "" }, "code": "", "codeafter": "", "code_async": "", "codeafter_async": "", "nextstep": nextstep}
                                else:
                                        timeoutstep = ''
                                self.wizard[self.lastStep] = {"id": id, "condition": "", "text": "", "timeout": timeout, "timeoutaction": timeoutaction, "timeoutstep": timeoutstep, "list": [], "config": {"screen": None, "args": None, "type": "" }, "code": "", "codeafter": "", "code_async": "", "codeafter_async": "", "nextstep": nextstep}
+                               if attrs.has_key('laststep'):
+                                       self.wizard[self.lastStep]["laststep"] = str(attrs.get('laststep'))
                        elif (name == "text"):
                        elif (name == "text"):
-                               self.wizard[self.lastStep]["text"] = string.replace(str(attrs.get('value')), "\\n", "\n")
+                               self.wizard[self.lastStep]["text"] = str(attrs.get('value')).replace("\\n", "\n")
                        elif (name == "displaytext"):
                        elif (name == "displaytext"):
-                               self.wizard[self.lastStep]["displaytext"] = string.replace(str(attrs.get('value')), "\\n", "\n")
+                               self.wizard[self.lastStep]["displaytext"] = str(attrs.get('value')).replace("\\n", "\n")
                        elif (name == "list"):
                                if (attrs.has_key('type')):
                                        if attrs["type"] == "dynamic":
                        elif (name == "list"):
                                if (attrs.has_key('type')):
                                        if attrs["type"] == "dynamic":
@@ -163,6 +164,8 @@ class Wizard(Screen):
        
        def __init__(self, session, showSteps = True, showStepSlider = True, showList = True, showConfig = True):
                Screen.__init__(self, session)
        
        def __init__(self, session, showSteps = True, showStepSlider = True, showList = True, showConfig = True):
                Screen.__init__(self, session)
+               
+               self.isLastWizard = False # can be used to skip a "goodbye"-screen in a wizard
 
                self.stepHistory = []
 
 
                self.stepHistory = []
 
@@ -210,13 +213,15 @@ class Wizard(Screen):
                self.onShown.append(self.updateValues)
 
                self.configInstance = None
                self.onShown.append(self.updateValues)
 
                self.configInstance = None
+               self.currentConfigIndex = None
                
                self.lcdCallbacks = []
                
                self.disableKeys = False
                
                
                self.lcdCallbacks = []
                
                self.disableKeys = False
                
-               self["actions"] = NumberActionMap(["WizardActions", "NumberActions", "ColorActions", "SetupActions"],
+               self["actions"] = NumberActionMap(["WizardActions", "NumberActions", "ColorActions", "SetupActions", "InputAsciiActions", "KeyboardInputActions"],
                {
                {
+                       "gotAsciiCode": self.keyGotAscii,
                        "ok": self.ok,
                        "back": self.back,
                        "left": self.left,
                        "ok": self.ok,
                        "back": self.back,
                        "left": self.left,
@@ -240,6 +245,13 @@ class Wizard(Screen):
                        "9": self.keyNumberGlobal,
                        "0": self.keyNumberGlobal
                }, -1)
                        "9": self.keyNumberGlobal,
                        "0": self.keyNumberGlobal
                }, -1)
+
+               self["VirtualKB"] = NumberActionMap(["VirtualKeyboardActions"],
+               {
+                       "showVirtualKeyboard": self.KeyText,
+               }, -2)
+               
+               self["VirtualKB"].setEnabled(False)
                
        def red(self):
                print "red"
                
        def red(self):
                print "red"
@@ -284,6 +296,8 @@ class Wizard(Screen):
                if len(self.stepHistory) > 1:
                        self.currStep = self.stepHistory[-2]
                        self.stepHistory = self.stepHistory[:-2]
                if len(self.stepHistory) > 1:
                        self.currStep = self.stepHistory[-2]
                        self.stepHistory = self.stepHistory[:-2]
+               else:
+                       self.session.openWithCallback(self.exitWizardQuestion, MessageBox, (_("Are you sure you want to exit this wizard?") ) )
                if self.currStep < 1:
                        self.currStep = 1
                print "currStep:", self.currStep
                if self.currStep < 1:
                        self.currStep = 1
                print "currStep:", self.currStep
@@ -291,6 +305,11 @@ class Wizard(Screen):
                self.updateValues()
                print "after updateValues stepHistory:", self.stepHistory
                
                self.updateValues()
                print "after updateValues stepHistory:", self.stepHistory
                
+       def exitWizardQuestion(self, ret = False):
+               if (ret):
+                       self.markDone()
+                       self.close()
+               
        def markDone(self):
                pass
        
        def markDone(self):
                pass
        
@@ -307,37 +326,42 @@ class Wizard(Screen):
 
        def finished(self, gotoStep = None, *args, **kwargs):
                print "finished"
 
        def finished(self, gotoStep = None, *args, **kwargs):
                print "finished"
-               self.prevStep = self.currStep
-               self.gotoStep = gotoStep
+               currStep = self.currStep
 
                if self.updateValues not in self.onShown:
                        self.onShown.append(self.updateValues)
 
                if self.updateValues not in self.onShown:
                        self.onShown.append(self.updateValues)
-
+                       
                if self.showConfig:
                if self.showConfig:
-                       if self.wizard[self.prevStep]["config"]["type"] == "dynamic":
-                               eval("self." + self.wizard[self.prevStep]["config"]["evaluation"])()
+                       if self.wizard[currStep]["config"]["type"] == "dynamic":
+                               eval("self." + self.wizard[currStep]["config"]["evaluation"])()
 
                if self.showList:
 
                if self.showList:
-                       if (len(self.wizard[self.prevStep]["evaluatedlist"]) > 0):
+                       if (len(self.wizard[currStep]["evaluatedlist"]) > 0):
                                print "current:", self["list"].current
                                nextStep = self["list"].current[1]
                                print "current:", self["list"].current
                                nextStep = self["list"].current[1]
-                               if (self.wizard[self.prevStep].has_key("listevaluation")):
+                               if (self.wizard[currStep].has_key("listevaluation")):
                                        exec("self." + self.wizard[self.currStep]["listevaluation"] + "('" + nextStep + "')")
                                else:
                                        self.currStep = self.getStepWithID(nextStep)
 
                                        exec("self." + self.wizard[self.currStep]["listevaluation"] + "('" + nextStep + "')")
                                else:
                                        self.currStep = self.getStepWithID(nextStep)
 
-               if ((self.prevStep == self.numSteps and self.wizard[self.prevStep]["nextstep"] is None) or self.wizard[self.prevStep]["id"] == "end"): # wizard finished
+               print_now = True
+               if ((currStep == self.numSteps and self.wizard[currStep]["nextstep"] is None) or self.wizard[currStep]["id"] == "end"): # wizard finished
                        print "wizard finished"
                        self.markDone()
                        self.close()
                else:
                        print "wizard finished"
                        self.markDone()
                        self.close()
                else:
-                       self.codeafterA=True
-                       self.runCode(self.wizard[self.prevStep]["codeafter"])
-                       if self.runCode(self.wizard[self.prevStep]["codeafter_async"]):
+                       self.codeafter = True
+                       self.runCode(self.wizard[currStep]["codeafter"])
+                       self.prevStep = currStep
+                       self.gotoStep = gotoStep
+                       if not self.runCode(self.wizard[currStep]["codeafter_async"]):
+                               self.afterAsyncCode()
+                       else:
                                if self.updateValues in self.onShown:
                                        self.onShown.remove(self.updateValues)
                                if self.updateValues in self.onShown:
                                        self.onShown.remove(self.updateValues)
-                       else:
-                               self.afterAsyncCode()
+
+               if print_now:
+                       print "Now: " + str(self.currStep)
 
        def ok(self):
                print "OK"
 
        def ok(self):
                print "OK"
@@ -363,6 +387,10 @@ class Wizard(Screen):
        def keyNumberGlobal(self, number):
                if (self.wizard[self.currStep]["config"]["screen"] != None):
                        self.configInstance.keyNumberGlobal(number)
        def keyNumberGlobal(self, number):
                if (self.wizard[self.currStep]["config"]["screen"] != None):
                        self.configInstance.keyNumberGlobal(number)
+
+       def keyGotAscii(self):
+               if (self.wizard[self.currStep]["config"]["screen"] != None):
+                       self["config"].handleKey(KEY_ASCII)
                
        def left(self):
                self.resetCounter()
                
        def left(self):
                self.resetCounter()
@@ -384,6 +412,7 @@ class Wizard(Screen):
                self.resetCounter()
                if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None  or self.wizard[self.currStep]["config"]["type"] == "dynamic"):
                        self["config"].instance.moveSelection(self["config"].instance.moveUp)
                self.resetCounter()
                if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None  or self.wizard[self.currStep]["config"]["type"] == "dynamic"):
                        self["config"].instance.moveSelection(self["config"].instance.moveUp)
+                       self.handleInputHelpers()
                elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0):
                        self["list"].selectPrevious()
                        if self.wizard[self.currStep].has_key("onselect"):
                elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0):
                        self["list"].selectPrevious()
                        if self.wizard[self.currStep].has_key("onselect"):
@@ -397,6 +426,7 @@ class Wizard(Screen):
                self.resetCounter()
                if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None  or self.wizard[self.currStep]["config"]["type"] == "dynamic"):
                        self["config"].instance.moveSelection(self["config"].instance.moveDown)
                self.resetCounter()
                if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None  or self.wizard[self.currStep]["config"]["type"] == "dynamic"):
                        self["config"].instance.moveSelection(self["config"].instance.moveDown)
+                       self.handleInputHelpers()
                elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0):
                        #self["list"].instance.moveSelection(self["list"].instance.moveDown)
                        self["list"].selectNext()
                elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0):
                        #self["list"].instance.moveSelection(self["list"].instance.moveDown)
                        self["list"].selectNext()
@@ -460,41 +490,59 @@ class Wizard(Screen):
                        self.configInstance.doClose()
                        self.configInstance = None
 
                        self.configInstance.doClose()
                        self.configInstance = None
 
+               self.condition = True
                exec (self.wizard[self.currStep]["condition"])
                exec (self.wizard[self.currStep]["condition"])
-
-               if len(self.stepHistory) == 0 or self.stepHistory[-1] != self.currStep:
-                       self.stepHistory.append(self.currStep)
-               print "wizard step:", self.wizard[self.currStep]
+               if not self.condition:
+                       print "keys*******************:", self.wizard[self.currStep].keys()
+                       if self.wizard[self.currStep].has_key("laststep"): # exit wizard, if condition of laststep doesn't hold
+                               self.markDone()
+                               self.close()
+                               return
+                       else:
+                               self.currStep += 1
+                               self.updateValues()
+               else:
+                       if self.wizard[self.currStep].has_key("displaytext"):
+                               displaytext = self.wizard[self.currStep]["displaytext"]
+                               print "set LCD text"
+                               for x in self.lcdCallbacks:
+                                       x(displaytext)
+                       if len(self.stepHistory) == 0 or self.stepHistory[-1] != self.currStep:
+                               self.stepHistory.append(self.currStep)
+                       print "wizard step:", self.wizard[self.currStep]
                        
                        
-               if self.showSteps:
-                       self["step"].setText(self.getTranslation("Step ") + str(self.currStep) + "/" + str(self.numSteps))
-               if self.showStepSlider:
-                       self["stepslider"].setValue(self.currStep)
+                       if self.showSteps:
+                               self["step"].setText(self.getTranslation("Step ") + str(self.currStep) + "/" + str(self.numSteps))
+                       if self.showStepSlider:
+                               self["stepslider"].setValue(self.currStep)
                
                
-               if self.wizard[self.currStep]["timeout"] is not None:
-                       self.resetCounter() 
-                       self.timeoutTimer.start(1000)
+                       if self.wizard[self.currStep]["timeout"] is not None:
+                               self.resetCounter() 
+                               self.timeoutTimer.start(1000)
                        
                        
-               print "wizard text", self.getTranslation(self.wizard[self.currStep]["text"])
-               self.updateText(firstset = True)
-               if self.wizard[self.currStep].has_key("displaytext"):
-                       displaytext = self.wizard[self.currStep]["displaytext"]
-                       print "set LCD text"
-                       for x in self.lcdCallbacks:
-                               x(displaytext)
+                       print "wizard text", self.getTranslation(self.wizard[self.currStep]["text"])
+                       self.updateText(firstset = True)
+                       if self.wizard[self.currStep].has_key("displaytext"):
+                               displaytext = self.wizard[self.currStep]["displaytext"]
+                               print "set LCD text"
+                               for x in self.lcdCallbacks:
+                                       x(displaytext)
                                
                                
-               self.codeafterA=False
-               self.runCode(self.wizard[self.currStep]["code"])
-               if self.runCode(self.wizard[self.currStep]["code_async"]):
-                       if self.updateValues in self.onShown:
-                               self.onShown.remove(self.updateValues)
-               else:
-                       self.afterAsyncCode()
+                       self.codeafter=False
+                       self.runCode(self.wizard[self.currStep]["code"])
+                       if self.runCode(self.wizard[self.currStep]["code_async"]):
+                               if self.updateValues in self.onShown:
+                                       self.onShown.remove(self.updateValues)
+                       else:
+                               self.afterAsyncCode()
 
        def afterAsyncCode(self):
 
        def afterAsyncCode(self):
-               if self.codeafterA:
+               if not self.updateValues in self.onShown:
+                       self.onShown.append(self.updateValues)
+
+               if self.codeafter:
                        if self.wizard[self.prevStep]["nextstep"] is not None:
                        if self.wizard[self.prevStep]["nextstep"] is not None:
-                               self.currStep = self.getStepWithID(self.wizard[self.currStep]["nextstep"])
+                               self.currStep = self.getStepWithID(self.wizard[self.prevStep]["nextstep"])
                        if self.gotoStep is not None:
                                self.currStep = self.getStepWithID(self.gotoStep)
                        self.currStep += 1
                        if self.gotoStep is not None:
                                self.currStep = self.getStepWithID(self.gotoStep)
                        self.currStep += 1
@@ -559,6 +607,9 @@ class Wizard(Screen):
                                                print "clearConfigList", self.configInstance["config"], self["config"]
                                else:
                                        self["config"].l.setList([])
                                                print "clearConfigList", self.configInstance["config"], self["config"]
                                else:
                                        self["config"].l.setList([])
+                                       self.handleInputHelpers()
+                                       
+                                       
                        else:
                                if self.has_key("config"):
                                        self["config"].hide()
                        else:
                                if self.has_key("config"):
                                        self["config"].hide()
@@ -575,6 +626,45 @@ class Wizard(Screen):
                                        self.finished(gotoStep = self.wizard[self.currStep]["timeoutstep"])
                self.updateText()
 
                                        self.finished(gotoStep = self.wizard[self.currStep]["timeoutstep"])
                self.updateText()
 
+       def handleInputHelpers(self):
+               if self["config"].getCurrent() is not None:
+                       if isinstance(self["config"].getCurrent()[1], ConfigText) or isinstance(self["config"].getCurrent()[1], ConfigPassword):
+                               if self.has_key("VKeyIcon"):
+                                       self["VirtualKB"].setEnabled(True)
+                                       self["VKeyIcon"].boolean = True
+                               if self.has_key("HelpWindow"):
+                                       if self["config"].getCurrent()[1].help_window.instance is not None:
+                                               helpwindowpos = self["HelpWindow"].getPosition()
+                                               from enigma import ePoint
+                                               self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
+                       else:
+                               if self.has_key("VKeyIcon"):
+                                       self["VirtualKB"].setEnabled(False)
+                                       self["VKeyIcon"].boolean = False
+               else:
+                       if self.has_key("VKeyIcon"):
+                               self["VirtualKB"].setEnabled(False)
+                               self["VKeyIcon"].boolean = False
+
+       def KeyText(self):
+               from Screens.VirtualKeyBoard import VirtualKeyBoard
+               self.currentConfigIndex = self["config"].getCurrentIndex()
+               self.session.openWithCallback(self.VirtualKeyBoardCallback, VirtualKeyBoard, title = self["config"].getCurrent()[0], text = self["config"].getCurrent()[1].getValue())
+
+       def VirtualKeyBoardCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       if isinstance(self["config"].getCurrent()[1], ConfigText) or isinstance(self["config"].getCurrent()[1], ConfigPassword):
+                               if self.has_key("HelpWindow"):
+                                       if self["config"].getCurrent()[1].help_window.instance is not None:
+                                               helpwindowpos = self["HelpWindow"].getPosition()
+                                               from enigma import ePoint
+                                               self["config"].getCurrent()[1].help_window.instance.move(ePoint(helpwindowpos[0],helpwindowpos[1]))
+                       self["config"].instance.moveSelectionTo(self.currentConfigIndex)
+                       self["config"].setCurrentIndex(self.currentConfigIndex)
+                       self["config"].getCurrent()[1].setValue(callback)
+                       self["config"].invalidate(self["config"].getCurrent())
+
+
 class WizardManager:
        def __init__(self):
                self.wizards = []
 class WizardManager:
        def __init__(self):
                self.wizards = []
@@ -583,10 +673,11 @@ class WizardManager:
                self.wizards.append((wizard, precondition, priority))
        
        def getWizards(self):
                self.wizards.append((wizard, precondition, priority))
        
        def getWizards(self):
-               list = []
-               for x in self.wizards:
-                       if x[1] == 1: # precondition
-                               list.append((x[2], x[0]))
-               return list
+               # x[1] is precondition
+               for wizard in self.wizards:
+                       wizard[0].isLastWizard = False
+               if len(self.wizards) > 0:
+                       self.wizards[-1][0].isLastWizard = True
+               return [(x[2], x[0]) for x in self.wizards if x[1] == 1]
 
 wizardManager = WizardManager()
 
 wizardManager = WizardManager()