X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/79da420aa414522f8b5477053f0b46e6311f1cc1..c9faacfea68f90597fb82504790dc1f7d7b71f3f:/lib/python/Screens/Wizard.py diff --git a/lib/python/Screens/Wizard.py b/lib/python/Screens/Wizard.py index dfb28e24..17a8150e 100644 --- a/lib/python/Screens/Wizard.py +++ b/lib/python/Screens/Wizard.py @@ -3,7 +3,7 @@ from Screen import Screen import string from Screens.HelpMenu import HelpableScreen -from Components.config import config, KEY_LEFT, KEY_RIGHT +from Components.config import config, KEY_LEFT, KEY_RIGHT, KEY_DELETE, KEY_BACKSPACE from Components.Label import Label from Components.Slider import Slider from Components.ActionMap import NumberActionMap @@ -84,7 +84,7 @@ class Wizard(Screen): timeoutstep = str(attrs.get('timeoutstep')) 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": "", "nextstep": nextstep} + 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} elif (name == "text"): self.wizard[self.lastStep]["text"] = string.replace(str(attrs.get('value')), "\\n", "\n") elif (name == "displaytext"): @@ -119,6 +119,7 @@ class Wizard(Screen): if (attrs.has_key('evaluation')): self.wizard[self.lastStep]["config"]["evaluation"] = str(attrs.get('evaluation')) elif (name == "code"): + self.async_code = attrs.has_key('async') and str(attrs.get('async')) == "yes" if attrs.has_key('pos') and str(attrs.get('pos')) == "after": self.codeafter = True else: @@ -129,10 +130,16 @@ class Wizard(Screen): def endElement(self, name): self.currContent = "" if name == 'code': - if self.codeafter: - self.wizard[self.lastStep]["codeafter"] = self.wizard[self.lastStep]["codeafter"].strip() + if self.async_code: + if self.codeafter: + self.wizard[self.lastStep]["codeafter_async"] = self.wizard[self.lastStep]["codeafter_async"].strip() + else: + self.wizard[self.lastStep]["code_async"] = self.wizard[self.lastStep]["code_async"].strip() else: - 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() elif name == 'step': @@ -141,13 +148,19 @@ class Wizard(Screen): def characters(self, ch): if self.currContent == "code": - if self.codeafter: - self.wizard[self.lastStep]["codeafter"] = self.wizard[self.lastStep]["codeafter"] + ch + if self.async_code: + if self.codeafter: + self.wizard[self.lastStep]["codeafter_async"] = self.wizard[self.lastStep]["codeafter_async"] + ch + else: + self.wizard[self.lastStep]["code_async"] = self.wizard[self.lastStep]["code_async"] + ch else: - self.wizard[self.lastStep]["code"] = self.wizard[self.lastStep]["code"] + ch + 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) @@ -180,7 +193,7 @@ class Wizard(Screen): self["text"] = Label() if showConfig: - self["config"] = ConfigList([]) + self["config"] = ConfigList([], session = session) if self.showSteps: self["step"] = Label() @@ -202,7 +215,7 @@ class Wizard(Screen): self.disableKeys = False - self["actions"] = NumberActionMap(["WizardActions", "NumberActions", "ColorActions"], + self["actions"] = NumberActionMap(["WizardActions", "NumberActions", "ColorActions", "SetupActions"], { "ok": self.ok, "back": self.back, @@ -214,6 +227,8 @@ class Wizard(Screen): "green": self.green, "yellow": self.yellow, "blue":self.blue, + "deleteBackward": self.deleteBackward, + "deleteForward": self.deleteForward, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, @@ -242,6 +257,22 @@ class Wizard(Screen): print "blue" pass + def deleteForward(self): + self.resetCounter() + if (self.wizard[self.currStep]["config"]["screen"] != None): + self.configInstance.keyDelete() + elif (self.wizard[self.currStep]["config"]["type"] == "dynamic"): + self["config"].handleKey(KEY_DELETE) + print "deleteForward" + + def deleteBackward(self): + self.resetCounter() + if (self.wizard[self.currStep]["config"]["screen"] != None): + self.configInstance.keyBackspace() + elif (self.wizard[self.currStep]["config"]["type"] == "dynamic"): + self["config"].handleKey(KEY_BACKSPACE) + print "deleteBackward" + def setLCDTextCallback(self, callback): self.lcdCallbacks.append(callback) @@ -276,39 +307,37 @@ class Wizard(Screen): def finished(self, gotoStep = None, *args, **kwargs): print "finished" - currStep = self.currStep + self.prevStep = self.currStep + self.gotoStep = gotoStep if self.updateValues not in self.onShown: self.onShown.append(self.updateValues) - + if self.showConfig: - if self.wizard[currStep]["config"]["type"] == "dynamic": - eval("self." + self.wizard[currStep]["config"]["evaluation"])() - + if self.wizard[self.prevStep]["config"]["type"] == "dynamic": + eval("self." + self.wizard[self.prevStep]["config"]["evaluation"])() + if self.showList: - if (len(self.wizard[currStep]["evaluatedlist"]) > 0): + if (len(self.wizard[self.prevStep]["evaluatedlist"]) > 0): print "current:", self["list"].current nextStep = self["list"].current[1] - if (self.wizard[currStep].has_key("listevaluation")): + if (self.wizard[self.prevStep].has_key("listevaluation")): exec("self." + self.wizard[self.currStep]["listevaluation"] + "('" + nextStep + "')") else: self.currStep = self.getStepWithID(nextStep) - if ((currStep == self.numSteps and self.wizard[currStep]["nextstep"] is None) or self.wizard[currStep]["id"] == "end"): # wizard finished + if ((self.prevStep == self.numSteps and self.wizard[self.prevStep]["nextstep"] is None) or self.wizard[self.prevStep]["id"] == "end"): # wizard finished print "wizard finished" self.markDone() self.close() else: - self.runCode(self.wizard[currStep]["codeafter"]) - if self.wizard[currStep]["nextstep"] is not None: - self.currStep = self.getStepWithID(self.wizard[currStep]["nextstep"]) - if gotoStep is not None: - self.currStep = self.getStepWithID(gotoStep) - self.currStep += 1 - self.updateValues() - - print "Now: " + str(self.currStep) - + self.codeafterA=True + self.runCode(self.wizard[self.prevStep]["codeafter"]) + if self.runCode(self.wizard[self.prevStep]["codeafter_async"]): + if self.updateValues in self.onShown: + self.onShown.remove(self.updateValues) + else: + self.afterAsyncCode() def ok(self): print "OK" @@ -323,7 +352,8 @@ class Wizard(Screen): # for this. If there is one, please do a more specific check # and/or a comment in which situation there is no run() if callable(getattr(self.configInstance, "runAsync", None)): - self.onShown.remove(self.updateValues) + if self.updateValues in self.onShown: + self.onShown.remove(self.updateValues) self.configInstance.runAsync(self.finished) return else: @@ -353,7 +383,7 @@ class Wizard(Screen): def up(self): 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["config"].instance.moveSelection(self["config"].instance.moveUp) elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0): self["list"].selectPrevious() if self.wizard[self.currStep].has_key("onselect"): @@ -383,7 +413,7 @@ class Wizard(Screen): self.resetCounter() if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None): - self["config"].instance.moveSelection(self["config"].instance.moveUp) + self["config"].instance.moveSelection(self["config"].instance.moveUp) elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0): if self.wizard[self.currStep].has_key("onselect"): self.selection = self["list"].current[-1] @@ -397,7 +427,9 @@ class Wizard(Screen): if code != "": print "code", code exec(code) - + return True + return False + def getTranslation(self, text): return _(text) @@ -422,36 +454,53 @@ class Wizard(Screen): self.timeoutTimer.stop() if self.configInstance is not None: + # remove callbacks + self.configInstance["config"].onSelectionChanged = [] del self.configInstance["config"] self.configInstance.doClose() self.configInstance = None - - self.condition = True + exec (self.wizard[self.currStep]["condition"]) - if self.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 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.runCode(self.wizard[self.currStep]["code"]) - + 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() + + def afterAsyncCode(self): + if self.codeafterA: + if self.wizard[self.prevStep]["nextstep"] is not None: + self.currStep = self.getStepWithID(self.wizard[self.currStep]["nextstep"]) + if self.gotoStep is not None: + self.currStep = self.getStepWithID(self.gotoStep) + self.currStep += 1 + self.updateValues() + print "Now: " + str(self.currStep) + else: if self.showList: print "showing list,", self.currStep for renderer in self.renderer: @@ -462,7 +511,7 @@ class Wizard(Screen): print "setZPosition" rootrenderer.instance.setZPosition(1) renderer = renderer.source - + #self["list"].instance.setZPosition(1) self.list = [] if (self.wizard[self.currStep].has_key("dynamiclist")): @@ -502,17 +551,18 @@ class Wizard(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) + callbacks = self.configInstance["config"].onSelectionChanged self.configInstance["config"].destroy() + print "clearConfigList", self.configInstance["config"], self["config"] self.configInstance["config"] = self["config"] + self.configInstance["config"].onSelectionChanged = callbacks + print "clearConfigList", self.configInstance["config"], self["config"] else: self["config"].l.setList([]) else: if self.has_key("config"): self["config"].hide() - else: # condition false - self.currStep += 1 - self.updateValues() - + def timeoutCounterFired(self): self.timeoutCounter -= 1 print "timeoutCounter:", self.timeoutCounter