← Back to team overview

kicad-developers team mailing list archive

[PATCH 5/5] Add script for generating icons under resources/linux/mime/icons

 

Quick and dirty script gathers the original SVG icons from the
bitmaps_png folder and generates bitmaps at several sizes named
according to the mime type or application name. To get the names, the
script reads the kicad-kicad.xml mime package and the application
.desktop files, reconciling both to make sure all defined types have
proper associations.
---
 scripts/mk_mime_icons.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)
 create mode 100755 scripts/mk_mime_icons.py

diff --git a/scripts/mk_mime_icons.py b/scripts/mk_mime_icons.py
new file mode 100755
index 0000000..96e6653
--- /dev/null
+++ b/scripts/mk_mime_icons.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+
+# Regenerate the icons in resources/linux/mime based on the mime files
+# and the original icons in bitmaps_png. Must be run from the scripts
+# folder for the relative paths to work.
+#
+# This script assumes Inkscape is installed and in the PATH
+
+import os, glob
+import xml.etree.ElementTree as ET
+from shutil import copyfile, rmtree
+from subprocess import call
+
+ICON_SOURCES = "../bitmaps_png/sources/"
+DEST_FOLDER = "../resources/linux/mime"
+
+def icon_sourcename(icon):
+    return ICON_SOURCES+"/icon_%s.svg" % icon
+
+
+# Get a list of the applications we will install, their icons and mimes
+app_icons = {}
+for desktopfile in glob.glob(DEST_FOLDER+"/applications/*.desktop"): 
+    icon = None
+    mimes = []
+    for line in open(desktopfile):
+        keypair = map(str.strip, line.split("="))
+        if len(keypair) != 2: continue
+        key, value = keypair
+        if key == "Icon":
+            icon = value
+        elif key ==  "MimeType":
+            mimes = [x.strip() for x in value.split(";") if str.strip(x)]
+    if icon is None:
+        print "WARNING: file '", desktopfile, "' contains no Icon entry, corrupted?"
+        continue
+    else:
+        app_icons[icon] = mimes;
+
+# Obtain the mime types we provide from the mime package XML
+MIME_PACKAGE = DEST_FOLDER+"/mime/packages/kicad-kicad.xml"
+mimepkg_root = ET.parse(MIME_PACKAGE).getroot()
+mimepkg_mimetypes = [n.attrib['type'] for n in mimepkg_root]
+
+# Reconcile mime types
+mime_icons = {}
+for mime in mimepkg_mimetypes:
+    for icon, mimes in app_icons.iteritems():
+        if mime in mimes:
+            mime_icons[mime.replace('/','-')] = icon
+            break
+    else:
+        print "WARNING: mimetype'", mime,"' is provided in the package, but no app is associated with it."
+
+
+RESOLUTIONS = [16,22,24,32,48,64,128]
+
+
+rmtree(DEST_FOLDER+'/icons')
+os.makedirs(DEST_FOLDER+'/icons/hicolor/scalable/apps')
+os.makedirs(DEST_FOLDER+'/icons/hicolor/scalable/mimetypes')
+for r in RESOLUTIONS:
+        os.makedirs(DEST_FOLDER+'/icons/hicolor/%ix%i/apps' % (r,r))
+        os.makedirs(DEST_FOLDER+'/icons/hicolor/%ix%i/mimetypes' % (r,r))
+        
+for icon in app_icons.keys():
+    copyfile(icon_sourcename(icon),
+             DEST_FOLDER+"/icons/hicolor/scalable/apps/%s.svg" % icon)
+    for r in RESOLUTIONS:
+        call(['inkscape', '-f', icon_sourcename(icon),
+              '-e', DEST_FOLDER+'/icons/hicolor/%ix%i/apps/%s.png' % (r, r, icon),
+              '-w', str(r), '-h', str(r), '--export-area-snap'])
+
+        
+for mime, icon in mime_icons.iteritems():
+    copyfile(icon_sourcename(icon),
+             DEST_FOLDER+"/icons/hicolor/scalable/mimetypes/%s.svg" % mime)
+    for r in RESOLUTIONS:
+        call(['inkscape', '-f', icon_sourcename(icon),
+              '-e', DEST_FOLDER+'/icons/hicolor/%ix%i/mimetypes/%s.png' % (r, r, mime),
+              '-w', str(r), '-h', str(r), '--export-area-snap'])

References