diff --git a/make/make.py b/make/make.py new file mode 100644 index 0000000000000000000000000000000000000000..f12315f815f36cd0bb3c4c060b807e8e4362a437 --- /dev/null +++ b/make/make.py @@ -0,0 +1,174 @@ +import os, sys, fnmatch, six, subprocess, re +from PyQt4.QtSvg import * +from PyQt4.QtCore import * +from PyQt4.QtGui import * +from PyQt4.QtXml import * +from PyQt4.QtXmlPatterns import * +ROOT = os.path.dirname(os.path.dirname(__file__)) +from timeseriesviewer import DIR_UI, file_search +jp = os.path.join + + +def getDOMAttributes(elem): + assert isinstance(elem, QDomElement) + values = dict() + attributes = elem.attributes() + for a in range(attributes.count()): + attr = attributes.item(a) + values[str(attr.nodeName())] = attr.nodeValue() + return values + +def make(): + #find ui files + ui_files = file_search(ROOT, '*.ui', recursive=True) + qrcs = set() + + doc = QDomDocument() + for ui_file in ui_files: + pathDir = os.path.dirname(ui_file) + if doc.setContent(QFile(ui_file)): + items = doc.elementsByTagName('iconset') + for i in range(items.count()): + nodeQRC = items.item(i) + attr = getDOMAttributes(nodeQRC.toElement()) + if 'resource' in attr.keys(): + qrcs.add((pathDir, str(attr['resource']))) + s = "" + + #compile Qt resource files + #resourcefiles = file_search(ROOT, '*.qrc', recursive=True) + resourcefiles = list(qrcs) + assert len(resourcefiles) > 0 + for root_dir, f in resourcefiles: + #dn = os.path.dirname(f) + pathQrc = os.path.normpath(jp(root_dir, f)) + assert os.path.exists(pathQrc) + bn = os.path.basename(f) + bn = os.path.splitext(bn)[0] + pathPy2 = os.path.join(DIR_UI, bn+'_py2.py' ) + pathPy3 = os.path.join(DIR_UI, bn+'_py3.py' ) + print('Make {}'.format(pathPy2)) + subprocess.call(['pyrcc4','-py2','-o',pathPy2, pathQrc]) + print('Make {}'.format(pathPy3)) + subprocess.call(['pyrcc4','-py3','-o',pathPy3, pathQrc]) + + +def svg2png(pathDir, overwrite=False, mode='INKSCAPE'): + assert mode in ['INKSCAPE', 'WEBKIT', 'SVG'] + from PyQt4.QtWebKit import QWebPage + + svgs = file_search(pathDir, '*.svg') + app = QApplication([], True) + + for pathSvg in svgs: + dn = os.path.dirname(pathSvg) + bn, _ = os.path.splitext(os.path.basename(pathSvg)) + pathPng = jp(dn, bn+'.png') + + if mode == 'SVG': + renderer = QSvgRenderer(pathSvg) + doc_size = renderer.defaultSize() # size in px + img = QImage(doc_size, QImage.Format_ARGB32) + #img.fill(0xaaA08080) + painter = QPainter(img) + renderer.render(painter) + painter.end() + if overwrite or not os.path.exists(pathPng): + img.save(pathPng, quality=100) + del painter, renderer + elif mode == 'WEBKIT': + page = QWebPage() + frame = page.mainFrame() + f = QFile(pathSvg) + if f.open(QFile.ReadOnly | QFile.Text): + textStream = QTextStream(f) + svgData = textStream.readAll() + f.close() + + qba = QByteArray(str(svgData)) + frame.setContent(qba,"image/svg+xml") + page.setViewportSize(frame.contentsSize()) + + palette = page.palette() + background_color = QColor(50,0,0,50) + palette.setColor(QPalette.Window, background_color) + brush = QBrush(background_color) + palette.setBrush(QPalette.Window, brush) + page.setPalette(palette) + + img = QImage(page.viewportSize(), QImage.Format_ARGB32) + img.fill(background_color) #set transparent background + painter = QPainter(img) + painter.setBackgroundMode(Qt.OpaqueMode) + #print(frame.renderTreeDump()) + frame.render(painter) + painter.end() + + if overwrite or not os.path.exists(pathPng): + print('Save {}...'.format(pathPng)) + img.save(pathPng, quality=100) + del painter, frame, img, page + s ="" + elif mode == 'INKSCAPE': + dirInkscape = r'C:\Program Files\Inkscape' + assert os.path.isdir(dirInkscape) + cmd = [jp(dirInkscape,'inkscape')] + cmd.append('--file={}'.format(pathSvg)) + cmd.append('--export-png={}'.format(pathPng)) + subprocess.call(cmd) + + s = "" + + +def png2qrc(icondir, pathQrc): + pathQrc = os.path.abspath(pathQrc) + dirQrc = os.path.dirname(pathQrc) + app = QApplication([]) + assert os.path.exists(pathQrc) + doc = QDomDocument() + doc.setContent(QFile(pathQrc)) + + query = QXmlQuery() + #query.setQuery("doc('{}')/RCC/qresource/file".format(pathQrc)) + query.setQuery("doc('{}')/RCC/qresource[@prefix=\"enmapbox/png\"]/file".format(pathQrc)) + query.setQuery("for $x in doc('{}')/RCC/qresource[@prefix=\"enmapbox/png\"] return data($x)".format(pathQrc)) + assert query.isValid() + #elem = doc.elementsByTagName('qresource')print + pngFiles = [r.strip() for r in str(query.evaluateToString()).split('\n')] + pngFiles = set([f for f in pngFiles if os.path.isfile(jp(dirQrc,f))]) + + for f in file_search(icondir, '*.png'): + xmlPath = os.path.relpath(f, dirQrc).replace('\\','/') + pngFiles.add(xmlPath) + + pngFiles = sorted(list(pngFiles)) + resourceNodes = doc.elementsByTagName('qresource') + for i in range(resourceNodes.count()): + resourceNode = resourceNodes.item(i).toElement() + if resourceNode.hasAttribute('prefix') and resourceNode.attribute('prefix') == "enmapbox/png": + childs = resourceNode.childNodes() + while not childs.isEmpty(): + node = childs.item(0) + node.parentNode().removeChild(node) + + for pngFile in pngFiles: + node = doc.createElement('file') + node.appendChild(doc.createTextNode(pngFile)) + resourceNode.appendChild(node) + f = open(pathQrc, "w") + f.write(doc.toString()) + f.close() + s = "" + + + +if __name__ == '__main__': + icondir = jp(DIR_UI, *['icons']) + pathQrc = jp(DIR_UI,'resources.qrc') + if False: + #convert SVG to PNG and link them into the resource file + svg2png(icondir, overwrite=True) + png2qrc(icondir, pathQrc) + if True: make() + print('Done') +