summaryrefslogtreecommitdiff
path: root/src/python/widget/skin.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/python/widget/skin.py')
-rw-r--r--src/python/widget/skin.py161
1 files changed, 161 insertions, 0 deletions
diff --git a/src/python/widget/skin.py b/src/python/widget/skin.py
new file mode 100644
index 0000000..9490d40
--- /dev/null
+++ b/src/python/widget/skin.py
@@ -0,0 +1,161 @@
+# -*- coding: utf-8 -*-
+# libavg - Media Playback Engine.
+# Copyright (C) 2003-2014 Ulrich von Zadow
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# Current versions can be found at www.libavg.de
+
+from libavg import avg
+
+import os, copy
+import xml.etree.ElementTree as ET
+
+class Skin:
+
+ default = None
+
+ def __init__(self, skinXmlFName, mediaDir=""):
+ global defaultMediaDir
+ self.__mediaDir = defaultMediaDir if mediaDir == "" else mediaDir
+ schemaFName = defaultMediaDir+"skin.xsd"
+ schemaString = open(schemaFName, "r").read()
+ skinPath = os.path.join(self.__mediaDir, skinXmlFName)
+ xmlString = open(skinPath, "r").read()
+ avg.validateXml(xmlString, schemaString, skinXmlFName, schemaFName)
+
+ xmlRoot = ET.fromstring(xmlString)
+
+ self.fonts = {}
+ for fontNode in xmlRoot.findall("fontdef"):
+ fontid, attrs = self.__splitAttrs(fontNode)
+ if "baseid" in attrs:
+ self.fonts[fontid] = copy.copy(self.fonts[attrs["baseid"]])
+ font = self.fonts[fontid]
+ del attrs["baseid"]
+ for (key, value) in attrs.iteritems():
+ setattr(font, key, value)
+ else:
+ kwargs = self.__extractArgs(attrs,
+ ("fontsize", "letterspacing", "linespacing"))
+ self.fonts[fontid] = avg.FontStyle(**kwargs)
+
+ self.textButtonCfg, self.defaultTextButtonCfg = self.__parseElement(
+ xmlRoot, "textbutton",
+ bmpArgNames={"upSrc": "upBmp", "downSrc": "downBmp",
+ "disabledSrc": "disabledBmp"},
+ fontArgNames=("font", "downFont", "disabledFont"))
+
+ self.checkBoxCfg, self.defaultCheckBoxCfg = self.__parseElement(
+ xmlRoot, "checkbox",
+ bmpArgNames={"uncheckedUpSrc":"uncheckedUpBmp",
+ "uncheckedDownSrc":"uncheckedDownBmp",
+ "uncheckedDisabledSrc":"uncheckedDisabledBmp",
+ "checkedUpSrc":"checkedUpBmp",
+ "checkedDownSrc":"checkedDownBmp",
+ "checkedDisabledSrc":"checkedDisabledBmp"},
+ fontArgNames=("font", "downFont", "disabledFont"))
+
+ self.sliderCfg, self.defaultSliderCfg = self.__initSliders(xmlRoot, "slider")
+ self.scrollBarCfg, self.defaultScrollBarCfg = self.__initSliders(
+ xmlRoot, "scrollbar")
+ self.progressBarCfg, self.defaultProgressBarCfg = self.__initSliders(
+ xmlRoot, "progressbar")
+
+ self.scrollAreaCfg, self.defaultScrollAreaCfg = self.__parseElement(
+ xmlRoot, "scrollarea",
+ pyArgNames=("friction","borderEndsExtent","margins",
+ "sensitiveScrollBars"),
+ bmpArgNames={"borderSrc":"borderBmp"})
+
+ self.mediaControlCfg, self.defaultMediaControlCfg = self.__parseElement(
+ xmlRoot, "mediacontrol",
+ bmpArgNames={"playUpSrc":"playUpBmp",
+ "playDownSrc":"playDownBmp",
+ "playDisabledSrc":"playDisabledBmp",
+ "pauseUpSrc":"pauseUpBmp",
+ "pauseDownSrc":"pauseDownBmp",
+ "pauseDisabledSrc":"pauseDisabledBmp"},
+ pyArgNames=("timePos", "timeLeftPos", "barPos", "barRight"),
+ fontArgNames=("font"))
+
+ def __parseElement(self, xmlRoot, elementName, pyArgNames=(), bmpArgNames={},
+ fontArgNames=()):
+ cfgMap = {}
+ defaultCfg = None
+ for node in xmlRoot.findall(elementName):
+ nodeid, attrs = self.__splitAttrs(node)
+ kwargs = self.__extractArgs(attrs, pyArgNames=pyArgNames,
+ bmpArgNames=bmpArgNames, fontArgNames=fontArgNames)
+ cfgMap[nodeid] = kwargs
+ if defaultCfg == None or nodeid == None:
+ defaultCfg = kwargs
+ return cfgMap, defaultCfg
+
+ def __splitAttrs(self, xmlNode):
+ attrs = xmlNode.attrib
+ if "id" in attrs:
+ nodeID = attrs["id"]
+ del attrs["id"]
+ else:
+ nodeID = None
+ return nodeID, attrs
+
+ def __extractArgs(self, attrs, pyArgNames=(), bmpArgNames={}, fontArgNames=()):
+ kwargs = {}
+ for (key, value) in attrs.iteritems():
+ if key in pyArgNames:
+ kwargs[key] = eval(value)
+ elif key in bmpArgNames.iterkeys():
+ argkey = bmpArgNames[key]
+ kwargs[argkey] = avg.Bitmap(os.path.join(self.__mediaDir, value))
+ elif key in fontArgNames:
+ kwargs[key] = self.fonts[value]
+ else:
+ kwargs[key] = value
+ return kwargs
+
+ def __initSliders(self, xmlRoot, typeName):
+ sliderCfg = {}
+ defaultSliderCfg = None
+ for sliderXmlNode in xmlRoot.findall(typeName):
+ (nodeID, bogus) = self.__splitAttrs(sliderXmlNode)
+ sliderCfg[nodeID] = {}
+ if defaultSliderCfg == None or nodeID == None:
+ defaultSliderCfg = sliderCfg[nodeID]
+ for xmlNode in sliderXmlNode.findall("*"):
+ # Loop through orientations (horiz, vert)
+ bogus, attrs = self.__splitAttrs(xmlNode)
+ kwargs = self.__extractArgs(attrs,
+ pyArgNames=("trackEndsExtent", "thumbEndsExtent"),
+ bmpArgNames={"trackSrc": "trackBmp",
+ "trackDisabledSrc": "trackDisabledBmp",
+ "thumbUpSrc": "thumbUpBmp",
+ "thumbDownSrc": "thumbDownBmp",
+ "thumbDisabledSrc": "thumbDisabledBmp"})
+ sliderCfg[nodeID][xmlNode.tag] = kwargs
+
+ return (sliderCfg, defaultSliderCfg)
+
+
+def getBmpFromCfg(cfg, bmpName, defaultName=None):
+ if bmpName in cfg:
+ return cfg[bmpName]
+ else:
+ return cfg[defaultName]
+
+
+defaultMediaDir = os.path.join(os.path.dirname(__file__), "..", 'data/')
+Skin.default = Skin("SimpleSkin.xml", "")