from Screen import * from Components.MenuList import MenuList from Components.ActionMap import ActionMap from Components.Header import Header from Components.Button import Button from Components.Label import Label from Components.ProgressBar import ProgressBar from Tools.Directories import resolveFilename, SCOPE_SKIN from enigma import quitMainloop import xml.dom.minidom from xml.dom import EMPTY_NAMESPACE from skin import elementsWithTag from Screens.Setup import * from Tools import XMLTools # some screens def doGlobal(screen): screen["clock"] = Clock() # self.setModeTV() # self.setModeRadio() # self.setModeFile() # self.openDialog(ScartLoopThrough) # # read the menu menufile = file(resolveFilename(SCOPE_SKIN, 'menu.xml'), 'r') mdom = xml.dom.minidom.parseString(menufile.read()) menufile.close() def getValbyAttr(x, attr): for p in range(x.attributes.length): a = x.attributes.item(p) attrib = str(a.name) value = str(a.value) if attrib == attr: return value return "" class boundFunction: def __init__(self, fnc, *args): self.fnc = fnc self.args = args def __call__(self): self.fnc(*self.args) class MenuUpdater: def __init__(self): self.updatedMenuItems = {} def addMenuItem(self, id, pos, text, module, screen): if not self.updatedMenuAvailable(id): self.updatedMenuItems[id] = [] self.updatedMenuItems[id].append([text, pos, module, screen]) def delMenuItem(self, id, pos, text, module, screen): self.updatedMenuItems[id].remove([text, pos, module, screen]) def updatedMenuAvailable(self, id): return self.updatedMenuItems.has_key(id) def getUpdatedMenu(self, id): return self.updatedMenuItems[id] menuupdater = MenuUpdater() class Menu(Screen): def okbuttonClick(self): print "okbuttonClick" selection = self["menu"].getCurrent() selection[1]() def execText(self, text): exec text def runScreen(self, arg): # arg[0] is the module (as string) # arg[1] is Screen inside this module # plus possible arguments, as # string (as we want to reference # stuff which is just imported) # FIXME. somehow print arg if arg[0] != "": exec "from " + arg[0] + " import *" self.openDialog(*eval(arg[1])) def nothing(self): #dummy pass def openDialog(self, *dialog): # in every layer needed self.session.open(*dialog) def openSetup(self, dialog): self.session.open(Setup, dialog) def addMenu(self, destList, node): MenuTitle = _(getValbyAttr(node, "text")) if MenuTitle != "": #check for title a = boundFunction(self.session.open, Menu, node, node.childNodes) #TODO add check if !empty(node.childNodes) destList.append((MenuTitle, a)) def addItem(self, destList, node): ItemText = _(getValbyAttr(node, "text")) if ItemText != "": #check for name for x in node.childNodes: if x.nodeType != xml.dom.minidom.Element.nodeType: continue elif x.tagName == 'screen': module = getValbyAttr(x, "module") screen = getValbyAttr(x, "screen") if len(screen) == 0: screen = module if module != "": module = "Screens." + module # check for arguments. they will be appended to the # openDialog call args = XMLTools.mergeText(x.childNodes) screen += ", " + args destList.append((ItemText, boundFunction(self.runScreen, (module, screen)))) return elif x.tagName == 'code': destList.append((ItemText, boundFunction(self.execText, XMLTools.mergeText(x.childNodes)))) return elif x.tagName == 'setup': id = getValbyAttr(x, "id") destList.append((ItemText, boundFunction(self.openSetup, id))) return destList.append((ItemText,self.nothing)) def __init__(self, session, parent, childNode): Screen.__init__(self, session) list = [] menuID = "" menuID = -1 for x in childNode: #walk through the actual nodelist if x.nodeType != xml.dom.minidom.Element.nodeType: continue elif x.tagName == 'item': self.addItem(list, x) count += 1 elif x.tagName == 'menu': self.addMenu(list, x) count += 1 elif x.tagName == "id": menuID = getValbyAttr(x, "val") count = 0 if menuID != -1: if menuupdater.updatedMenuAvailable(menuID): for x in menuupdater.getUpdatedMenu(menuID): if x[1] == count: list.append((x[0], boundFunction(self.runScreen, (x[2], x[3] + ", ")))) count += 1 self["menu"] = MenuList(list) self["actions"] = ActionMap(["OkCancelActions", "MenuActions"], { "ok": self.okbuttonClick, "cancel": self.close, "menu": self.close }) a = getValbyAttr(parent, "title") if a == "": #if empty use name a = _(getValbyAttr(parent, "text")) self["title"] = Header(a) class MainMenu(Menu): #add file load functions for the xml-file def __init__(self, *x): Menu.__init__(self, *x) self.skinName = "Menu" def openDialog(self, dialog): self.session.open(dialog) def openSetup(self, dialog): self.session.open(Setup, dialog) def setModeTV(self): print "set Mode to TV" pass def setModeRadio(self): print "set Mode to Radio" pass def setModeFile(self): print "set Mode to File" pass