remove onSelectionChanged callbacks before deleting the configInstance["config"]...
[enigma2.git] / lib / python / Screens / Setup.py
index f6fb09bdc90ceb270c9966a4058ceb79a9df8497..3ff0b76e3ed0f9d6f0361765aba8572ffefddca2 100644 (file)
@@ -1,13 +1,12 @@
 from Screen import Screen
 from Components.ActionMap import NumberActionMap
 from Screen import Screen
 from Components.ActionMap import NumberActionMap
-from Components.config import config
+from Components.config import config, ConfigNothing
+from Components.SystemInfo import SystemInfo
 from Components.ConfigList import ConfigListScreen
 from Components.Label import Label
 from Components.Pixmap import Pixmap
 
 import xml.dom.minidom
 from Components.ConfigList import ConfigListScreen
 from Components.Label import Label
 from Components.Pixmap import Pixmap
 
 import xml.dom.minidom
-from skin import elementsWithTag
-
 from Tools import XMLTools
 
 # FIXME: use resolveFile!
 from Tools import XMLTools
 
 # FIXME: use resolveFile!
@@ -55,28 +54,39 @@ class Setup(ConfigListScreen, Screen):
 
        ALLOW_SUSPEND = True
 
 
        ALLOW_SUSPEND = True
 
-       def __init__(self, session, setup):
-               Screen.__init__(self, session)
+       def removeNotifier(self):
+               config.usage.setup_level.notifiers.remove(self.levelChanged)
 
 
+       def levelChanged(self, configElement):
+               list = []
+               self.refill(list)
+               self["config"].setList(list)
+
+       def refill(self, list):
                xmldata = setupdom.childNodes[0]
                xmldata = setupdom.childNodes[0]
-               
                entries = xmldata.childNodes
                entries = xmldata.childNodes
-
-               self.onChangedEntry = [ ]
-               list = []
-                               
                for x in entries:             #walk through the actual nodelist
                        if x.nodeType != xml.dom.minidom.Element.nodeType:
                                continue
                        elif x.tagName == 'setup':
                for x in entries:             #walk through the actual nodelist
                        if x.nodeType != xml.dom.minidom.Element.nodeType:
                                continue
                        elif x.tagName == 'setup':
-                               if x.getAttribute("key") != setup:
+                               if x.getAttribute("key") != self.setup:
                                        continue
                                self.addItems(list, x.childNodes);
                                        continue
                                self.addItems(list, x.childNodes);
-                               myTitle = x.getAttribute("title").encode("UTF-8")
+                               self.setup_title = x.getAttribute("title").encode("UTF-8")
+
+       def __init__(self, session, setup):
+               Screen.__init__(self, session)
+
+               # for the skin: first try a setup_<setupID>, then Setup
+               self.skinName = ["setup_" + setup, "Setup" ]
+
+               self.onChangedEntry = [ ]
+
+               self.setup = setup
+               list = []
+               self.refill(list)
 
                #check for list.entries > 0 else self.close
 
                #check for list.entries > 0 else self.close
-               
-               self.setup_title = myTitle
                self["title"] = Label(_(self.setup_title))
 
                self["oktext"] = Label(_("OK"))
                self["title"] = Label(_(self.setup_title))
 
                self["oktext"] = Label(_("OK"))
@@ -113,6 +123,19 @@ class Setup(ConfigListScreen, Screen):
                        if x.nodeType != xml.dom.minidom.Element.nodeType:
                                continue
                        elif x.tagName == 'item':
                        if x.nodeType != xml.dom.minidom.Element.nodeType:
                                continue
                        elif x.tagName == 'item':
+                               item_level = int(x.getAttribute("level") or "0")
+
+                               if not self.levelChanged in config.usage.setup_level.notifiers:
+                                       config.usage.setup_level.notifiers.append(self.levelChanged)
+                                       self.onClose.append(self.removeNotifier)
+
+                               if item_level > config.usage.setup_level.index:
+                                       continue
+
+                               requires = x.getAttribute("requires")
+                               if requires and not SystemInfo.get(requires, False):
+                                       continue;
+
                                item_text = _(x.getAttribute("text").encode("UTF-8") or "??")
                                b = eval(XMLTools.mergeText(x.childNodes));
                                if b == "":
                                item_text = _(x.getAttribute("text").encode("UTF-8") or "??")
                                b = eval(XMLTools.mergeText(x.childNodes));
                                if b == "":
@@ -121,10 +144,12 @@ class Setup(ConfigListScreen, Screen):
                                item = b
                                # the first b is the item itself, ignored by the configList.
                                # the second one is converted to string.
                                item = b
                                # the first b is the item itself, ignored by the configList.
                                # the second one is converted to string.
-                               list.append( (item_text, item) )
+                               if not isinstance(item, ConfigNothing):
+                                       list.append( (item_text, item) )
 
 def getSetupTitle(id):
        xmldata = setupdom.childNodes[0].childNodes
 
 def getSetupTitle(id):
        xmldata = setupdom.childNodes[0].childNodes
-       for x in elementsWithTag(xmldata, "setup"):
+       for x in XMLTools.elementsWithTag(xmldata, "setup"):
                if x.getAttribute("key") == id:
                        return x.getAttribute("title").encode("UTF-8")
                if x.getAttribute("key") == id:
                        return x.getAttribute("title").encode("UTF-8")
+       raise "unknown setup id '%s'!" % repr(id)