From 0073298d45d6c44fc164456ebdec5f0d3ada5dff Mon Sep 17 00:00:00 2001 From: yyc12345 Date: Thu, 10 Sep 2026 09:12:03 +0800 Subject: [PATCH] feat: make FreeDesktop icon thumbnail size as configurable --- src/assemblicon/highlevel/environment.py | 21 ++++++++++++++++--- src/assemblicon/highlevel/sink/fdart_sink.py | 5 +++-- .../highlevel/source/fdart_source.py | 4 ++-- src/assemblicon/highlevel/utils.py | 6 ++---- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/assemblicon/highlevel/environment.py b/src/assemblicon/highlevel/environment.py index df6f30c..83c4391 100644 --- a/src/assemblicon/highlevel/environment.py +++ b/src/assemblicon/highlevel/environment.py @@ -7,13 +7,19 @@ from pathlib import Path from typing import TypeVar, Generic, Callable from ..lowlevel.environment import Prologue as LowPrologue, Environment as LowEnv from ..lowlevel.artrdr import SvgRenderKind -from .utils import FdContext, WinCategory, MacCategory, FD_THUMBNAIL_HWS +from .utils import FdContext, WinCategory, MacCategory, VART_HW @dataclass(frozen=True) class Prologue(LowPrologue): svg_render: SvgRenderKind - """The render kind for SVG""" + """The render kind for SVG.""" + fd_thumbnail_hws: tuple[int, ...] + """ + The collection of sizes of generated FreeDesktop icons. + Each size must be greater than zero and lower or equal to ``VART_HW``. + Due to icon is a square rectangle, the height and width are same. + """ temp_dir_initializer: Callable[[Path], None] | None """ The extra initializer for user temporary directory. @@ -21,6 +27,15 @@ class Prologue(LowPrologue): ``None`` for no extra initializer. """ + def __post_init__(self) -> None: + super().__post_init__() + for hw in self.fd_thumbnail_hws: + if hw <= 0 or hw > VART_HW: + raise ValueError( + f"Given FreeDesktop icon thumbnail size mismatch the size requirements. " + f"Expect >= 0 and <= {VART_HW}, got {hw}." + ) + _TEMP_USER_DIR: str = "user" _TEMP_LIB_DIR: str = "assemblicon" @@ -52,7 +67,7 @@ class Environment(Generic[P]): parents=True, exist_ok=True ) # and output directory - for hw in FD_THUMBNAIL_HWS: + for hw in self.__prologue.fd_thumbnail_hws: for kind in FdContext: self.__output_artifact(f"{hw}x{hw}", str(kind)).mkdir( parents=True, exist_ok=True diff --git a/src/assemblicon/highlevel/sink/fdart_sink.py b/src/assemblicon/highlevel/sink/fdart_sink.py index 0306f7e..660d4c5 100644 --- a/src/assemblicon/highlevel/sink/fdart_sink.py +++ b/src/assemblicon/highlevel/sink/fdart_sink.py @@ -2,7 +2,7 @@ from dataclasses import dataclass from .common import Sink from ..address import Address, AddressDomain from ..environment import Environment -from ..utils import Artifact, FdContext, FD_THUMBNAIL_HWS, check_vart +from ..utils import Artifact, FdContext, check_vart from ...lowlevel import artio, artrdr from ...logger import HIGHLEVEL_LOGGER as LOGGER @@ -33,7 +33,8 @@ class FdArtSink(Sink): ) check_vart(art) for hw, thumbnail in zip( - FD_THUMBNAIL_HWS, artrdr.render_thumbnail(art, FD_THUMBNAIL_HWS) + env.prologue.fd_thumbnail_hws, + artrdr.render_thumbnail(art, env.prologue.fd_thumbnail_hws), ): dst = env.fd_output_artifact(hw, self.__kind, self.__name) artio.save_artifact(thumbnail, dst) diff --git a/src/assemblicon/highlevel/source/fdart_source.py b/src/assemblicon/highlevel/source/fdart_source.py index ad13de9..cd79f2d 100644 --- a/src/assemblicon/highlevel/source/fdart_source.py +++ b/src/assemblicon/highlevel/source/fdart_source.py @@ -2,7 +2,7 @@ from .common import Source from ..address import Address, AddressDomain from ..environment import Environment from ..sink.fdart_sink import FdArtSink -from ..utils import FdContext, FD_THUMBNAIL_HWS +from ..utils import FdContext from ...lowlevel import artio from ...logger import HIGHLEVEL_LOGGER as LOGGER @@ -28,7 +28,7 @@ class FdArtSource(Source): sink_hint.kind, sink_hint.name, ) - for hw in FD_THUMBNAIL_HWS: + for hw in env.prologue.fd_thumbnail_hws: artio.link_artifact( env.fd_output_artifact(hw, self.__kind, self.__name), env.fd_output_artifact(hw, sink_hint.kind, sink_hint.name), diff --git a/src/assemblicon/highlevel/utils.py b/src/assemblicon/highlevel/utils.py index 5aca1b7..87c1ae7 100644 --- a/src/assemblicon/highlevel/utils.py +++ b/src/assemblicon/highlevel/utils.py @@ -40,7 +40,5 @@ class MacCategory(enum.StrEnum): """Icons for file extensions""" -# TODO: For easy testing, we only build 32x32 and 48x48. -# Enable full generation after testing. -FD_THUMBNAIL_HWS: tuple[int, ...] = (32, 48) -# FD_THUMBNAIL_HWS: tuple[int, ...] = (16, 32, 48, 64, 128, 256) +DEFAULT_FD_THUMBNAIL_HWS: tuple[int, ...] = (16, 32, 48, 64, 128, 256) +"""The default collection of sizes for generating FreeDesktop icons."""