saicore/tools/gen_toolbar.py

127 lines
13 KiB
Python

"""SaiCore Toolbar icons."""
import os
from PIL import Image, ImageDraw, ImageFont
BASE = os.path.join(os.path.dirname(__file__), "..", "resources", "images", "toolbar")
DARK = (250, 250, 249) # cream-white for dark bg
INDIGO = (220, 38, 38) # red-600
WHITE = (255, 255, 255)
RED = (239, 68, 68)
T = (0, 0, 0, 0)
SZ = 32
def font(sz):
for n in ['C:/Windows/Fonts/segoeuib.ttf', 'C:/Windows/Fonts/arialbd.ttf']:
try: return ImageFont.truetype(n, sz)
except: pass
return ImageFont.load_default()
def new():
img = Image.new('RGBA', (SZ, SZ), T)
return img, ImageDraw.Draw(img)
def save(name, img):
img.save(os.path.join(BASE, name), 'PNG')
print(f" {name}")
ICONS = {
"newDocument": lambda dr,c: dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2),
"newFolder": lambda dr,c: dr.polygon([(8,12),(16,12),(18,8),(24,8),(24,22),(8,22)], outline=c, width=2),
"newPage": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.line([16,6,16,26], fill=c, width=2)),
"open": lambda dr,c: (dr.rounded_rectangle([8,12,24,22], radius=2, outline=c, width=2), dr.polygon([(8,12),(14,8),(18,12)], outline=c, width=2)),
"import": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.line([16,12,16,22], fill=c, width=2), dr.polygon([(13,14),(19,14),(16,10)], fill=c)),
"export": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.line([16,12,16,22], fill=c, width=2), dr.polygon([(13,20),(19,20),(16,24)], fill=c)),
"save": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.rectangle([13,6,19,12], fill=c), dr.rectangle([13,16,19,22], outline=c, width=1)),
"print": lambda dr,c: (dr.rectangle([10,8,22,16], outline=c, width=2), dr.rounded_rectangle([8,16,24,22], radius=2, outline=c, width=2)),
"pdf": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.text((11,14),"PDF", fill=c, font=font(7))),
"copy": lambda dr,c: (dr.rounded_rectangle([6,10,18,22], radius=2, outline=c, width=2), dr.rounded_rectangle([12,6,24,18], radius=2, outline=c, width=2)),
"cut": lambda dr,c: (dr.line([8,8,24,24], fill=c, width=2), dr.line([24,8,8,24], fill=c, width=2), dr.ellipse([5,5,11,11], outline=c, width=2), dr.ellipse([21,5,27,11], outline=c, width=2)),
"paste": lambda dr,c: (dr.rounded_rectangle([8,8,24,24], radius=2, outline=c, width=2), dr.rectangle([13,4,19,10], fill=c)),
"duplicate": lambda dr,c: (dr.rounded_rectangle([6,10,18,22], radius=2, outline=c, width=2), dr.rounded_rectangle([12,6,24,18], radius=2, outline=c, width=2)),
"deleteDocument": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.line([11,10,21,22], fill=RED, width=2), dr.line([21,10,11,22], fill=RED, width=2)),
"deleteFolder": lambda dr,c: (dr.polygon([(8,12),(16,12),(18,8),(24,8),(24,22),(8,22)], outline=c, width=2), dr.line([11,16,21,16], fill=RED, width=2)),
"remove": lambda dr,c: dr.line([8,16,24,16], fill=c, width=3),
"next": lambda dr,c: dr.polygon([(11,8),(21,16),(11,24)], fill=c),
"previous": lambda dr,c: dr.polygon([(21,8),(11,16),(21,24)], fill=c),
"nextPageOn": lambda dr,c: (dr.polygon([(11,8),(21,16),(11,24)], fill=INDIGO), dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=1)),
"previousPageOn": lambda dr,c: (dr.polygon([(21,8),(11,16),(21,24)], fill=INDIGO), dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=1)),
"documents": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.line([11,12,21,12], fill=c, width=1), dr.line([11,16,21,16], fill=c, width=1), dr.line([11,20,17,20], fill=c, width=1)),
"web": lambda dr,c: (dr.ellipse([6,6,26,26], outline=c, width=2), dr.line([6,16,26,16], fill=c, width=1), dr.line([16,6,16,26], fill=c, width=1)),
"library": lambda dr,c: (dr.rounded_rectangle([6,6,26,26], radius=2, outline=c, width=2), dr.line([6,16,26,16], fill=c, width=1), dr.line([16,6,16,26], fill=c, width=1)),
"board": lambda dr,c: dr.rounded_rectangle([6,8,26,24], radius=2, outline=c, width=2),
"display": lambda dr,c: (dr.rounded_rectangle([6,6,26,22], radius=2, outline=c, width=2), dr.line([16,22,16,26], fill=c, width=2), dr.line([10,26,22,26], fill=c, width=2)),
"tutorial": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.polygon([(11,12),(11,24),(21,18)], fill=c)),
"home": lambda dr,c: dr.polygon([(16,6),(24,16),(21,16),(21,24),(11,24),(11,16),(8,16)], fill=c),
"settings": lambda dr,c: (dr.ellipse([11,11,21,21], outline=c, width=2), dr.line([16,6,16,11], fill=c, width=2), dr.line([16,21,16,26], fill=c, width=2), dr.line([6,16,11,16], fill=c, width=2), dr.line([21,16,26,16], fill=c, width=2)),
"profile": lambda dr,c: (dr.ellipse([11,6,21,16], outline=c, width=2), dr.arc([6,14,26,28], 0, 180, fill=c, width=2)),
"undo": lambda dr,c: (dr.arc([8,8,24,24], 180, 360, fill=c, width=2), dr.polygon([(8,16),(12,12),(12,20)], fill=c)),
"redo": lambda dr,c: (dr.arc([8,8,24,24], 0, 180, fill=c, width=2), dr.polygon([(24,16),(20,12),(20,20)], fill=c)),
"undoOn": lambda dr,c: (dr.arc([8,8,24,24], 180, 360, fill=INDIGO, width=2), dr.polygon([(8,16),(12,12),(12,20)], fill=INDIGO)),
"redoOn": lambda dr,c: (dr.arc([8,8,24,24], 0, 180, fill=INDIGO, width=2), dr.polygon([(24,16),(20,12),(20,20)], fill=INDIGO)),
"background": lambda dr,c: (dr.rounded_rectangle([6,6,26,26], radius=2, outline=c, width=2), dr.line([6,16,26,16], fill=c, width=1), dr.line([16,6,16,26], fill=c, width=1)),
"clearPage": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.line([11,10,21,22], fill=RED, width=2), dr.line([21,10,11,22], fill=RED, width=2)),
"group": lambda dr,c: (dr.rounded_rectangle([6,6,14,14], radius=2, outline=c, width=2), dr.rounded_rectangle([18,6,26,14], radius=2, outline=c, width=2), dr.rounded_rectangle([6,18,14,26], radius=2, outline=c, width=2), dr.rounded_rectangle([18,18,26,26], radius=2, outline=c, width=2)),
"ungroup": lambda dr,c: (dr.rounded_rectangle([6,6,14,14], radius=2, outline=c, width=2), dr.rounded_rectangle([18,6,26,14], radius=2, outline=c, width=2), dr.rounded_rectangle([6,18,14,26], radius=2, outline=c, width=2), dr.rounded_rectangle([18,18,26,26], radius=2, outline=c, width=2), dr.line([14,10,18,10], fill=RED, width=2)),
"menu": lambda dr,c: (dr.line([8,10,24,10], fill=c, width=2), dr.line([8,16,24,16], fill=c, width=2), dr.line([8,22,24,22], fill=c, width=2)),
"hide": lambda dr,c: (dr.arc([6,10,26,22], 0, 180, fill=c, width=2), dr.arc([6,10,26,22], 180, 360, fill=c, width=2), dr.line([6,22,26,10], fill=RED, width=2)),
"quit": lambda dr,c: (dr.line([10,10,22,22], fill=c, width=2), dr.line([22,10,10,22], fill=c, width=2)),
"quitOn": lambda dr,c: (dr.line([10,10,22,22], fill=INDIGO, width=2), dr.line([22,10,10,22], fill=INDIGO, width=2)),
"color": lambda dr,c: dr.ellipse([8,8,24,24], fill=INDIGO),
"reload": lambda dr,c: (dr.arc([8,8,24,24], 0, 270, fill=c, width=2), dr.polygon([(24,8),(20,8),(24,12)], fill=c)),
"eyeOpened": lambda dr,c: (dr.arc([6,10,26,22], 0, 180, fill=c, width=2), dr.arc([6,10,26,22], 180, 360, fill=c, width=2), dr.ellipse([13,13,19,19], fill=c)),
"eyeClosed": lambda dr,c: (dr.arc([6,10,26,22], 0, 180, fill=c, width=2), dr.arc([6,10,26,22], 180, 360, fill=c, width=2), dr.line([6,22,26,10], fill=RED, width=2)),
"bookmarks": lambda dr,c: dr.polygon([(8,6),(24,6),(24,26),(16,20),(8,26)], fill=c),
"addBookmark": lambda dr,c: (dr.polygon([(8,6),(22,6),(22,22),(15,18),(8,22)], outline=c, width=2), dr.line([15,8,15,16], fill=c, width=2), dr.line([11,12,19,12], fill=c, width=2)),
"captureArea": lambda dr,c: (dr.rectangle([8,8,24,8+2], fill=c), dr.rectangle([8,8,10,24], fill=c), dr.rectangle([22,8,24,24], fill=c), dr.rectangle([8,22,24,24], fill=c)),
"captureScreen": lambda dr,c: (dr.rounded_rectangle([6,8,26,22], radius=2, outline=c, width=2), dr.line([16,22,16,26], fill=c, width=2), dr.line([10,26,22,26], fill=c, width=2)),
"captureWindow": lambda dr,c: (dr.rounded_rectangle([6,6,26,24], radius=2, outline=c, width=2), dr.line([6,12,26,12], fill=c, width=2)),
"mic": lambda dr,c: (dr.rounded_rectangle([13,6,19,18], radius=6, outline=c, width=2), dr.arc([10,12,22,24], 0, 180, fill=c, width=2), dr.line([16,18,16,24], fill=c, width=2)),
"micOff": lambda dr,c: (dr.rounded_rectangle([13,6,19,18], radius=6, outline=c, width=2), dr.line([8,8,24,24], fill=RED, width=2)),
"record": lambda dr,c: dr.ellipse([10,10,22,22], fill=RED),
"stop": lambda dr,c: dr.rectangle([10,10,22,22], fill=c),
"pause": lambda dr,c: (dr.rectangle([11,8,15,24], fill=c), dr.rectangle([17,8,21,24], fill=c)),
"tip": lambda dr,c: (dr.ellipse([10,6,22,18], fill=c), dr.polygon([(14,16),(18,16),(16,26)], fill=c)),
"tools": lambda dr,c: (dr.line([8,24,20,12], fill=c, width=3), dr.ellipse([18,8,26,16], outline=c, width=2)),
"softwareUpdate": lambda dr,c: (dr.arc([8,8,24,24], 0, 270, fill=c, width=2), dr.polygon([(24,8),(20,8),(24,12)], fill=c), dr.ellipse([14,14,18,18], fill=c)),
"updates": lambda dr,c: (dr.arc([8,8,24,24], 0, 270, fill=c, width=2), dr.polygon([(24,8),(20,8),(24,12)], fill=c)),
"warning": lambda dr,c: (dr.polygon([(16,6),(28,26),(4,26)], outline=c, width=2), dr.line([16,12,16,20], fill=c, width=2), dr.ellipse([15,22,17,24], fill=c)),
"webTrap": lambda dr,c: (dr.ellipse([6,6,26,26], outline=c, width=2), dr.line([6,6,26,26], fill=c, width=1), dr.line([16,6,16,26], fill=c, width=1), dr.line([6,16,26,16], fill=c, width=1)),
"webTrapEnabled": lambda dr,c: (dr.ellipse([6,6,26,26], outline=INDIGO, width=2), dr.line([6,6,26,26], fill=INDIGO, width=1), dr.line([16,6,16,26], fill=INDIGO, width=1), dr.line([6,16,26,16], fill=INDIGO, width=1)),
"webUpload": lambda dr,c: (dr.rounded_rectangle([6,12,26,24], radius=2, outline=c, width=2), dr.line([16,6,16,18], fill=c, width=2), dr.polygon([(12,10),(20,10),(16,4)], fill=c)),
"window": lambda dr,c: dr.rounded_rectangle([6,6,26,24], radius=2, outline=c, width=2),
"proto": lambda dr,c: dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2),
"extraTool": lambda dr,c: dr.rounded_rectangle([6,6,26,26], radius=4, outline=c, width=2),
"stylus": lambda dr,c: dr.rounded_rectangle([6,6,26,26], radius=4, outline=c, width=2),
"stylusTab": lambda dr,c: dr.rounded_rectangle([6,6,26,26], radius=4, outline=c, width=2),
"lineTool": lambda dr,c: dr.line([8,24,24,8], fill=c, width=3),
"eraserTool": lambda dr,c: dr.rounded_rectangle([8,10,24,22], radius=3, fill=c),
"pageSize": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.line([8,16,24,16], fill=c, width=1)),
"setBackground": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.rectangle([10,8,22,14], fill=INDIGO)),
"removeBackground": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.rectangle([10,8,22,14], fill=INDIGO), dr.line([10,8,22,14], fill=RED, width=2)),
"addToolToLibrary": lambda dr,c: (dr.rounded_rectangle([6,6,26,26], radius=2, outline=c, width=2), dr.line([16,10,16,22], fill=c, width=2), dr.line([10,16,22,16], fill=c, width=2)),
"addToPage": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.line([16,10,16,22], fill=c, width=2), dr.line([12,16,20,16], fill=c, width=2)),
"addToDocument": lambda dr,c: (dr.rounded_rectangle([8,6,24,26], radius=2, outline=c, width=2), dr.line([16,10,16,22], fill=c, width=2), dr.line([12,16,20,16], fill=c, width=2)),
"addToLibrary": lambda dr,c: (dr.rounded_rectangle([6,6,26,26], radius=2, outline=c, width=2), dr.line([16,10,16,22], fill=c, width=2), dr.line([12,16,20,16], fill=c, width=2)),
"addInteractiveToLibrary": lambda dr,c: (dr.rounded_rectangle([6,6,26,26], radius=2, outline=c, width=2), dr.line([16,10,16,22], fill=c, width=2), dr.line([12,16,20,16], fill=c, width=2)),
"rename": lambda dr,c: (dr.rounded_rectangle([6,10,26,22], radius=2, outline=c, width=2), dr.line([10,16,22,16], fill=c, width=1)),
"smallerText": lambda dr,c: dr.text((10,8), "a", fill=c, font=font(16)),
"largeEraser": lambda dr,c: dr.ellipse([4,4,28,28], fill=c),
"mediumEraser": lambda dr,c: dr.ellipse([8,8,24,24], fill=c),
"smallEraser": lambda dr,c: dr.ellipse([12,12,20,20], fill=c),
"largePen": lambda dr,c: dr.ellipse([4,4,28,28], fill=c),
"mediumPen": lambda dr,c: dr.ellipse([8,8,24,24], fill=c),
"smallPen": lambda dr,c: dr.ellipse([12,12,20,20], fill=c),
"plusBlack": lambda dr,c: dr.ellipse([6,6,26,26], fill=DARK),
"plusBlackOn": lambda dr,c: dr.ellipse([6,6,26,26], fill=INDIGO),
}
def run():
print("=== Toolbar ===")
for name, fn in ICONS.items():
img, dr = new()
fn(dr, DARK)
save(f"{name}.png", img)
if __name__ == "__main__":
run()