This repository has been archived on 2023-03-25. You can view files and clone it, but cannot push or open issues or pull requests.
mightyscape-1.1-deprecated/extensions/fablabchemnitz/color_harmony/color_harmony/storage/xml.py

180 lines
6.0 KiB
Python

from os.path import join, basename
from PyQt4 import QtGui
from lxml import etree as ET
from color.colors import *
from color import mixers
from palette.storage.storage import *
class XmlPalette(Storage):
name = 'xml'
title = _("CREATE palette format")
filters = ["*.xml"]
can_load = True
can_save = True
@staticmethod
def check(filename):
return ET.parse(filename).getroot().tag == 'colors'
@staticmethod
def get_options_widget(dialog, filename):
def on_group_changed(selector):
def handler():
dialog.options = selector.currentText()
dialog.on_current_changed(filename)
return handler
widget = QtGui.QWidget()
box = QtGui.QHBoxLayout()
label = QtGui.QLabel(_("Group: "))
selector = QtGui.QComboBox()
xml = ET.parse(filename)
for xmlgrp in xml.xpath("//group"):
xml_label = xmlgrp.find('label')
if xml_label is not None:
selector.addItem(xml_label.text)
selector.currentIndexChanged.connect(on_group_changed(selector))
selector.setCurrentIndex(0)
box.addWidget(label)
box.addWidget(selector)
widget.setLayout(box)
return widget
@staticmethod
def get_group_names(filename):
result = []
xml = ET.parse(filename)
for xmlgrp in xml.xpath("//group"):
xml_label = xmlgrp.find('label')
if xml_label is not None:
result.append(xml_label.text)
return result
def save(self, file_w=None):
xml = ET.Element("colors")
root_group = ET.SubElement(xml, "group")
group = ET.SubElement(root_group, "group")
label = ET.SubElement(group, "label")
label.text = self.palette.name
layout = ET.SubElement(group, "layout", columns=str(self.palette.ncols), expanded="True")
for key,value in self.palette.meta.items():
if key != "Name":
meta = ET.SubElement(group, "meta", name=key)
meta.text = value
for i,row in enumerate(self.palette.slots):
for j,slot in enumerate(row):
color = slot.color
name = color.name
if not name:
name = "Swatch-{}-{}".format(i,j)
elem = ET.SubElement(group, "color")
label = ET.SubElement(elem, "label")
label.text = name
if slot.mode == USER_DEFINED:
meta = ET.SubElement(elem, "meta", name="user_chosen")
meta.text = "True"
for key,value in color.meta.items():
if key != "Name":
meta = ET.SubElement(elem, "meta", name=key)
meta.text = value
rgb = ET.SubElement(elem, "sRGB")
r,g,b = color.getRGB1()
rgb.attrib["r"] = str(r)
rgb.attrib["g"] = str(g)
rgb.attrib["b"] = str(b)
ET.ElementTree(xml).write(file_w, encoding="utf-8", pretty_print=True, xml_declaration=True)
def load(self, mixer, file_r, group_name):
def get_label(grp):
xml_label = grp.find('label')
if xml_label is None:
return None
return xml_label.text
def find_group(xml):
#print("Searching {}".format(group_name))
grp = None
for xmlgrp in xml.xpath("//group"):
label = get_label(xmlgrp)
if label is None:
continue
#print("Found: {}".format(label))
if group_name is None or label == group_name:
grp = xmlgrp
break
return grp
self.palette = Palette(mixer)
self.palette.ncols = None
xml = ET.parse(file_r)
grp = find_group(xml)
if grp is None:
print(u"Cannot find group by name {}".format(group_name).encode('utf-8'))
return None
self.palette.name = get_label(grp)
layout = grp.find('layout')
if layout is not None:
self.palette.ncols = int( layout.attrib['columns'] )
metas = grp.findall('meta')
if metas is not None:
for meta in metas:
key = meta.attrib['name']
value = meta.text
if key != 'Name':
self.palette.meta[key] = value
all_slots = []
n_colors = 0
for xmlclr in grp.findall('color'):
sRGB = xmlclr.find('sRGB')
if sRGB is None:
continue
attrs = sRGB.attrib
r = float(attrs['r'].replace(',','.'))
g = float(attrs['g'].replace(',','.'))
b = float(attrs['b'].replace(',','.'))
clr = Color()
clr.setRGB1((r,g,b))
slot = Slot(clr)
metas = xmlclr.findall('meta')
if metas is not None:
for meta in metas:
key = meta.attrib['name']
value = meta.text
if key == 'user_chosen' and value == 'True':
slot.mode = USER_DEFINED
else:
clr.meta[key] = value
label = xmlclr.find('label')
if label is not None:
clr.name = label.text
all_slots.append(slot)
n_colors += 1
if n_colors < DEFAULT_GROUP_SIZE:
self.palette.ncols = n_colors
if not self.palette.ncols:
if n_colors > MAX_COLS:
self.palette.ncols = MAX_COLS
else:
self.palette.ncols = n_colors
#print("Loaded colors: {}".format(len(all_slots)))
self.palette.setSlots(all_slots)
self.palette.meta["SourceFormat"] = "CREATE XML"
print("Loaded palette: {}x{}".format( self.palette.nrows, self.palette.ncols ))
return self.palette