X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=skin.py;h=b2daa7fcd0f2bb15d1b023f41e13cd94b81eb671;hp=08bc6c517be111b1b3b75a56719a691b79110fae;hb=d4ac90a0740a22c86e8f18a49a594e9a8f3746df;hpb=2bc720f79ea42168572ba458fec5b2cffb175a04 diff --git a/skin.py b/skin.py index 08bc6c5..b2daa7f 100644 --- a/skin.py +++ b/skin.py @@ -1,9 +1,15 @@ -from enigma import * import xml.dom.minidom from xml.dom import EMPTY_NAMESPACE -from Tools.Import import my_import -import os +from os import path + +from enigma import eSize, ePoint, gFont, eWindow, eLabel, ePixmap, eWindowStyleManager, \ + loadPNG, addFont, gRGB, eWindowStyleSkinned +from Components.config import ConfigSubsection, ConfigText, config +from Components.Element import Element +from Components.Converter.Converter import Converter +from Tools.Directories import resolveFilename, SCOPE_SKIN, SCOPE_SKIN_IMAGE, SCOPE_FONTS +from Tools.Import import my_import from Tools.XMLTools import elementsWithTag, mergeText colorNames = dict() @@ -16,18 +22,20 @@ def dump(x, i=0): except: None -from Tools.Directories import resolveFilename, SCOPE_SKIN, SCOPE_SKIN_IMAGE, SCOPE_FONTS +class SkinError(Exception): + def __init__(self, message): + self.message = message -class SkinError(str): - pass + def __str__(self): + return self.message dom_skins = [ ] def loadSkin(name): # read the skin filename = resolveFilename(SCOPE_SKIN, name) - path = os.path.dirname(filename) + "/" - dom_skins.append((path, xml.dom.minidom.parse(filename))) + mpath = path.dirname(filename) + "/" + dom_skins.append((mpath, xml.dom.minidom.parse(filename))) # we do our best to always select the "right" value # skins are loaded in order of priority: skin with @@ -40,7 +48,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 = ConfigText(default = "skin.xml") + +try: + loadSkin(config.skin.primary_skin.value) +except (SkinError, IOError), err: + print "SKIN ERROR:", err + print "defaulting to standard skin..." + loadSkin('skin.xml') loadSkin('skin_default.xml') def parsePosition(str): @@ -73,7 +89,7 @@ def collectAttributes(skinAttributes, node, skin_path_prefix=None, ignore=[]): # TODO: localization? as in e1? value = a.value.encode("utf-8") - if attrib in ["pixmap", "pointer"]: + if attrib in ["pixmap", "pointer", "seek_pointer"]: value = resolveFilename(SCOPE_SKIN_IMAGE, value, path_prefix=skin_path_prefix) if attrib not in ignore: @@ -95,7 +111,7 @@ def applySingleAttribute(guiObject, desktop, attrib, value): elif attrib == 'title': guiObject.setTitle(_(value)) elif attrib == 'text': - guiObject.setText(value) + guiObject.setText(_(value)) elif attrib == 'font': guiObject.setFont(parseFont(value)) elif attrib == 'zPosition': @@ -168,16 +184,16 @@ def applySingleAttribute(guiObject, desktop, attrib, value): }[value]) elif attrib == "enableWrapAround": guiObject.setWrapAround(True) - elif attrib == "pointer": + elif attrib == "pointer" or attrib == "seek_pointer": (name, pos) = value.split(':') pos = parsePosition(pos) ptr = loadPixmap(name) desktop.makeCompatiblePixmap(ptr.__deref__()) - guiObject.setPointer(ptr.__deref__(), pos) + guiObject.setPointer({"pointer": 0, "seek_pointer": 1}[attrib], ptr.__deref__(), pos) elif attrib == 'shadowOffset': guiObject.setShadowOffset(parsePosition(value)) - elif attrib != 'name': - print "unsupported attribute " + attrib + "=" + value + else: + raise "unsupported attribute " + attrib + "=" + value except int: # AttributeError: print "widget %s (%s) doesn't support attribute %s!" % ("", guiObject.__class__.__name__, attrib) @@ -212,6 +228,7 @@ def loadSingleSkinData(desktop, dom_skin, path_prefix): for windowstyle in elementsWithTag(skin.childNodes, "windowstyle"): style = eWindowStyleSkinned() + id = int(windowstyle.getAttribute("id") or "0") # defaults font = gFont("Regular", 20) @@ -245,9 +262,8 @@ def loadSingleSkinData(desktop, dom_skin, path_prefix): except: raise ("Unknown color %s" % (type)) - x = eWindowStyleManagerPtr() - eWindowStyleManager.getInstance(x) - x.setStyle(style) + x = eWindowStyleManager.getInstance() + x.setStyle(id, style) def loadSkinData(desktop): skins = dom_skins[:] @@ -321,12 +337,23 @@ def readSkin(screen, skin, name, desktop): for converter in elementsWithTag(widget.childNodes, "convert"): ctype = converter.getAttribute('type') - assert ctype - converter_class = my_import('.'.join(["Components", "Converter", ctype])).__dict__.get(ctype) + assert ctype, "'convert'-tag needs a 'type'-attribute" parms = mergeText(converter.childNodes).strip() - c = converter_class(parms) + converter_class = my_import('.'.join(["Components", "Converter", ctype])).__dict__.get(ctype) - c.connect(source) + c = None + + for i in source.downstream_elements: + if isinstance(i, converter_class) and i.converter_arguments == parms: + c = i + + if c is None: + print "allocating new converter!" + c = converter_class(parms) + c.connect(source) + else: + print "reused conveter!" + source = c renderer_class = my_import('.'.join(["Components", "Renderer", wrender])).__dict__.get(wrender) @@ -367,7 +394,7 @@ def readSkin(screen, skin, name, desktop): 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