"""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()