ignore show requests when no instance available yet
[enigma2.git] / lib / python / Screens / Menu.py
index 2a7055cf9dca633fa961876917c32437d835a64e..34c534b5a1fefa6398bc55e644e74756901d73e2 100644 (file)
@@ -1,34 +1,27 @@
-from Screen import *
-from Components.MenuList import MenuList
+from Screen import Screen
+from Components.Sources.List import List
 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
 
-from enigma import quitMainloop
-
 import xml.dom.minidom
 from xml.dom import EMPTY_NAMESPACE
 from skin import elementsWithTag
 
 import xml.dom.minidom
 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 +30,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,21 +60,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="Clock" position="50,46" size="82,18" font="Regular;19" />
-               <widget name="MenuTitle" position="0,4" size="132,21" font="Regular;19" />
-               <widget name="MenuEntry" position="0,25" size="132,21" font="Regular;19" />
+               <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()
+               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 setCurrentEntry(self, entry):
-               self["MenuEntry"].setText(entry)
+       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()
@@ -110,28 +107,27 @@ 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]))
 
                self.openDialog(*eval(arg[1]))
 
-       def nothing(self):                                                                                                                                      #dummy
+       def nothing(self): #dummy
                pass
 
        def openDialog(self, *dialog):                          # in every layer needed
                pass
 
        def openDialog(self, *dialog):                          # in every layer needed
-               self.session.open(*dialog)
+               self.session.openWithCallback(self.menuClosed, *dialog)
 
        def openSetup(self, dialog):
                self.session.openWithCallback(self.menuClosed, Setup, dialog)
 
        def addMenu(self, destList, node):
 
        def openSetup(self, dialog):
                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()
@@ -142,46 +138,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
@@ -192,18 +193,23 @@ 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"].onSelectionChanged.append(self.selectionChanged)
+               self["menu"] = List(list)       
                                                        
                self["actions"] = ActionMap(["OkCancelActions", "MenuActions"], 
                        {
                                                        
                self["actions"] = ActionMap(["OkCancelActions", "MenuActions"], 
                        {
@@ -212,9 +218,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
 
@@ -227,32 +233,9 @@ class Menu(Screen):
        def createSummary(self):
                return MenuSummary
 
        def createSummary(self):
                return MenuSummary
 
-       def selectionChanged(self):
-               entry = self["menu"].getCurrent()[0]
-               for x in self.summaries:
-                       x.setCurrentEntry(entry)
-
 class MainMenu(Menu):
        #add file load functions for the xml-file
        
        def __init__(self, *x):
                Menu.__init__(self, *x)
                self.skinName = "Menu"
 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