added xml-menu
[enigma2.git] / screens.py
index 98cc7cb..ec81c2d 100644 (file)
@@ -2,6 +2,11 @@ from components import *
 import sys
 from enigma import quitMainloop
 
+import xml.dom.minidom
+from xml.dom import EMPTY_NAMESPACE
+from skin import elementsWithTag
+
+
 # some screens
 def doGlobal(screen):
        screen["clock"] = Clock()
@@ -38,6 +43,132 @@ class Screen(dict, HTMLSkin, GUISkin):
        def close(self, retval=None):
                self.session.close()
 
+
+mdom = xml.dom.minidom.parseString(
+        """
+       <menu text="Mainmenu" title="the real Mainmenu">
+               <item text="TV-Mode">self.setModeTV()</item>
+               <item text="Radio-Mode">self.setModeRadio()</item>
+               <item text="File-Mode">self.setModeFile()</item>
+               <item text="Scart">self.openDialog(ScartLoopThrough)</item>
+               <item text="Timer"></item>
+               <menu text="Setup">
+                       <menu text="Service Organising">
+                               <item text="New Bouquets"></item>
+                               <item text="Add to Bouquets"></item>
+                               <item text="Edit Bouquets"></item>
+                       </menu>
+                       <menu text="Service Searching">
+                               <item text="Satelliteconfig"></item>
+                               <item text="Satfinder"></item>
+                               <item text="Rotor Control"></item>
+                               <item text="Edit Transponder"></item>
+                               <item text="Automatic Scan">self.openDialog(serviceScan)</item>
+                               <item text="Automatic 'Multisat' Scan"></item>
+                               <item text="Manual Scan"></item>
+                       </menu>
+                       <menu text="System">
+                               <item text="Time Date"></item>
+                               <item text="Video Audio"></item>
+                               <item text="UHF Modulator"></item>
+                               <item text="Harddisk"></item>
+                               <item text="Keyboard"></item>
+                               <item text="OSD">self.openDialog(configOSD)</item>
+                               <item text="Language"></item>
+                               <item text="LCD"></item>
+                       </menu>
+                       <item text="Common Interface"></item>
+                       <item text="Parental Control"></item>
+                       <item text="Expert"></item>
+               </menu>
+               <item text="Games"></item>
+               <item text="Information"></item>
+               <menu text="Standby">
+                       <item text="PowerOff"></item>
+                       <item text="Restart"></item>
+                       <item text="Standby"></item>
+                       <item text="Sleep Timer">self.goSetup()</item>
+               </menu>
+               <item text="Standby debug">quitMainloop()</item>
+       </menu>""")
+
+def getText(nodelist):
+       rc = ""
+       for node in nodelist:
+               if node.nodeType == node.TEXT_NODE:
+                       rc = rc + node.data
+       return rc
+
+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 configOSD(Screen):
+       #this needs focus handling - so not useable
+
+       def okbuttonClick(self):
+               self.close
+       def __init__(self, session):
+               Screen.__init__(self, session)
+
+               self["actions"] = ActionMap(["OkCancelActions"], 
+                       {
+                               "ok": self.okbuttonClick,
+                               "cancel": self.close
+                       })
+
+               self["okbutton"] = Button("Save")
+
+               self["txt_alpha"] = Label("Alpha:")
+               self["sld_alpha"] = ProgressBar()
+               self["sld_alpha"].setValue(50)
+
+               self["txt_brightness"] = Label("Brightness:")
+               self["sld_brightness"] = ProgressBar()
+               self["sld_brightness"].setValue(50)
+
+               self["txt_gamma"] = Label("Contrast:")
+               self["sld_gamma"] = ProgressBar()
+               self["sld_gamma"].setValue(50)
+
+
+class ScartLoopThrough(Screen):
+       def __init__(self, session):
+               Screen.__init__(self, session)
+
+               self["actions"] = ActionMap(["OkCancelActions"], 
+                       {
+                               "cancel": self.close
+                       })
+
+class ConfigMenu(Screen):
+       #create a generic class for view/edit settings
+       #all stuff come from xml file
+       #configtype / datasource / validate-call / ...
+
+       def __init__(self, session):
+               Screen.__init__(self, session)
+
+               self["actions"] = ActionMap(["OkCancelActions"], 
+                       {
+                               #"ok": self.okbuttonClick,
+                               "cancel": self.close
+                       })
+
 class configTest(Screen):
 
        def __init__(self, session):
@@ -57,17 +188,28 @@ class configTest(Screen):
                        })
                
 
-class mainMenu(Screen):
-       
+class Menu(Screen):
+       #add file load functions for the xml-file
+       #remove old code (i.e. goScan / goClock...)
+
+       def openDialog(self, dialog):
+               self.session.open(dialog)
+
        def goSetup(self):
                self.session.open(configTest)
        
-       def goTimeshift(self):
-               self["title"].setText("JUST PRESS THE YELLOW BUTTON!")
-       
-       def goHDTV(self):
-               self["title"].setText("HDTV GREEN FLASHES: ENABLED")
-       
+       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
+
        def goScan(self):
                self.session.open(serviceScan)
        
@@ -77,39 +219,68 @@ class mainMenu(Screen):
        def okbuttonClick(self):
                selection = self["menu"].getCurrent()
                selection[1]()
-       
-       def __init__(self, session):
+
+       def evalText(self, text):
+               eval(text)
+               
+       def nothing(self):                                                                                                                                      #dummy
+               pass
+
+       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
+                       b = getText(node.childNodes)
+                       if b != "":                                                                                                                                                             #check for function
+                               destList.append((ItemText,boundFunction(self.evalText,b)))
+                       else:
+                               destList.append((ItemText,self.nothing))                                #use dummy as function
+
+       def __init__(self, session, parent, childNode):
                Screen.__init__(self, session)
-               b = Button("ok")
+               
+               list = []
+
+               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)
+                       elif x.tagName == 'menu':
+                               self.addMenu(list, x)
 
+               self["menu"] = MenuList(list)   
+                                                       
                self["actions"] = ActionMap(["OkCancelActions"], 
                        {
                                "ok": self.okbuttonClick,
                                "cancel": self.close
                        })
-
-               b.onClick = [ self.okbuttonClick ]
-               self["okbutton"] = b
-               self["title"] = Header("Main Menu! - press ok to leave!")
-               self["menu"] = MenuList(
-                       [
-                               ("Close Main Menu", self.close),
-                               ("Service Scan", self.goScan),
-                               ("Quit", quitMainloop),
-                               ("setup", self.goSetup),
-                               ("TIMESHIFT SETUP", self.goTimeshift),
-                               ("HDTV PIP CONFIG", self.goHDTV),
-                               ("wie spaet ists?!", self.goClock)
-                       ])
+               
+               a = getValbyAttr(parent, "title")
+               if a == "":                                                                                                             #if empty use name
+                       a = getValbyAttr(parent, "text")
+               self["title"] = Header(a)
 
 class channelSelection(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
+
+               self["key_red"] = Button("red")
+               self["key_green"] = Button("green")
+               self["key_yellow"] = Button("yellow")
+               self["key_blue"] = Button("blue")
                
                self["list"] = ServiceList()
                self["list"].setRoot(eServiceReference("""1:0:1:0:0:0:0:0:0:0:(provider=="ARD") && (type == 1)"""))
                
-               self["okbutton"] = Button("ok", [self.channelSelected])
+               #self["okbutton"] = Button("ok", [self.channelSelected])
                
                class ChannelActionMap(ActionMap):
                        def action(self, contexts, action):
@@ -137,16 +308,29 @@ class channelSelection(Screen):
        def channelSelected(self):
                self.session.nav.playService(self["list"].getCurrent())
                self.close()
-               pass
+
+       #called from infoBar
+       def zapUp(self):
+               self["list"].moveUp()
+               self.session.nav.playService(self["list"].getCurrent())
+
+       def zapDown(self):
+               self["list"].moveDown()
+               self.session.nav.playService(self["list"].getCurrent())
 
 class infoBar(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
+
+               #instantiate forever
+               self["ServiceList"] = self.session.instantiateDialog(channelSelection)
                
                self["actions"] = ActionMap( [ "InfobarActions" ], 
                        {
                                "switchChannel": self.switchChannel,
-                               "mainMenu": self.mainMenu
+                               "mainMenu": self.mainMenu,
+                               "zapUp": self.zapUp,
+                               "zapDown": self.zapDown
                        })
                self["okbutton"] = Button("mainMenu", [self.mainMenu])
                
@@ -161,10 +345,19 @@ class infoBar(Screen):
                self["Event_Next_Duration"] = EventInfo(self.session.nav, EventInfo.Next_Duration)
        
        def mainMenu(self):
-               self.session.open(mainMenu)
-               
-       def switchChannel(self):
-               self.session.open(channelSelection)
+               print "loading mainmenu XML..."
+               menu = mdom.childNodes[0]
+               assert menu.tagName == "menu", "root element in menu must be 'menu'!"
+               self.session.open(Menu, menu, menu.childNodes)
+
+       def switchChannel(self):        
+               self.session.execDialog(self["ServiceList"])
+
+       def     zapUp(self):
+               self["ServiceList"].zapUp()
+
+       def     zapDown(self):
+               self["ServiceList"].zapDown()
 
 # a clock display dialog
 class clockDisplay(Screen):