fill movielist only once
[vuplus_dvbapp] / lib / python / Screens / Menu.py
index 68a8ef9..4181874 100644 (file)
@@ -1,10 +1,12 @@
-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 Tools.Directories import resolveFilename, SCOPE_SKIN
 
 
 from Tools.Directories import resolveFilename, SCOPE_SKIN
 
@@ -18,11 +20,6 @@ from Screens.Setup import *
 
 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>
@@ -57,13 +54,13 @@ class MenuUpdater:
        def __init__(self):
                self.updatedMenuItems = {}
        
        def __init__(self):
                self.updatedMenuItems = {}
        
-       def addMenuItem(self, id, text, module, screen):
+       def addMenuItem(self, id, pos, text, module, screen):
                if not self.updatedMenuAvailable(id):
                        self.updatedMenuItems[id] = []
                if not self.updatedMenuAvailable(id):
                        self.updatedMenuItems[id] = []
-               self.updatedMenuItems[id].append([text, module, screen])
+               self.updatedMenuItems[id].append([text, pos, module, screen])
        
        
-       def delMenuItem(self, id, text, module, screen):
-               self.updatedMenuItems[id].remove([text, module, screen])
+       def delMenuItem(self, id, pos, text, module, screen):
+               self.updatedMenuItems[id].remove([text, pos, module, screen])
        
        def updatedMenuAvailable(self, id):
                return self.updatedMenuItems.has_key(id)
        
        def updatedMenuAvailable(self, id):
                return self.updatedMenuItems.has_key(id)
@@ -72,7 +69,36 @@ 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="0,4" size="132,21" font="Regular;18" />
+               <widget name="MenuEntry" position="0,25" size="132,21" font="Regular;16" />
+               <widget source="CurrentTime" render="Label" position="50,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):
        def okbuttonClick(self):
                print "okbuttonClick"
 class Menu(Screen):
        def okbuttonClick(self):
                print "okbuttonClick"
@@ -81,7 +107,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,7 +115,6 @@ 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 *"
                        
@@ -102,15 +127,27 @@ class Menu(Screen):
                self.session.open(*dialog)
 
        def openSetup(self, dialog):
                self.session.open(*dialog)
 
        def openSetup(self, dialog):
-               self.session.open(Setup, dialog)
+               self.session.openWithCallback(self.menuClosed, Setup, dialog)
 
        def addMenu(self, destList, node):
                MenuTitle = _(getValbyAttr(node, "text"))
                if MenuTitle != "":                                                                                                                                     #check for title
 
        def addMenu(self, destList, node):
                MenuTitle = _(getValbyAttr(node, "text"))
                if MenuTitle != "":                                                                                                                                     #check for title
-                       a = boundFunction(self.session.open, Menu, node, node.childNodes)
+                       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))
                        #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):
                ItemText = _(getValbyAttr(node, "text"))
                if ItemText != "":                                                                                                                                      #check for name
        def addItem(self, destList, node):
                ItemText = _(getValbyAttr(node, "text"))
                if ItemText != "":                                                                                                                                      #check for name
@@ -151,33 +188,50 @@ class Menu(Screen):
                list = []
                menuID = ""
 
                list = []
                menuID = ""
 
-               for x in childNode:                                                     #walk through the actual nodelist
+               menuID = -1
+               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)
                        if x.nodeType != xml.dom.minidom.Element.nodeType:
                            continue
                        elif x.tagName == 'item':
                                self.addItem(list, x)
+                               count += 1
                        elif x.tagName == 'menu':
                                self.addMenu(list, x)
                        elif x.tagName == 'menu':
                                self.addMenu(list, x)
+                               count += 1
                        elif x.tagName == "id":
                                menuID = getValbyAttr(x, "val")
                        elif x.tagName == "id":
                                menuID = getValbyAttr(x, "val")
+                               count = 0
+                       if menuID != -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 menuupdater.updatedMenuAvailable(menuID):
-                       for x in menuupdater.getUpdatedMenu(menuID):
-                               list.append((x[0], boundFunction(self.runScreen, (x[1], x[2] + ", "))))
 
                self["menu"] = MenuList(list)   
                                                        
                self["actions"] = ActionMap(["OkCancelActions", "MenuActions"], 
                        {
                                "ok": self.okbuttonClick,
 
                self["menu"] = MenuList(list)   
                                                        
                self["actions"] = ActionMap(["OkCancelActions", "MenuActions"], 
                        {
                                "ok": self.okbuttonClick,
-                               "cancel": self.close,
-                               "menu": self.close
+                               "cancel": self.closeNonRecursive,
+                               "menu": self.closeRecursive
                        })
                
                a = getValbyAttr(parent, "title")
                if a == "":                                                                                                             #if empty use name
                        a = _(getValbyAttr(parent, "text"))
                self["title"] = Header(a)
                        })
                
                a = getValbyAttr(parent, "title")
                if a == "":                                                                                                             #if empty use name
                        a = _(getValbyAttr(parent, "text"))
                self["title"] = Header(a)
+               self.menu_title = a
+
+       def closeNonRecursive(self):
+               self.close(False)
+
+       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