90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
|
# Build Qt Resource File from custom Icon Theme for Windows
|
||
|
import os
|
||
|
|
||
|
import shutil
|
||
|
import xml.etree.ElementTree as ET
|
||
|
from subprocess import call
|
||
|
|
||
|
OXYGEN_PATH = "/usr/share/icons/oxygen/base"
|
||
|
|
||
|
|
||
|
def get_python_files():
|
||
|
python_files = []
|
||
|
code_dir = os.path.join(os.curdir, "..", "src")
|
||
|
assert os.path.isdir(code_dir)
|
||
|
for path, subdirs, files in os.walk(code_dir):
|
||
|
for name in files:
|
||
|
if name.endswith(".py"):
|
||
|
python_files.append(os.path.join(path, name))
|
||
|
return python_files
|
||
|
|
||
|
|
||
|
def get_used_icon_names():
|
||
|
icons = set()
|
||
|
for sourcefile in get_python_files():
|
||
|
with open(sourcefile, "r") as f:
|
||
|
for line in f:
|
||
|
if "QIcon.fromTheme" in line:
|
||
|
icon = line[line.find("QIcon.fromTheme"):]
|
||
|
icon = icon.replace('"', "'")
|
||
|
start = icon.find("'") + 1
|
||
|
end = icon.find("'", start)
|
||
|
icons.add(icon[start:end])
|
||
|
return icons
|
||
|
|
||
|
|
||
|
def copy_icons(icon_names: set):
|
||
|
target_dir = "/tmp/oxy"
|
||
|
sizes = [s for s in os.listdir(OXYGEN_PATH) if os.path.isdir(os.path.join(OXYGEN_PATH, s))] # 8x8, 22x22 ...
|
||
|
for size in sizes:
|
||
|
target_size_dir = os.path.join(target_dir, size)
|
||
|
os.makedirs(target_size_dir, exist_ok=True)
|
||
|
oxy_dir = os.path.join(OXYGEN_PATH, size)
|
||
|
for icon_name in icon_names:
|
||
|
for path, subdirs, files in os.walk(oxy_dir):
|
||
|
for f in files:
|
||
|
if os.path.splitext(f)[0] == icon_name:
|
||
|
src = os.path.join(path, f)
|
||
|
shutil.copyfile(src, os.path.join(target_size_dir, f))
|
||
|
break
|
||
|
|
||
|
# Create theme file
|
||
|
with open(os.path.join(target_dir, "index.theme"), "w") as f:
|
||
|
f.write("[Icon Theme]\n")
|
||
|
f.write("Name=oxy\n")
|
||
|
f.write("Comment=Subset of oxygen icons\n")
|
||
|
f.write("Inherits=default\n")
|
||
|
f.write("Directories=" + ",".join(sizes) + "\n")
|
||
|
|
||
|
for size in sizes:
|
||
|
f.write("\n")
|
||
|
f.write("[" + size + "]\n")
|
||
|
f.write("Size=" + size[:size.index("x")] + "\n")
|
||
|
f.write("\n")
|
||
|
|
||
|
root = ET.Element("RCC")
|
||
|
root.set("version", "1.0")
|
||
|
res = ET.SubElement(root, "qresource")
|
||
|
res.set("prefix", "icons/oxy")
|
||
|
relpath = os.path.relpath(os.path.join(target_dir, "index.theme"), "/tmp")
|
||
|
ET.SubElement(res, "file", alias="index.theme").text = relpath
|
||
|
|
||
|
for size in sizes:
|
||
|
size_dir = os.path.join(target_dir, size)
|
||
|
for icon in os.listdir(size_dir):
|
||
|
relpath = os.path.relpath(os.path.join(size_dir, icon), "/tmp")
|
||
|
ET.SubElement(res, "file", alias=size + "/" + icon).text = relpath
|
||
|
|
||
|
tree = ET.ElementTree(root)
|
||
|
tree.write("/tmp/xtra_icons.qrc")
|
||
|
call(["pyrcc5", "/tmp/xtra_icons.qrc", "-o", "/tmp/xtra_icons_rc.py"])
|
||
|
tar_path = os.path.dirname(os.path.join(os.path.dirname(__file__), "..", ".."))
|
||
|
tar_path = os.path.join(tar_path, "src/urh/ui")
|
||
|
shutil.copy("/tmp/xtra_icons_rc.py", tar_path)
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
icons = get_used_icon_names()
|
||
|
print(icons)
|
||
|
copy_icons(icons)
|