48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
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)
|