from Screen import Screen import string from Screens.HelpMenu import HelpableScreen from Components.config import config from Components.Label import Label 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 xml.sax.handler import ContentHandler class WizardSummary(Screen): skin = """ """ def __init__(self, session, parent): Screen.__init__(self, session, parent) #names = parent.skinName #if not isinstance(names, list): #names = [names] # #self.skinName = [x + "_summary" for x in names ] #self.skinName.append("Wizard") #print "*************+++++++++++++++++****************++++++++++******************* WizardSummary", self.skinName # self["text"] = Label("") self.onShow.append(self.setCallback) def setCallback(self): self.parent.setLCDTextCallback(self.setText) def setText(self, text): self["text"].setText(text) class Wizard(Screen, HelpableScreen): class parseWizard(ContentHandler): def __init__(self, wizard): self.isPointsElement, self.isReboundsElement = 0, 0 self.wizard = wizard self.currContent = "" self.lastStep = 0 def createSummary(self): print "WizardCreateSummary" return WizardSummary def startElement(self, name, attrs): print "startElement", name self.currContent = name if (name == "step"): self.lastStep += 1 if attrs.has_key('id'): id = str(attrs.get('id')) else: id = "" print "id:", id if attrs.has_key('nextstep'): nextstep = str(attrs.get('nextstep')) else: nextstep = None if attrs.has_key('timeout'): timeout = int(attrs.get('timeout')) else: timeout = None if attrs.has_key('timeoutaction'): timeoutaction = str(attrs.get('timeoutaction')) else: timeoutaction = 'nextpage' if attrs.has_key('timeoutstep'): 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} elif (name == "text"): self.wizard[self.lastStep]["text"] = string.replace(str(attrs.get('value')), "\\n", "\n") elif (name == "displaytext"): self.wizard[self.lastStep]["displaytext"] = string.replace(str(attrs.get('value')), "\\n", "\n") elif (name == "list"): if (attrs.has_key('type')): if attrs["type"] == "dynamic": self.wizard[self.lastStep]["dynamiclist"] = attrs.get("source") #self.wizard[self.lastStep]["list"].append(("Hallo", "test")) if (attrs.has_key("evaluation")): print "evaluation" self.wizard[self.lastStep]["listevaluation"] = attrs.get("evaluation") if (attrs.has_key("onselect")): self.wizard[self.lastStep]["onselect"] = attrs.get("onselect") elif (name == "listentry"): 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')) 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': 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': print "Step number", self.lastStep, ":", self.wizard[self.lastStep] def characters(self, ch): if self.currContent == "code": 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) self.stepHistory = [] self.wizard = {} parser = make_parser() print "Reading " + self.xmlfile wizardHandler = self.parseWizard(self.wizard) parser.setContentHandler(wizardHandler) if self.xmlfile[0] != '/': parser.parse('/usr/share/enigma2/' + self.xmlfile) else: parser.parse(self.xmlfile) self.showSteps = showSteps self.showStepSlider = showStepSlider self.showList = showList self.showConfig = showConfig self.numSteps = len(self.wizard) self.currStep = 1 self.timeoutTimer = eTimer() self.timeoutTimer.callback.append(self.timeoutCounterFired) self["text"] = Label() if showConfig: self["config"] = ConfigList([]) if self.showSteps: self["step"] = Label() if self.showStepSlider: self["stepslider"] = Slider(1, self.numSteps) if self.showList: self.list = [] self["list"] = List(self.list, enableWrapAround = True) self["list"].onSelectionChanged.append(self.selChanged) #self["list"] = MenuList(self.list, enableWrapAround = True) self.onShown.append(self.updateValues) self.configInstance = None self.lcdCallbacks = [] self["actions"] = NumberActionMap(["WizardActions", "NumberActions"], { "ok": self.ok, "back": self.back, "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) def setLCDTextCallback(self, callback): self.lcdCallbacks.append(callback) def back(self): print "getting back..." print "stepHistory:", self.stepHistory if len(self.stepHistory) > 1: self.currStep = self.stepHistory[-2] self.stepHistory = self.stepHistory[:-2] if self.currStep < 1: self.currStep = 1 print "currStep:", self.currStep print "new stepHistory:", self.stepHistory self.updateValues() print "after updateValues stepHistory:", self.stepHistory def markDone(self): pass def getStepWithID(self, id): print "getStepWithID:", id count = 0 for x in self.wizard: if self.wizard[x]["id"] == id: print "result:", count return count count += 1 print "result: nothing" return 0 def finished(self, gotoStep = None, *args, **kwargs): print "finished" currStep = self.currStep if self.updateValues not in self.onShown: self.onShown.append(self.updateValues) if self.showList: if (len(self.wizard[currStep]["evaluatedlist"]) > 0): print "current:", self["list"].current nextStep = self["list"].current[1] if (self.wizard[currStep].has_key("listevaluation")): exec("self." + self.wizard[self.currStep]["listevaluation"] + "('" + nextStep + "')") else: self.currStep = self.getStepWithID(nextStep) if (currStep == self.numSteps): # 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) def ok(self): 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() if callable(getattr(self.configInstance, "runAsync", None)): self.onShown.remove(self.updateValues) self.configInstance.runAsync(self.finished) return else: self.configInstance.run() self.finished() def keyNumberGlobal(self, number): if (self.wizard[self.currStep]["config"]["screen"] != None): self.configInstance.keyNumberGlobal(number) def left(self): self.resetCounter() if (self.wizard[self.currStep]["config"]["screen"] != None): self.configInstance.keyLeft() print "left" def right(self): self.resetCounter() if (self.wizard[self.currStep]["config"]["screen"] != None): self.configInstance.keyRight() print "right" def up(self): self.resetCounter() 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]["evaluatedlist"]) > 0): self["list"].selectPrevious() if self.wizard[self.currStep].has_key("onselect"): print "current:", self["list"].current self.selection = self["list"].current[1] #self.selection = self.wizard[self.currStep]["evaluatedlist"][self["list"].l.getCurrentSelectionIndex()][1] exec("self." + self.wizard[self.currStep]["onselect"] + "()") print "up" def down(self): self.resetCounter() if (self.showConfig and self.wizard[self.currStep]["config"]["screen"] != None): self["config"].instance.moveSelection(self["config"].instance.moveDown) elif (self.showList and len(self.wizard[self.currStep]["evaluatedlist"]) > 0): #self["list"].instance.moveSelection(self["list"].instance.moveDown) self["list"].selectNext() if self.wizard[self.currStep].has_key("onselect"): print "current:", self["list"].current #self.selection = self.wizard[self.currStep]["evaluatedlist"][self["list"].l.getCurrentSelectionIndex()][1] #exec("self." + self.wizard[self.currStep]["onselect"] + "()") self.selection = self["list"].current[1] #self.selection = self.wizard[self.currStep]["evaluatedlist"][self["list"].l.getCurrentSelectionIndex()][1] exec("self." + self.wizard[self.currStep]["onselect"] + "()") print "down" def selChanged(self): self.resetCounter() 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]["evaluatedlist"]) > 0): if self.wizard[self.currStep].has_key("onselect"): self.selection = self["list"].current[1] print "self.selection:", self.selection exec("self." + self.wizard[self.currStep]["onselect"] + "()") def resetCounter(self): self.timeoutCounter = self.wizard[self.currStep]["timeout"] def runCode(self, code): if code != "": print "code", code exec(code) def updateText(self, firstset = False): text = _(self.wizard[self.currStep]["text"]) if text.find("[timeout]") != -1: text = text.replace("[timeout]", str(self.timeoutCounter)) self["text"].setText(text) else: if firstset: self["text"].setText(text) def updateValues(self): print "Updating values in step " + str(self.currStep) self.timeoutTimer.stop() 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 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(_("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) print "wizard text", _(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"]) if self.showList: print "showing list,", self.currStep for renderer in self.renderer: rootrenderer = renderer while renderer.source is not None: print "self.list:", self["list"] if renderer.source is self["list"]: print "setZPosition" rootrenderer.instance.setZPosition(1) renderer = renderer.source #self["list"].instance.setZPosition(1) self.list = [] if (self.wizard[self.currStep].has_key("dynamiclist")): print "dynamic list, calling", self.wizard[self.currStep]["dynamiclist"] newlist = eval("self." + self.wizard[self.currStep]["dynamiclist"] + "()") #self.wizard[self.currStep]["evaluatedlist"] = [] for entry in newlist: #self.wizard[self.currStep]["evaluatedlist"].append(entry) self.list.append(entry) #del self.wizard[self.currStep]["dynamiclist"] 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]), x[1])) self.wizard[self.currStep]["evaluatedlist"] = self.list self["list"].list = self.list self["list"].index = 0 else: self["list"].hide() 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: self["config"].hide() else: # condition false self.currStep += 1 self.updateValues() def timeoutCounterFired(self): self.timeoutCounter -= 1 print "timeoutCounter:", self.timeoutCounter if self.timeoutCounter == 0: if self.wizard[self.currStep]["timeoutaction"] == "selectnext": print "selection next item" self.down() else: if self.wizard[self.currStep]["timeoutaction"] == "changestep": self.finished(gotoStep = self.wizard[self.currStep]["timeoutstep"]) self.updateText() class WizardManager: def __init__(self): self.wizards = [] def registerWizard(self, wizard, precondition, priority = 0): 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 wizardManager = WizardManager()