X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/4283696371a06f44605f9d005957bc8837c66e0d..335cf67701ac976f0ddf7bda12d1180fd137a988:/skin.py?ds=inline
diff --git a/skin.py b/skin.py
index 2c1778e4..f8fcb122 100644
--- a/skin.py
+++ b/skin.py
@@ -14,137 +14,16 @@ def dump(x, i=0):
except:
None
-dom = xml.dom.minidom.parseString(
- """
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- """ """
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- """)
+loadSkin('skin.xml')
+loadSkin('skin_default.xml')
def parsePosition(str):
x, y = str.split(',')
@@ -166,20 +45,28 @@ def parseColor(str):
raise ("color '%s' must be #aarrggbb or valid named color" % (str))
return gRGB(int(str[1:], 0x10))
-def collectAttributes(skinAttributes, node):
+def collectAttributes(skinAttributes, node, skin_path_prefix=None):
# walk all attributes
for p in range(node.attributes.length):
a = node.attributes.item(p)
# convert to string (was: unicode)
attrib = str(a.name)
- # TODO: proper UTF8 translation?! (for value)
# TODO: localization? as in e1?
- value = str(a.value)
+ value = a.value.encode("utf-8")
+
+ if skin_path_prefix and attrib in ["pixmap", "pointer"] and len(value) and value[0:2] == "~/":
+ value = skin_path_prefix + value[1:]
skinAttributes.append((attrib, value))
-def applySingleAttribute(guiObject, desktop, attrib, value):
+def loadPixmap(path):
+ ptr = loadPNG(path)
+ if ptr is None:
+ raise "pixmap file %s not found!" % (path)
+ return ptr
+
+def applySingleAttribute(guiObject, desktop, attrib, value):
# and set attributes
try:
if attrib == 'position':
@@ -187,20 +74,32 @@ def applySingleAttribute(guiObject, desktop, attrib, value):
elif attrib == 'size':
guiObject.resize(parseSize(value))
elif attrib == 'title':
- guiObject.setTitle(value)
+ guiObject.setTitle(_(value))
elif attrib == 'text':
guiObject.setText(value)
elif attrib == 'font':
guiObject.setFont(parseFont(value))
+ elif attrib == 'zPosition':
+ guiObject.setZPosition(int(value))
elif attrib == "pixmap":
- ptr = gPixmapPtr()
- if loadPNG(ptr, value):
- raise "loading PNG failed!"
- x = ptr
- ptr = ptr.__deref__()
- desktop.makeCompatiblePixmap(ptr)
- guiObject.setPixmap(ptr)
+ ptr = loadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, value))
+ # that __deref__ still scares me!
+ desktop.makeCompatiblePixmap(ptr.__deref__())
+ guiObject.setPixmap(ptr.__deref__())
# guiObject.setPixmapFromFile(value)
+ elif attrib == "alphatest": # used by ePixmap
+ guiObject.setAlphatest(
+ { "on": True,
+ "off": False
+ }[value])
+ elif attrib == "orientation": # used by eSlider
+ try:
+ guiObject.setOrientation(
+ { "orVertical": guiObject.orVertical,
+ "orHorizontal": guiObject.orHorizontal
+ }[value])
+ except KeyError:
+ print "oprientation must be either orVertical or orHorizontal!"
elif attrib == "valign":
try:
guiObject.setVAlign(
@@ -232,6 +131,32 @@ def applySingleAttribute(guiObject, desktop, attrib, value):
guiObject.setBackgroundColor(parseColor(value))
elif attrib == "foregroundColor":
guiObject.setForegroundColor(parseColor(value))
+ elif attrib == "shadowColor":
+ guiObject.setShadowColor(parseColor(value))
+ elif attrib == "selectionDisabled":
+ guiObject.setSelectionEnable(0)
+ elif attrib == "transparent":
+ guiObject.setTransparent(int(value))
+ elif attrib == "borderColor":
+ guiObject.setBorderColor(parseColor(value))
+ elif attrib == "borderWidth":
+ guiObject.setBorderWidth(int(value))
+ elif attrib == "scrollbarMode":
+ guiObject.setScrollbarMode(
+ { "showOnDemand": guiObject.showOnDemand,
+ "showAlways": guiObject.showAlways,
+ "showNever": guiObject.showNever
+ }[value])
+ elif attrib == "enableWrapAround":
+ guiObject.setWrapAround(True)
+ elif attrib == "pointer":
+ (name, pos) = value.split(':')
+ pos = parsePosition(pos)
+ ptr = loadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, name))
+ desktop.makeCompatiblePixmap(ptr.__deref__())
+ guiObject.setPointer(ptr.__deref__(), pos)
+ elif attrib == 'shadowOffset':
+ guiObject.setShadowOffset(parsePosition(value))
elif attrib != 'name':
print "unsupported attribute " + attrib + "=" + value
except int:
@@ -242,16 +167,10 @@ def applyAllAttributes(guiObject, desktop, attributes):
for (attrib, value) in attributes:
applySingleAttribute(guiObject, desktop, attrib, value)
-def loadSkin(desktop):
- print "loading skin..."
-
- def getPNG(x):
- g = gPixmapPtr()
- loadPNG(g, x)
- g = g.grabRef()
- return g
+def loadSingleSkinData(desktop, dom_skin):
+ """loads skin data like colors, windowstyle etc."""
- skin = dom.childNodes[0]
+ skin = dom_skin.childNodes[0]
assert skin.tagName == "skin", "root element in skin must be 'skin'!"
for c in elementsWithTag(skin.childNodes, "colors"):
@@ -264,20 +183,39 @@ def loadSkin(desktop):
colorNames[name] = parseColor(color)
+ for c in elementsWithTag(skin.childNodes, "fonts"):
+ for font in elementsWithTag(c.childNodes, "font"):
+ filename = str(font.getAttribute("filename") or "")
+ name = str(font.getAttribute("name") or "Regular")
+ scale = int(font.getAttribute("scale") or "100")
+ is_replacement = font.getAttribute("replacement") != ""
+ addFont(resolveFilename(SCOPE_FONTS, filename), name, scale, is_replacement)
+
for windowstyle in elementsWithTag(skin.childNodes, "windowstyle"):
style = eWindowStyleSkinned()
+ # defaults
+ font = gFont("Regular", 20)
+ offset = eSize(20, 5)
+
+ for title in elementsWithTag(windowstyle.childNodes, "title"):
+ offset = parseSize(title.getAttribute("offset"))
+ font = parseFont(str(title.getAttribute("font")))
+
+ style.setTitleFont(font);
+ style.setTitleOffset(offset)
+
for borderset in elementsWithTag(windowstyle.childNodes, "borderset"):
bsName = str(borderset.getAttribute("name"))
for pixmap in elementsWithTag(borderset.childNodes, "pixmap"):
bpName = str(pixmap.getAttribute("pos"))
filename = str(pixmap.getAttribute("filename"))
- png = getPNG(filename)
+ png = loadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, filename))
# adapt palette
- desktop.makeCompatiblePixmap(png)
- style.setPixmap(eWindowStyleSkinned.__dict__[bsName], eWindowStyleSkinned.__dict__[bpName], png)
+ desktop.makeCompatiblePixmap(png.__deref__())
+ style.setPixmap(eWindowStyleSkinned.__dict__[bsName], eWindowStyleSkinned.__dict__[bpName], png.__deref__())
for color in elementsWithTag(windowstyle.childNodes, "color"):
type = str(color.getAttribute("name"))
@@ -292,21 +230,36 @@ def loadSkin(desktop):
eWindowStyleManager.getInstance(x)
x.setStyle(style)
+def loadSkinData(desktop):
+ for dom_skin in dom_skins:
+ loadSingleSkinData(desktop, dom_skin)
+
+def lookupScreen(name):
+ for dom_skin in dom_skins:
+ # first, find the corresponding screen element
+ skin = dom_skin.childNodes[0]
+ for x in elementsWithTag(skin.childNodes, "screen"):
+ if x.getAttribute('name') == name:
+ return x
+ return None
+
def readSkin(screen, skin, name, desktop):
- myscreen = None
+ myscreen = lookupScreen(name)
- # first, find the corresponding screen element
- skin = dom.childNodes[0]
+ # otherwise try embedded skin
+ myscreen = myscreen or getattr(screen, "parsedSkin", None)
- for x in elementsWithTag(skin.childNodes, "screen"):
- if x.getAttribute('name') == name:
- myscreen = x
- del skin
+ # try uncompiled embedded skin
+ if myscreen is None and getattr(screen, "skin", None):
+ myscreen = screen.parsedSkin = xml.dom.minidom.parseString(screen.skin).childNodes[0]
- assert myscreen != None, "no skin for screen '" + name + "' found!"
+ assert myscreen is not None, "no skin for screen '" + name + "' found!"
screen.skinAttributes = [ ]
- collectAttributes(screen.skinAttributes, myscreen)
+
+ skin_path_prefix = getattr(screen, "skin_path", None)
+
+ collectAttributes(screen.skinAttributes, myscreen, skin_path_prefix)
screen.additionalWidgets = [ ]
@@ -323,7 +276,7 @@ def readSkin(screen, skin, name, desktop):
except:
raise str("component with name '" + wname + "' was not found in skin of screen '" + name + "'!")
- collectAttributes(attributes, widget)
+ collectAttributes(attributes, widget, skin_path_prefix)
# now walk additional objects
for widget in elementsWithTag(myscreen.childNodes, lambda x: x != "widget"):
@@ -353,9 +306,8 @@ def readSkin(screen, skin, name, desktop):
raise str("unsupported stuff : %s" % widget.tagName)
w.skinAttributes = [ ]
- collectAttributes(w.skinAttributes, widget)
+ collectAttributes(w.skinAttributes, widget, skin_path_prefix)
# applyAttributes(guiObject, widget, desktop)
# guiObject.thisown = 0
- print screen.additionalWidgets
screen.additionalWidgets.append(w)