def save(self): """ Save this theme. """ domdoc = minidom.Document() try: theme_element = domdoc.createElement("theme") theme_element.setAttribute("name", self.name) theme_element.setAttribute("format", str(self.THEME_FORMAT)) domdoc.appendChild(theme_element) for name, _type, _default in self.attributes: if name == "color_scheme_basename": element = domdoc.createElement("color_scheme") text = domdoc.createTextNode(self.color_scheme_basename) element.appendChild(text) theme_element.appendChild(element) elif name == "key_label_overrides": overrides_element = \ domdoc.createElement("key_label_overrides") theme_element.appendChild(overrides_element) tuples = self.key_label_overrides for key_id, values in list(tuples.items()): element = domdoc.createElement("key") element.setAttribute("id", key_id) element.setAttribute("label", values[0]) element.setAttribute("group", values[1]) overrides_element.appendChild(element) else: value = getattr(self, name) if _type == "s": pass elif _type == "i": value = str(value) elif _type == "d": value = str(round(float(value), 2)) elif _type == "ad": value = ", ".join(str(d) for d in value) else: assert(False) # attribute of unknown type element = domdoc.createElement(name) text = domdoc.createTextNode(value) element.appendChild(text) theme_element.appendChild(element) pretty_xml = toprettyxml(domdoc) with open_utf8(self.filename, "w") as _file: if sys.version_info.major >= 3: _file.write(pretty_xml) else: _file.write(pretty_xml.encode("UTF-8")) except Exception as xxx_todo_changeme2: (ex) = xxx_todo_changeme2 raise Exceptions.ThemeFileError(_("Error saving ") + self.filename, chained_exception = ex) finally: domdoc.unlink()
def load(filename, is_system=False): """ Load a color scheme and return it as a new object. """ color_scheme = None f = open_utf8(filename) try: dom = minidom.parse(f).documentElement name = dom.attributes["name"].value # check layout format format = ColorScheme.COLOR_SCHEME_FORMAT_LEGACY if dom.hasAttribute("format"): format = Version.from_string(dom.attributes["format"].value) if format >= ColorScheme.COLOR_SCHEME_FORMAT_TREE: # tree format? items = ColorScheme._parse_dom_node(dom, None, {}) else: _logger.warning(_format( \ "Loading legacy color scheme format '{old_format}', " "please consider upgrading to current format " "'{new_format}': '{filename}'", old_format = format, new_format = ColorScheme.COLOR_SCHEME_FORMAT, filename = filename)) items = ColorScheme._parse_legacy_color_scheme(dom) if not items is None: root = Root() root.set_items(items) color_scheme = ColorScheme() color_scheme.name = name color_scheme.filename = filename color_scheme.is_system = is_system color_scheme.root = root #print(root.dumps()) except xml.parsers.expat.ExpatError as ex: _logger.error(_format("Error loading color scheme '{filename}'. " "{exception}: {cause}", filename = filename, exception = type(ex).__name__, cause = unicode_str(ex))) finally: f.close() return color_scheme
def load(filename, is_system=False): """ Load a theme and return a new theme object. """ result = None _file = open_utf8(filename) try: domdoc = minidom.parse(_file).documentElement try: theme = Theme() node = domdoc.attributes.get("format") format = Version.from_string(node.value) \ if node else Theme.THEME_FORMAT_INITIAL theme.name = domdoc.attributes["name"].value # "color_scheme" is the base file name of the color scheme text = utils.xml_get_text(domdoc, "color_scheme") if not text is None: theme.color_scheme_basename = text # get key label overrides nodes = domdoc.getElementsByTagName("key_label_overrides") if nodes: overrides = nodes[0] tuples = {} for override in overrides.getElementsByTagName("key"): key_id = override.attributes["id"].value node = override.attributes.get("label") label = node.value if node else "" node = override.attributes.get("group") group = node.value if node else "" tuples[key_id] = (label, group) theme.key_label_overrides = tuples # read all other members for name, _type, _default in Theme.attributes: if not name in ["color_scheme_basename", "key_label_overrides"]: value = utils.xml_get_text(domdoc, name) if not value is None: if _type == "i": value = int(value) if _type == "d": value = float(value) if _type == "ad": value = [float(s) for s in value.split(",")] # upgrade to current file format if format < Theme.THEME_FORMAT_1_1: # direction was 0..360, ccw # is now -180..180, cw if name == "key_gradient_direction": value = -(value % 360) if value <= -180: value += 360 setattr(theme, name, value) theme.filename = filename theme.is_system = is_system theme.system_exists = is_system result = theme finally: domdoc.unlink() except (Exceptions.ThemeFileError, xml.parsers.expat.ExpatError) as ex: _logger.error(_format("Error loading theme '{filename}'. " "{exception}: {cause}", filename = filename, exception = type(ex).__name__, cause = unicode_str(ex))) result = None finally: _file.close() return result