From 77488b1ad023f9221684e42e23d4e8f2a299d948 Mon Sep 17 00:00:00 2001 From: ghost Date: Thu, 6 Nov 2008 19:09:33 +0100 Subject: Wizard.py: add handling for async code --- lib/python/Screens/Wizard.py | 78 +++++++++++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 23 deletions(-) (limited to 'lib/python/Screens/Wizard.py') diff --git a/lib/python/Screens/Wizard.py b/lib/python/Screens/Wizard.py index cee057dc..53600dfe 100644 --- a/lib/python/Screens/Wizard.py +++ b/lib/python/Screens/Wizard.py @@ -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) @@ -298,7 +311,7 @@ class Wizard(Screen): 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"])() @@ -317,16 +330,20 @@ class Wizard(Screen): self.markDone() self.close() else: + self.codeafter=True self.runCode(self.wizard[currStep]["codeafter"]) + async = self.runCode(self.wizard[currStep]["codeafter_async"]) 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) - + if not async: + self.currStep += 1 + self.updateValues() + print "Now: " + str(self.currStep) + else: + self.onShown.remove(self.updateValues) + print "Now: " + str(self.currStep+1), "(after async code finished)" def ok(self): print "OK" @@ -371,7 +388,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"): @@ -415,7 +432,9 @@ class Wizard(Screen): if code != "": print "code", code exec(code) - + return True + return False + def getTranslation(self, text): return _(text) @@ -470,8 +489,24 @@ class Wizard(Screen): for x in self.lcdCallbacks: x(displaytext) + self.codeafter=False self.runCode(self.wizard[self.currStep]["code"]) - + self.async = self.runCode(self.wizard[self.currStep]["code_async"]) + if self.async: + self.onShown.remove(self.updateValues) + else: + self.afterAsyncCode() + else: + self.currStep += 1 + self.updateValues() + + def afterAsyncCode(self): + if self.updateValues not in self.onShown: + self.onShown.append(self.updateValues) + if self.codeafter: + self.currStep += 1 + self.updateValues() + else: if self.showList: print "showing list,", self.currStep for renderer in self.renderer: @@ -482,7 +517,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")): @@ -524,7 +559,7 @@ class Wizard(Screen): self["config"].l.setList(self.configInstance["config"].list) callbacks = self.configInstance["config"].onSelectionChanged self.configInstance["config"].destroy() - print "clearConfigList", self.configInstance["config"], self["config"] + print "clearConfigList", self.configInstance["config"], self["config"] self.configInstance["config"] = self["config"] self.configInstance["config"].onSelectionChanged = callbacks print "clearConfigList", self.configInstance["config"], self["config"] @@ -533,10 +568,7 @@ class Wizard(Screen): 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 -- cgit v1.2.3 From c9faacfea68f90597fb82504790dc1f7d7b71f3f Mon Sep 17 00:00:00 2001 From: ghost Date: Thu, 6 Nov 2008 23:05:15 +0100 Subject: Wizard.py: hopefully fix async stuff --- lib/python/Screens/Wizard.py | 96 +++++++++++++++++++++----------------------- 1 file changed, 45 insertions(+), 51 deletions(-) (limited to 'lib/python/Screens/Wizard.py') diff --git a/lib/python/Screens/Wizard.py b/lib/python/Screens/Wizard.py index 53600dfe..17a8150e 100644 --- a/lib/python/Screens/Wizard.py +++ b/lib/python/Screens/Wizard.py @@ -307,43 +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.codeafter=True - self.runCode(self.wizard[currStep]["codeafter"]) - async = self.runCode(self.wizard[currStep]["codeafter_async"]) - 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) - if not async: - 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.onShown.remove(self.updateValues) - print "Now: " + str(self.currStep+1), "(after async code finished)" + self.afterAsyncCode() def ok(self): print "OK" @@ -358,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: @@ -464,48 +459,47 @@ class Wizard(Screen): 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.codeafter=False - self.runCode(self.wizard[self.currStep]["code"]) - self.async = self.runCode(self.wizard[self.currStep]["code_async"]) - if self.async: + 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() else: - self.currStep += 1 - self.updateValues() + self.afterAsyncCode() def afterAsyncCode(self): - if self.updateValues not in self.onShown: - self.onShown.append(self.updateValues) - if self.codeafter: + 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 -- cgit v1.2.3 From e4632437dcaf95c92abd3b1fed122a61c97e3a5b Mon Sep 17 00:00:00 2001 From: ghost Date: Fri, 7 Nov 2008 00:36:51 +0100 Subject: Wizard.py: async fixes --- lib/python/Screens/Wizard.py | 92 +++++++++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 40 deletions(-) (limited to 'lib/python/Screens/Wizard.py') diff --git a/lib/python/Screens/Wizard.py b/lib/python/Screens/Wizard.py index 17a8150e..23d6253a 100644 --- a/lib/python/Screens/Wizard.py +++ b/lib/python/Screens/Wizard.py @@ -307,37 +307,42 @@ class Wizard(Screen): 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.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 (len(self.wizard[self.prevStep]["evaluatedlist"]) > 0): + if (len(self.wizard[currStep]["evaluatedlist"]) > 0): 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) - 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: - 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) - else: - self.afterAsyncCode() + + if print_now: + print "Now: " + str(self.currStep) def ok(self): print "OK" @@ -460,41 +465,48 @@ class Wizard(Screen): self.configInstance.doClose() self.configInstance = None + self.condition = True 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: + self.currStep += 1 + self.updateValues() + else: + 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): - 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: - 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 -- cgit v1.2.3