from typing import Callable, Tuple from PIL import ImageDraw RenderFn = Callable[[ImageDraw.ImageDraw, Tuple[int, int], str], None] class ListItem: """A renderable item for use in ListView or CarouselView. Each item carries a render function called as render_fn(draw, (x, y), fill). An optional render_large_fn is used by CarouselView for a more prominent display; it falls back to render_fn when not provided. """ def __init__(self, render_fn: RenderFn, render_large_fn: RenderFn | None = None): self._render_fn = render_fn self._render_large_fn = render_large_fn def render(self, draw: ImageDraw.ImageDraw, position: Tuple[int, int], fill: str = 'black', **kwargs): """Render the item at normal (list) size. Extra keyword arguments (e.g. ``font_size``) are forwarded to the underlying render function. """ self._render_fn(draw, position, fill, **kwargs) def render_large(self, draw: ImageDraw.ImageDraw, position: Tuple[int, int], fill: str = 'black', **kwargs): """Render the item at large (carousel) size. Uses render_large_fn if provided, otherwise falls back to render_fn. Extra keyword arguments (e.g. ``font_size``) are forwarded to the underlying render function. """ fn = self._render_large_fn or self._render_fn fn(draw, position, fill, **kwargs)