revert non working "goto standby" after timerevent code (needs some work in
[enigma2.git] / lib / python / Screens / Menu.py
index dd88cb5f1ee4355634cd73ee147c66b6bfe9ea52..3cc459238de60c6b6526d349c3b99fe555d500f0 100644 (file)
@@ -1,12 +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.config import configfile
 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.Clock import Clock
+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
 
@@ -16,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>
 
 
@@ -37,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
@@ -78,24 +62,36 @@ menuupdater = MenuUpdater()
 class MenuSummary(Screen):
        skin = """
        <screen position="0,0" size="132,64">
 class MenuSummary(Screen):
        skin = """
        <screen position="0,0" size="132,64">
-               <widget name="MenuTitle" position="0,4" size="132,21" font="Regular;18" />
-               <widget name="MenuEntry" position="0,25" size="132,21" font="Regular;16" />
-               <widget name="Clock" position="50,46" size="82,18" font="Regular;16" />
+               <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("")
        </screen>"""
 
        def __init__(self, session, parent):
                Screen.__init__(self, session)
                self["MenuTitle"] = Label(parent.menu_title)
                self["MenuEntry"] = Label("")
-               self["Clock"] = Clock()
-               parent["menu"].onSelectionChanged.append(self.selectionChanged)
+               self["CurrentTime"] = Clock()
                self.parent = parent
                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()
                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):
 
        def selectionChanged(self):
                self["MenuEntry"].setText(self.parent["menu"].getCurrent()[0])
 
 class Menu(Screen):
+
+       ALLOW_SUSPEND = True
+
        def okbuttonClick(self):
                print "okbuttonClick"
                selection = self["menu"].getCurrent()
        def okbuttonClick(self):
                print "okbuttonClick"
                selection = self["menu"].getCurrent()
@@ -113,7 +109,7 @@ class Menu(Screen):
                # FIXME. somehow
                if arg[0] != "":
                        exec "from " + arg[0] + " import *"
                # FIXME. somehow
                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
@@ -126,15 +122,14 @@ 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
-                       x = getValbyAttr(node, "flushConfigOnClose")
-                       if x == "1":
-                               a = boundFunction(self.session.openWithCallback, self.menuClosedWithConfigFlush, Menu, node, node.childNodes)
-                       else:
-                               a = boundFunction(self.session.openWithCallback, self.menuClosed, Menu, node, node.childNodes)
-                       #TODO add check if !empty(node.childNodes)
-                       destList.append((MenuTitle, a))
+               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)
+               #TODO add check if !empty(node.childNodes)
+               destList.append((MenuTitle, a))
 
        def menuClosedWithConfigFlush(self, *res):
                configfile.save()
 
        def menuClosedWithConfigFlush(self, *res):
                configfile.save()
@@ -145,46 +140,51 @@ class Menu(Screen):
                        self.close(True)
 
        def addItem(self, destList, node):
                        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
@@ -195,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)   
                                                        
@@ -214,9 +220,9 @@ 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.menu_title = a
 
                self["title"] = Header(a)
                self.menu_title = a