X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=skin.py;h=b490f7392d507463c127435ec2852ea2ae068459;hp=8789e877cac291941b2a140f8d60effe0dc05d23;hb=a97f3cb3fc63e25d6378a75cb7649563d18f2a5e;hpb=fe0534f76b59b814caca3648933c45d3add31889 diff --git a/skin.py b/skin.py old mode 100644 new mode 100755 index 8789e87..b490f73 --- a/skin.py +++ b/skin.py @@ -1,4 +1,4 @@ -from Tools.Profile import profile, profile_final +from Tools.Profile import profile profile("LOAD:ElementTree") import xml.etree.cElementTree from os import path @@ -6,16 +6,13 @@ from os import path profile("LOAD:enigma_skin") from enigma import eSize, ePoint, gFont, eWindow, eLabel, ePixmap, eWindowStyleManager, \ addFont, gRGB, eWindowStyleSkinned - from Components.config import ConfigSubsection, ConfigText, config from Components.Converter.Converter import Converter from Components.Sources.Source import Source, ObsoleteSource -from Tools.Directories import resolveFilename, SCOPE_SKIN, SCOPE_SKIN_IMAGE, SCOPE_FONTS, SCOPE_CURRENT_SKIN, fileExists +from Tools.Directories import resolveFilename, SCOPE_SKIN, SCOPE_SKIN_IMAGE, SCOPE_FONTS, SCOPE_CURRENT_SKIN, SCOPE_CONFIG, fileExists from Tools.Import import my_import from Tools.LoadPixmap import LoadPixmap -from Tools.XMLTools import elementsWithTag, mergeText - colorNames = dict() def dump(x, i=0): @@ -28,16 +25,16 @@ def dump(x, i=0): class SkinError(Exception): def __init__(self, message): - self.message = message + self.msg = message def __str__(self): - return self.message + return "{%s}: %s" % (config.skin.primary_skin.value, self.msg) dom_skins = [ ] -def loadSkin(name): +def loadSkin(name, scope = SCOPE_SKIN): # read the skin - filename = resolveFilename(SCOPE_SKIN, name) + filename = resolveFilename(scope, name) mpath = path.dirname(filename) + "/" dom_skins.append((mpath, xml.etree.cElementTree.parse(filename).getroot())) @@ -57,6 +54,11 @@ config.skin.primary_skin = ConfigText(default = "skin.xml") profile("LoadSkin") try: + loadSkin('skin_user.xml', SCOPE_CONFIG) +except (SkinError, IOError, AssertionError), err: + print "not loading user skin: ", err + +try: loadSkin(config.skin.primary_skin.value) except (SkinError, IOError, AssertionError), err: print "SKIN ERROR:", err @@ -68,9 +70,27 @@ profile("LoadSkinDefault") loadSkin('skin_default.xml') profile("LoadSkinDefaultDone") -def parsePosition(str, scale): +def evalPos(pos, wsize, ssize, scale): + if pos == "center": + pos = (ssize - wsize) / 2 + else: + pos = int(pos) * scale[0] / scale[1] + return int(pos) + +def parsePosition(str, scale, desktop = None, size = None): x, y = str.split(',') - return ePoint(int(x) * scale[0][0] / scale[0][1], int(y) * scale[1][0] / scale[1][1]) + + wsize = 1, 1 + ssize = 1, 1 + if desktop is not None: + ssize = desktop.size().width(), desktop.size().height() + if size is not None: + wsize = size.width(), size.height() + + x = evalPos(x, wsize[0], ssize[0], scale[0]) + y = evalPos(y, wsize[1], ssize[1], scale[1]) + + return ePoint(x, y) def parseSize(str, scale): x, y = str.split(',') @@ -95,11 +115,11 @@ def collectAttributes(skinAttributes, node, skin_path_prefix=None, ignore=[]): attrib = a[0] value = a[1] - if attrib in ["pixmap", "pointer", "seek_pointer", "backgroundPixmap", "selectionPixmap"]: + if attrib in ("pixmap", "pointer", "seek_pointer", "backgroundPixmap", "selectionPixmap"): value = resolveFilename(SCOPE_SKIN_IMAGE, value, path_prefix=skin_path_prefix) if attrib not in ignore: - skinAttributes.append((attrib, value)) + skinAttributes.append((attrib, value.encode("utf-8"))) def loadPixmap(path, desktop): cached = False @@ -117,7 +137,7 @@ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1) # and set attributes try: if attrib == 'position': - guiObject.move(parsePosition(value, scale)) + guiObject.move(parsePosition(value, scale, desktop, guiObject.csize())) elif attrib == 'size': guiObject.resize(parseSize(value, scale)) elif attrib == 'title': @@ -128,7 +148,9 @@ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1) guiObject.setFont(parseFont(value, scale)) elif attrib == 'zPosition': guiObject.setZPosition(int(value)) - elif attrib in ["pixmap", "backgroundPixmap", "selectionPixmap"]: + elif attrib == 'itemHeight': + guiObject.setItemHeight(int(value)) + elif attrib in ("pixmap", "backgroundPixmap", "selectionPixmap"): ptr = loadPixmap(value, desktop) # this should already have been filename-resolved. if attrib == "pixmap": guiObject.setPixmap(ptr) @@ -143,11 +165,17 @@ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1) "off": 0, "blend": 2, }[value]) + elif attrib == "scale": + guiObject.setScale(1) elif attrib == "orientation": # used by eSlider try: - guiObject.setOrientation( - { "orVertical": guiObject.orVertical, - "orHorizontal": guiObject.orHorizontal + guiObject.setOrientation(* + { "orVertical": (guiObject.orVertical, False), + "orTopToBottom": (guiObject.orVertical, False), + "orBottomToTop": (guiObject.orVertical, True), + "orHorizontal": (guiObject.orHorizontal, False), + "orLeftToRight": (guiObject.orHorizontal, False), + "orRightToLeft": (guiObject.orHorizontal, True), }[value]) except KeyError: print "oprientation must be either orVertical or orHorizontal!" @@ -213,6 +241,8 @@ def applySingleAttribute(guiObject, desktop, attrib, value, scale = ((1,1),(1,1) guiObject.setShadowOffset(parsePosition(value, scale)) elif attrib == 'noWrap': guiObject.setNoWrap(1) + elif attrib == 'id': + pass else: raise SkinError("unsupported attribute " + attrib + "=" + value) except int: @@ -237,7 +267,7 @@ def loadSingleSkinData(desktop, skin, path_prefix): id = 0 if id == 0: # framebuffer for res in c.findall("resolution"): - get_attr = c.attrib.get + get_attr = res.attrib.get xres = get_attr("xres") if xres: xres = int(xres) @@ -256,6 +286,7 @@ def loadSingleSkinData(desktop, skin, path_prefix): #print "Resolution:", xres,yres,bpp from enigma import gFBDC gFBDC.getInstance().setResolution(xres, yres) + desktop.resize(eSize(xres, yres)) if bpp != 32: # load palette (not yet implemented) pass @@ -269,7 +300,7 @@ def loadSingleSkinData(desktop, skin, path_prefix): colorNames[name] = parseColor(color) #print "Color:", name, color else: - raise ("need color and name, got %s %s" % (name, color)) + raise SkinError("need color and name, got %s %s" % (name, color)) for c in skin.findall("fonts"): for font in c.findall("font"): @@ -290,6 +321,28 @@ def loadSingleSkinData(desktop, skin, path_prefix): addFont(resolved_font, name, scale, is_replacement) #print "Font: ", resolved_font, name, scale, is_replacement + for c in skin.findall("subtitles"): + from enigma import eWidget, eSubtitleWidget + scale = ((1,1),(1,1)) + for substyle in c.findall("sub"): + get_attr = substyle.attrib.get + font = parseFont(get_attr("font"), scale) + col = get_attr("foregroundColor") + if col: + foregroundColor = parseColor(col) + haveColor = 1 + else: + foregroundColor = gRGB(0xFFFFFF) + haveColor = 0 + col = get_attr("shadowColor") + if col: + shadowColor = parseColor(col) + else: + shadowColor = gRGB(0) + shadowOffset = parsePosition(get_attr("shadowOffset"), scale) + face = eSubtitleWidget.__dict__[get_attr("name")] + eSubtitleWidget.setFontStyle(face, font, haveColor, foregroundColor, shadowColor, shadowOffset) + for windowstyle in skin.findall("windowstyle"): style = eWindowStyleSkinned() id = windowstyle.attrib.get("id") @@ -325,12 +378,12 @@ def loadSingleSkinData(desktop, skin, path_prefix): for color in windowstyle.findall("color"): get_attr = color.attrib.get - type = get_attr("name") + colorType = get_attr("name") color = parseColor(get_attr("color")) try: - style.setColor(eWindowStyleSkinned.__dict__["col" + type], color) + style.setColor(eWindowStyleSkinned.__dict__["col" + colorType], color) except: - raise ("Unknown color %s" % (type)) + raise SkinError("Unknown color %s" % (colorType)) #pass #print " color:", type, color @@ -344,12 +397,16 @@ def loadSkinData(desktop): for (path, dom_skin) in skins: loadSingleSkinData(desktop, dom_skin, path) -def lookupScreen(name): +def lookupScreen(name, style_id): for (path, skin) in dom_skins: # first, find the corresponding screen element for x in skin.findall("screen"): if x.attrib.get('name', '') == name: - return x, path + screen_style_id = x.attrib.get('id', '-1') + if screen_style_id == '-1' and name.find('ummary') > 0: + screen_style_id = '1' + if (style_id != 2 and int(screen_style_id) == -1) or int(screen_style_id) == style_id: + return x, path return None, None class additionalWidget: @@ -361,21 +418,32 @@ def readSkin(screen, skin, names, desktop): name = "" % screen.__class__.__name__ + style_id = desktop.getStyleID(); + # try all skins, first existing one have priority for n in names: - myscreen, path = lookupScreen(n) + myscreen, path = lookupScreen(n, style_id) if myscreen is not None: # use this name for debug output name = n break # otherwise try embedded skin - myscreen = myscreen or getattr(screen, "parsedSkin", None) + if myscreen is None: + myscreen = getattr(screen, "parsedSkin", None) # try uncompiled embedded skin if myscreen is None and getattr(screen, "skin", None): print "Looking for embedded skin" - myscreen = screen.parsedSkin = xml.etree.cElementTree.fromstring(screen.skin) + skin_tuple = screen.skin + if not isinstance(skin_tuple, tuple): + skin_tuple = (skin_tuple,) + for sskin in skin_tuple: + parsedSkin = xml.etree.cElementTree.fromstring(sskin) + screen_style_id = parsedSkin.attrib.get('id', '-1') + if (style_id != 2 and int(screen_style_id) == -1) or int(screen_style_id) == style_id: + myscreen = screen.parsedSkin = parsedSkin + break #assert myscreen is not None, "no skin for screen '" + repr(names) + "' found!" if myscreen is None: @@ -468,13 +536,12 @@ def readSkin(screen, skin, names, desktop): ctype = converter.get('type') assert ctype, "'convert'-tag needs a 'type'-attribute" #print "Converter:", ctype - #parms = mergeText(converter.childNodes).strip() try: parms = converter.text.strip() except: parms = "" - #print "Params:", ctype - converter_class = my_import('.'.join(["Components", "Converter", ctype])).__dict__.get(ctype) + #print "Params:", parms + converter_class = my_import('.'.join(("Components", "Converter", ctype))).__dict__.get(ctype) c = None @@ -491,7 +558,7 @@ def readSkin(screen, skin, names, desktop): source = c - renderer_class = my_import('.'.join(["Components", "Renderer", wrender])).__dict__.get(wrender) + renderer_class = my_import('.'.join(("Components", "Renderer", wrender))).__dict__.get(wrender) renderer = renderer_class() # instantiate renderer @@ -520,15 +587,15 @@ def readSkin(screen, skin, names, desktop): #print "Found code:" #print codeText - type = widget.attrib.get('type') + widgetType = widget.attrib.get('type') code = compile(codeText, "skin applet", "exec") - if type == "onLayoutFinish": + if widgetType == "onLayoutFinish": screen.onLayoutFinish.append(code) #print "onLayoutFinish = ", codeText else: - raise SkinError("applet type '%s' unknown!" % type) + raise SkinError("applet type '%s' unknown!" % widgetType) #print "applet type '%s' unknown!" % type continue