X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/8e22df3af4a9ba076869de89f25b6f8adde29b49..40ba45345d3300c20f82fc8ddaf23b8913836806:/skin.py diff --git a/skin.py b/skin.py index 1aced44c..cb433269 100644 --- a/skin.py +++ b/skin.py @@ -1,10 +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 Components.config import ConfigSubsection, configElement, configText, config +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 @@ -18,8 +23,6 @@ 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 @@ -32,8 +35,8 @@ 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 @@ -47,11 +50,11 @@ def loadSkin(name): # example: loadSkin("nemesis_greenline/skin.xml") config.skin = ConfigSubsection() -config.skin.primary_skin = configElement("config.skin.primary_skin", configText, "skin.xml", 0) +config.skin.primary_skin = ConfigText(default = "skin.xml") try: loadSkin(config.skin.primary_skin.value) -except SkinError, err: +except (SkinError, IOError, AssertionError), err: print "SKIN ERROR:", err print "defaulting to standard skin..." loadSkin('skin.xml') @@ -87,7 +90,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: @@ -109,16 +112,15 @@ 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': guiObject.setZPosition(int(value)) elif attrib == "pixmap": ptr = loadPixmap(value) # this should already have been filename-resolved. - # that __deref__ still scares me! - desktop.makeCompatiblePixmap(ptr.__deref__()) - guiObject.setPixmap(ptr.__deref__()) + desktop.makeCompatiblePixmap(ptr) + guiObject.setPixmap(ptr) # guiObject.setPixmapFromFile(value) elif attrib == "alphatest": # used by ePixmap guiObject.setAlphatest( @@ -182,14 +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) + desktop.makeCompatiblePixmap(ptr) + guiObject.setPointer({"pointer": 0, "seek_pointer": 1}[attrib], ptr, pos) elif attrib == 'shadowOffset': guiObject.setShadowOffset(parsePosition(value)) + elif attrib == 'noWrap': + guiObject.setNoWrap(1) else: raise "unsupported attribute " + attrib + "=" + value except int: @@ -226,6 +230,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) @@ -247,8 +252,8 @@ def loadSingleSkinData(desktop, dom_skin, path_prefix): png = loadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, filename, path_prefix=path_prefix)) # adapt palette - desktop.makeCompatiblePixmap(png.__deref__()) - style.setPixmap(eWindowStyleSkinned.__dict__[bsName], eWindowStyleSkinned.__dict__[bpName], png.__deref__()) + desktop.makeCompatiblePixmap(png) + style.setPixmap(eWindowStyleSkinned.__dict__[bsName], eWindowStyleSkinned.__dict__[bpName], png) for color in elementsWithTag(windowstyle.childNodes, "color"): type = str(color.getAttribute("name")) @@ -259,9 +264,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[:] @@ -279,6 +283,7 @@ def lookupScreen(name): return None, None def readSkin(screen, skin, name, desktop): + myscreen, path = lookupScreen(name) # otherwise try embedded skin @@ -299,6 +304,8 @@ def readSkin(screen, skin, name, desktop): screen.additionalWidgets = [ ] screen.renderer = [ ] + visited_components = set() + # now walk all widgets for widget in elementsWithTag(myscreen.childNodes, "widget"): # ok, we either have 1:1-mapped widgets ('old style'), or 1:n-mapped @@ -307,11 +314,14 @@ def readSkin(screen, skin, name, desktop): wname = widget.getAttribute('name') wsource = widget.getAttribute('source') + if wname is None and wsource is None: print "widget has no name and no source!" continue if wname: + visited_components.add(wname) + # get corresponding 'gui' object try: attributes = screen[wname].skinAttributes = [ ] @@ -319,7 +329,7 @@ def readSkin(screen, skin, name, desktop): raise SkinError("component with name '" + wname + "' was not found in skin of screen '" + name + "'!") # assert screen[wname] is not Source - + # and collect attributes for this collectAttributes(attributes, widget, skin_path_prefix, ignore=['name']) elif wsource: @@ -336,11 +346,22 @@ def readSkin(screen, skin, name, desktop): for converter in elementsWithTag(widget.childNodes, "convert"): ctype = converter.getAttribute('type') 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) + 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) @@ -353,6 +374,11 @@ def readSkin(screen, skin, name, desktop): screen.renderer.append(renderer) + from Components.GUIComponent import GUIComponent + nonvisited_components = [x for x in set(screen.keys()) - visited_components if isinstance(x, GUIComponent)] + + assert not nonvisited_components, "the following components in %s don't have a skin entry: %s" % (name, ', '.join(nonvisited_components)) + # now walk additional objects for widget in elementsWithTag(myscreen.childNodes, lambda x: x != "widget"): if widget.tagName == "applet":