diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2005-10-08 01:59:58 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2005-10-08 01:59:58 +0000 |
| commit | 55bd830d52a2961ec57a6dec5969e8e7c0294c35 (patch) | |
| tree | eb4d0cade4bb6b18184a9bd1d3e712393f4e942e | |
| parent | eb6651bbeae9a279474d2e52be177fa5bfbea9f2 (diff) | |
| download | enigma2-55bd830d52a2961ec57a6dec5969e8e7c0294c35.tar.gz enigma2-55bd830d52a2961ec57a6dec5969e8e7c0294c35.zip | |
menu: new syntax which fixes the import problems
| -rw-r--r-- | data/menu.xml | 60 | ||||
| -rw-r--r-- | lib/python/Screens/Menu.py | 56 |
2 files changed, 81 insertions, 35 deletions
diff --git a/data/menu.xml b/data/menu.xml index 73ae3c07..b3d6208a 100644 --- a/data/menu.xml +++ b/data/menu.xml @@ -1,11 +1,25 @@ <menu text="Mainmenu" title="Mainmenu"> + +<!-- the following types are allowed: + <screen [module="mod"] [screen="classname"]>[arguments]</screen> + executes Screen called "classname" from module "Screen.mod" + if no module is given, Screen must be globally available. + if no screen is given, module is used as screen class name. + arguments must be comma seperated (will be fed to eval), and can + use stuff from module + (of course you must specify at least one of module, screen.) + <setup id="id" /> + opens a setup with specified id + <code> .. code .. </code> + "exec"s code +--> <!--<item text="Standby debug">quitMainloop()</item> <item text="Networksetup">self.openSetup("network")</item>--> - <item text="Satelliteconfig">self.openDialog(NimSelection)</item> - <item text="Radio"></item> - <item text="Timer">self.openDialog(TimerEditList)</item> - <item text="Information">self.openDialog(About)</item> - <item text="Games / Plugins">self.openDialog(PluginBrowser)</item> + <item text="Satelliteconfig"><screen module="Satconfig" screen="NimSelection" /></item> + <item text="Radio"><code>print "radio mode"</code></item> + <item text="Timer"><screen module="TimerEdit" screen="TimerEditList" /></item> + <item text="Information"><screen module="About" /></item> + <item text="Games / Plugins"><screen module="PluginBrowser" /></item> <menu text="Setup"> <menu text="Service Organising"> <item text="New Bouquets"></item> @@ -13,33 +27,33 @@ <item text="Edit Bouquets"></item> </menu> <menu text="Service Searching"> - <item text="Satelliteconfig">self.openDialog(Satconfig)</item> + <item text="Satelliteconfig"><screen module="Satconfig" /></item> <!--<item text="Satelliteconfig">self.openSetup("satconfig")</item>--> - <item text="Automatic Scan">self.openDialog(ServiceScan)</item> - <item text="Manual Scan">self.openDialog(ServiceScan)</item> + <item text="Automatic Scan"><screen name="ServiceScan" /></item> + <item text="Manual Scan"><screen name="ServiceScan" /></item> <item text="Rotor Control"></item> <item text="Edit Transponder"></item> <!--<item text="Satfinder"></item>--> </menu> <menu text="System"> - <item text="Timezone">self.openSetup("timezone")</item> - <item text="Video Audio">self.openSetup("avsetup")</item> - <item text="UHF Modulator">self.openSetup("rfmod")</item> - <item text="Harddisk">self.openDialog(HarddiskSelection)</item> - <item text="Remote Control">self.openSetup("rc")</item> - <item text="Keyboard">self.openSetup("keyboard")</item> - <item text="OSD">self.openSetup("osd")</item> - <item text="LCD">self.openSetup("lcd")</item> - <item text="Networksetup">self.openSetup("network")</item> + <item text="Timezone"><setup id="timezone" /></item> + <item text="Video Audio"><setup id="avsetup" /></item> + <item text="UHF Modulator"><setup id="rfmod" /></item> + <item text="Harddisk"><screen module="HarddiskSelection" /></item> + <item text="Remote Control"><setup id="rc" /></item> + <item text="Keyboard"><setup id="keyboard" /></item> + <item text="OSD"><setup id="osd" /></item> + <item text="LCD"><setup id="lcd" /></item> + <item text="Networksetup"><setup id="network" /></item> </menu> <item text="Common Interface"></item> - <item text="Parental Control">self.openSetup("parental")</item> - <item text="Expert">self.openSetup("expert")</item> + <item text="Parental Control"><setup id="parental" /></item> + <item text="Expert"><setup id="expert" /></item> </menu> <!--<item text="Unser Setup">self.openSetup("Blaselfasel")</item>--> <menu text="Standby / Restart"> - <item text="Standby">quitMainloop()</item> - <item text="Restart">quitMainloop()</item> - <item text="Deep Standby">quitMainloop()</item> + <item text="Standby"><code>quitMainloop()</code></item> + <item text="Restart"><code>quitMainloop()</code></item> + <item text="Deep Standby"><code>quitMainloop()</code></item> </menu> - </menu>
\ No newline at end of file +</menu> diff --git a/lib/python/Screens/Menu.py b/lib/python/Screens/Menu.py index c0e6ad06..9eefddf7 100644 --- a/lib/python/Screens/Menu.py +++ b/lib/python/Screens/Menu.py @@ -12,7 +12,6 @@ import xml.dom.minidom from xml.dom import EMPTY_NAMESPACE from skin import elementsWithTag -from Screens.Satconfig import NimSelection from Screens.Setup import * from Tools import XMLTools @@ -33,14 +32,13 @@ def doGlobal(screen): try: # first we search in the current path menufile = file('data/menu.xml', 'r') -except: +except IOError: # if not found in the current path, we use the global datadir-path menufile = file('/usr/share/enigma2/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) @@ -64,14 +62,26 @@ class Menu(Screen): selection = self["menu"].getCurrent() selection[1]() - def evalText(self, text): - eval(text) + 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. + if arg[0] != "": + exec "from Screens." + 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 openDialog(self, *dialog): # in every layer needed + self.session.open(*dialog) def openSetup(self, dialog): self.session.open(Setup, dialog) @@ -86,11 +96,33 @@ class Menu(Screen): def addItem(self, destList, node): ItemText = getValbyAttr(node, "text") if ItemText != "": #check for name - b = XMLTools.mergeText(node.childNodes) - if b != "": #check for function - destList.append((ItemText,boundFunction(self.evalText,b))) - else: - destList.append((ItemText,self.nothing)) #use dummy as function + 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 + + # 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) |
