add FritzCall (uses twisted to display incoming calls on a fritzbox fon on screen)
[enigma2.git] / skin.py
diff --git a/skin.py b/skin.py
index a1ce50b3a533438c0c645c1f892f591a41c95e3d..1aced44c16320df33b6ec764ee2f9a10c71ebc97 100644 (file)
--- a/skin.py
+++ b/skin.py
@@ -4,6 +4,8 @@ from xml.dom import EMPTY_NAMESPACE
 from Tools.Import import my_import
 import os
 
+from Components.config import ConfigSubsection, configElement, configText, config
+
 from Tools.XMLTools import elementsWithTag, mergeText
 
 colorNames = dict()
@@ -18,6 +20,13 @@ def dump(x, i=0):
 
 from Tools.Directories import resolveFilename, SCOPE_SKIN, SCOPE_SKIN_IMAGE, SCOPE_FONTS
 
+class SkinError(Exception):
+       def __init__(self, message):
+               self.message = message
+
+       def __str__(self):
+               return self.message
+
 dom_skins = [ ]
 
 def loadSkin(name):
@@ -37,7 +46,15 @@ def loadSkin(name):
 # so the first screen found will be used.
 
 # example: loadSkin("nemesis_greenline/skin.xml")
-loadSkin('skin.xml')
+config.skin = ConfigSubsection()
+config.skin.primary_skin = configElement("config.skin.primary_skin", configText, "skin.xml", 0)
+
+try:
+       loadSkin(config.skin.primary_skin.value)
+except SkinError, err:
+       print "SKIN ERROR:", err
+       print "defaulting to standard skin..."
+       loadSkin('skin.xml')
 loadSkin('skin_default.xml')
 
 def parsePosition(str):
@@ -174,7 +191,7 @@ def applySingleAttribute(guiObject, desktop, attrib, value):
                elif attrib == 'shadowOffset':
                        guiObject.setShadowOffset(parsePosition(value))
                else:
-                       print "unsupported attribute " + attrib + "=" + value
+                       raise "unsupported attribute " + attrib + "=" + value
        except int:
 # AttributeError:
                print "widget %s (%s) doesn't support attribute %s!" % ("", guiObject.__class__.__name__, attrib)
@@ -299,7 +316,7 @@ def readSkin(screen, skin, name, desktop):
                        try:
                                attributes = screen[wname].skinAttributes = [ ]
                        except:
-                               raise str("component with name '" + wname + "' was not found in skin of screen '" + name + "'!")
+                               raise SkinError("component with name '" + wname + "' was not found in skin of screen '" + name + "'!")
 
 #                      assert screen[wname] is not Source
                
@@ -309,13 +326,16 @@ def readSkin(screen, skin, name, desktop):
                        # get corresponding source
                        source = screen.get(wsource)
                        if source is None:
-                               raise str("source '" + wsource + "' was not found in screen '" + name + "'!")
+                               raise SkinError("source '" + wsource + "' was not found in screen '" + name + "'!")
                        
                        wrender = widget.getAttribute('render')
                        
+                       if not wrender:
+                               raise SkinError("you must define a renderer with render= for source '%s'" % (wsource))
+                       
                        for converter in elementsWithTag(widget.childNodes, "convert"):
                                ctype = converter.getAttribute('type')
-                               assert ctype
+                               assert ctype, "'convert'-tag needs a 'type'-attribute"
                                converter_class = my_import('.'.join(["Components", "Converter", ctype])).__dict__.get(ctype)
                                parms = mergeText(converter.childNodes).strip()
                                c = converter_class(parms)
@@ -344,7 +364,7 @@ def readSkin(screen, skin, name, desktop):
                        if type == "onLayoutFinish":
                                screen.onLayoutFinish.append(code)
                        else:
-                               raise str("applet type '%s' unknown!" % type)
+                               raise SkinError("applet type '%s' unknown!" % type)
                        
                        continue
                
@@ -358,10 +378,10 @@ def readSkin(screen, skin, name, desktop):
                elif widget.tagName == "ePixmap":
                        w.widget = ePixmap
                else:
-                       raise str("unsupported stuff : %s" % widget.tagName)
+                       raise SkinError("unsupported stuff : %s" % widget.tagName)
                
                w.skinAttributes = [ ]
-               collectAttributes(w.skinAttributes, widget, skin_path_prefix)
+               collectAttributes(w.skinAttributes, widget, skin_path_prefix, ignore=['name'])
                
                # applyAttributes(guiObject, widget, desktop)
                # guiObject.thisown = 0