add auto vcr switching support (needs new drivers (fp.ko))
[enigma2.git] / lib / python / Screens / Menu.py
index db41cd57963ca37142d5c158e5ada7bafdcbec68..3cc459238de60c6b6526d349c3b99fe555d500f0 100644 (file)
@@ -1,10 +1,13 @@
-from Screen import *
-from Components.MenuList import MenuList
+from Screen import Screen
+from Components.Sources.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 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 Components.config import configfile
+from Components.Sources.Clock import Clock
+from Components.PluginComponent import plugins
 
 from Tools.Directories import resolveFilename, SCOPE_SKIN
 
 
 from Tools.Directories import resolveFilename, SCOPE_SKIN
 
@@ -14,19 +17,13 @@ import xml.dom.minidom
 from xml.dom import EMPTY_NAMESPACE
 from skin import elementsWithTag
 
 from xml.dom import EMPTY_NAMESPACE
 from skin import elementsWithTag
 
-from Screens.Setup import *
+from Screens.Setup import Setup, getSetupTitle
 
 from Tools import XMLTools
 
 
 from Tools import XMLTools
 
-# some screens
-def doGlobal(screen):
-       screen["clock"] = Clock()
-
-
 #              <item text="TV-Mode">self.setModeTV()</item>
 #              <item text="Radio-Mode">self.setModeRadio()</item>
 #              <item text="File-Mode">self.setModeFile()</item>
 #              <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="Sleep Timer"></item>
 
 
 #                      <item text="Sleep Timer"></item>
 
 
@@ -35,17 +32,6 @@ menufile = file(resolveFilename(SCOPE_SKIN, 'menu.xml'), 'r')
 mdom = xml.dom.minidom.parseString(menufile.read())
 menufile.close()
 
 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
 class boundFunction:
        def __init__(self, fnc, *args):
                self.fnc = fnc
@@ -72,8 +58,40 @@ class MenuUpdater:
                return self.updatedMenuItems[id]
        
 menuupdater = MenuUpdater()
                return self.updatedMenuItems[id]
        
 menuupdater = MenuUpdater()
-               
+
+class MenuSummary(Screen):
+       skin = """
+       <screen position="0,0" size="132,64">
+               <widget name="MenuTitle" position="6,4" size="120,21" font="Regular;18" />
+               <widget name="MenuEntry" position="6,25" size="120,21" font="Regular;16" />
+               <widget source="CurrentTime" render="Label" position="56,46" size="82,18" font="Regular;16" >
+                       <convert type="ClockToText">WithSeconds</convert>
+               </widget>
+       </screen>"""
+
+       def __init__(self, session, parent):
+               Screen.__init__(self, session)
+               self["MenuTitle"] = Label(parent.menu_title)
+               self["MenuEntry"] = Label("")
+               self["CurrentTime"] = Clock()
+               self.parent = parent
+               self.onShow.append(self.addWatcher)
+               self.onHide.append(self.removeWatcher)
+       
+       def addWatcher(self):
+               self.parent["menu"].onSelectionChanged.append(self.selectionChanged)
+               self.selectionChanged()
+       
+       def removeWatcher(self):
+               self.parent["menu"].onSelectionChanged.remove(self.selectionChanged)
+
+       def selectionChanged(self):
+               self["MenuEntry"].setText(self.parent["menu"].getCurrent()[0])
+
 class Menu(Screen):
 class Menu(Screen):
+
+       ALLOW_SUSPEND = True
+
        def okbuttonClick(self):
                print "okbuttonClick"
                selection = self["menu"].getCurrent()
        def okbuttonClick(self):
                print "okbuttonClick"
                selection = self["menu"].getCurrent()
@@ -81,7 +99,7 @@ class Menu(Screen):
 
        def execText(self, text):
                exec 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 
        def runScreen(self, arg):
                # arg[0] is the module (as string)
                # arg[1] is Screen inside this module 
@@ -89,10 +107,9 @@ class Menu(Screen):
                #        string (as we want to reference 
                #        stuff which is just imported)
                # FIXME. somehow
                #        string (as we want to reference 
                #        stuff which is just imported)
                # FIXME. somehow
-               print arg
                if arg[0] != "":
                        exec "from " + arg[0] + " import *"
                if arg[0] != "":
                        exec "from " + arg[0] + " import *"
-                       
+
                self.openDialog(*eval(arg[1]))
 
        def nothing(self):                                                                                                                                      #dummy
                self.openDialog(*eval(arg[1]))
 
        def nothing(self):                                                                                                                                      #dummy
@@ -105,57 +122,69 @@ class Menu(Screen):
                self.session.openWithCallback(self.menuClosed, Setup, dialog)
 
        def addMenu(self, destList, node):
                self.session.openWithCallback(self.menuClosed, Setup, dialog)
 
        def addMenu(self, destList, node):
-               MenuTitle = _(getValbyAttr(node, "text"))
-               if MenuTitle != "":                                                                                                                                     #check for title
+               MenuTitle = _(node.getAttribute("text").encode("UTF-8") or "??")
+               x = node.getAttribute("flushConfigOnClose")
+               if x:
+                       a = boundFunction(self.session.openWithCallback, self.menuClosedWithConfigFlush, Menu, node, node.childNodes)
+               else:
                        a = boundFunction(self.session.openWithCallback, self.menuClosed, Menu, node, node.childNodes)
                        a = boundFunction(self.session.openWithCallback, self.menuClosed, Menu, node, node.childNodes)
-                       #TODO add check if !empty(node.childNodes)
-                       destList.append((MenuTitle, a))
+               #TODO add check if !empty(node.childNodes)
+               destList.append((MenuTitle, a))
+
+       def menuClosedWithConfigFlush(self, *res):
+               configfile.save()
+               self.menuClosed(*res)
 
        def menuClosed(self, *res):
                if len(res) and res[0]:
                        self.close(True)
 
        def addItem(self, destList, node):
 
        def menuClosed(self, *res):
                if len(res) and res[0]:
                        self.close(True)
 
        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
+               item_text = node.getAttribute("text").encode("UTF-8")
+               for x in node.childNodes:
+                       if x.nodeType != xml.dom.minidom.Element.nodeType:
+                               continue
+                       elif x.tagName == 'screen':
+                               module = x.getAttribute("module") or None
+                               screen = x.getAttribute("screen") or None
+
+                               if screen is None:
+                                       screen = module
+
+                               print module, screen
+                               if module:
+                                       module = "Screens." + module
+                               else:
+                                       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))
+                               destList.append((_(item_text or "??"), boundFunction(self.runScreen, (module, screen))))
+                               return
+                       elif x.tagName == 'code':
+                               destList.append((_(item_text or "??"), boundFunction(self.execText, XMLTools.mergeText(x.childNodes))))
+                               return
+                       elif x.tagName == 'setup':
+                               id = x.getAttribute("id")
+                               if item_text == "":
+                                       item_text = _(getSetupTitle(id)) + "..."
+                               else:
+                                       item_text = _(item_text)
+                               destList.append((item_text, boundFunction(self.openSetup, id)))
+                               return
+               
+               destList.append((item_text,self.nothing))
 
 
        def __init__(self, session, parent, childNode):
                Screen.__init__(self, session)
                
                list = []
 
 
        def __init__(self, session, parent, childNode):
                Screen.__init__(self, session)
                
                list = []
-               menuID = ""
-
-               menuID = -1
+               
+               menuID = None
                for x in childNode:                                             #walk through the actual nodelist
                        if x.nodeType != xml.dom.minidom.Element.nodeType:
                            continue
                for x in childNode:                                             #walk through the actual nodelist
                        if x.nodeType != xml.dom.minidom.Element.nodeType:
                            continue
@@ -166,15 +195,21 @@ class Menu(Screen):
                                self.addMenu(list, x)
                                count += 1
                        elif x.tagName == "id":
                                self.addMenu(list, x)
                                count += 1
                        elif x.tagName == "id":
-                               menuID = getValbyAttr(x, "val")
+                               menuID = x.getAttribute("val")
                                count = 0
                                count = 0
-                       if menuID != -1:
+
+                       if menuID is not None:
+                               # menuupdater?
                                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
 
                                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
 
+               if menuID is not None:
+                       # plugins
+                       for l in plugins.getPluginsForMenu(menuID):
+                               list.append((l[0], boundFunction(l[1], self.session)))
 
                self["menu"] = MenuList(list)   
                                                        
 
                self["menu"] = MenuList(list)   
                                                        
@@ -185,10 +220,11 @@ class Menu(Screen):
                                "menu": self.closeRecursive
                        })
                
                                "menu": self.closeRecursive
                        })
                
-               a = getValbyAttr(parent, "title")
-               if a == "":                                                                                                             #if empty use name
-                       a = _(getValbyAttr(parent, "text"))
+               a = parent.getAttribute("title").encode("UTF-8") or None
+               if a is None:
+                       a = _(parent.getAttribute("text").encode("UTF-8"))
                self["title"] = Header(a)
                self["title"] = Header(a)
+               self.menu_title = a
 
        def closeNonRecursive(self):
                self.close(False)
 
        def closeNonRecursive(self):
                self.close(False)
@@ -196,6 +232,9 @@ class Menu(Screen):
        def closeRecursive(self):
                self.close(True)
 
        def closeRecursive(self):
                self.close(True)
 
+       def createSummary(self):
+               return MenuSummary
+
 class MainMenu(Menu):
        #add file load functions for the xml-file
        
 class MainMenu(Menu):
        #add file load functions for the xml-file