62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
Делает значок файла проекта из значка программы.
|
|||
|
|
|
|||
|
|
Зачем отдельный. Значок программы и значок её файлов — разные вещи: в
|
|||
|
|
списке файлов должно быть видно, что это документ, а не сама программа.
|
|||
|
|
Поэтому берётся лист с загнутым углом, а знак программы кладётся на него.
|
|||
|
|
|
|||
|
|
Запуск: python3 tools/make_file_icon.py
|
|||
|
|
Итог: packaging/application-x-nlve-project.png
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
from pathlib import Path
|
|||
|
|
from PIL import Image, ImageDraw
|
|||
|
|
|
|||
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|||
|
|
SRC = ROOT / 'packaging' / 'nlve.png'
|
|||
|
|
DST = ROOT / 'packaging' / 'application-x-nlve-project.png'
|
|||
|
|
|
|||
|
|
SIZE = 128
|
|||
|
|
# Лист занимает не всю клетку: значкам документов принято оставлять поля.
|
|||
|
|
MARGIN_X = 16
|
|||
|
|
MARGIN_Y = 6
|
|||
|
|
FOLD = 30
|
|||
|
|
|
|||
|
|
PAPER = (245, 245, 245, 255)
|
|||
|
|
FOLD_COLOR = (205, 205, 205, 255)
|
|||
|
|
EDGE = (120, 120, 120, 255)
|
|||
|
|
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
if not SRC.exists():
|
|||
|
|
raise SystemExit(f'нет файла {SRC}')
|
|||
|
|
|
|||
|
|
img = Image.new('RGBA', (SIZE, SIZE), (0, 0, 0, 0))
|
|||
|
|
d = ImageDraw.Draw(img)
|
|||
|
|
|
|||
|
|
left, right = MARGIN_X, SIZE - MARGIN_X
|
|||
|
|
top, bottom = MARGIN_Y, SIZE - MARGIN_Y
|
|||
|
|
|
|||
|
|
# Лист с срезанным правым верхним углом.
|
|||
|
|
body = [
|
|||
|
|
(left, top), (right - FOLD, top), (right, top + FOLD),
|
|||
|
|
(right, bottom), (left, bottom),
|
|||
|
|
]
|
|||
|
|
d.polygon(body, fill=PAPER, outline=EDGE)
|
|||
|
|
# Сам загнутый угол.
|
|||
|
|
d.polygon([(right - FOLD, top), (right, top + FOLD),
|
|||
|
|
(right - FOLD, top + FOLD)], fill=FOLD_COLOR, outline=EDGE)
|
|||
|
|
|
|||
|
|
# Знак программы поверх листа, в нижней его части: сверху угол.
|
|||
|
|
mark = Image.open(SRC).convert('RGBA')
|
|||
|
|
side = 66
|
|||
|
|
mark = mark.resize((side, side), Image.LANCZOS)
|
|||
|
|
img.alpha_composite(mark, ((SIZE - side) // 2, bottom - side - 8))
|
|||
|
|
|
|||
|
|
img.save(DST)
|
|||
|
|
print('готов:', DST)
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
main()
|