nlve/tools/make_file_icon.py
4aiman fb6b60bc3f Свой тип файла для проектов: *.nlve больше не текст
Внутри проект — обычный JSON, и система считала его просто текстом:
открывала редактором и рисовала значок текстового файла.

Теперь у него свой тип application/x-nlve-project, свой значок (лист с
загнутым углом и знаком программы) и открытие двойным щелчком. Тип
объявлен наследником application/json, но не простого текста — иначе
редактор снова оказался бы программой по умолчанию.

Всё, что нужно для встраивания в рабочий стол, лежит в packaging и
ставится скриптом tools/install-desktop.sh в домашний каталог, без прав
администратора. Раньше пункт меню и значки существовали только на одной
машине и нигде не были записаны.
2026-08-31 00:13:50 +03:00

62 lines
2.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()