Add a static image widget (PNG/JPEG/GIF/BMP/WEBP/TIFF/PDF upload)
A new widget type showing a single user-uploaded image with no live upstream to poll -- decoded once at upload time (PDF's first page via pypdfium2, BSD-3-Clause/Apache-2.0, no copyleft exposure) into plain RGB PNG bytes, then composed per a crop/stretch/letterbox display mode like the photos widget.
This commit is contained in:
@@ -553,6 +553,27 @@ class WhiteboardWidgetConfig(Base):
|
||||
cached_image: Mapped[bytes | None] = mapped_column(LargeBinary, nullable=True)
|
||||
|
||||
|
||||
class StaticWidgetConfig(Base):
|
||||
"""One static-image widget's uploaded content + display settings --
|
||||
unlike every other widget type, this one has no live upstream to
|
||||
poll (Immich/CalDAV/WebDAV): the "source" is whatever the user last
|
||||
uploaded (see routers/api_widgets.py's api_widget_static_upload,
|
||||
app/image_upload.py), decoded once at upload time into plain RGB PNG
|
||||
bytes so app/widgets/static_image.py's render() never re-runs
|
||||
PDF/GIF decoding on every panel refresh."""
|
||||
|
||||
__tablename__ = "static_widget_configs"
|
||||
|
||||
widget_id: Mapped[int] = mapped_column(ForeignKey("widgets.id", ondelete="CASCADE"), primary_key=True)
|
||||
image: Mapped[bytes | None] = mapped_column(LargeBinary, nullable=True)
|
||||
original_filename: Mapped[str] = mapped_column(String, default="")
|
||||
uploaded_at: Mapped[float] = mapped_column(Float, default=0.0)
|
||||
# Same DISPLAY_MODES vocabulary as PhotoWidgetConfig.display_mode,
|
||||
# minus crop_faces -- no face detection for an uploaded image (see
|
||||
# image_pipeline.STATIC_DISPLAY_MODES).
|
||||
display_mode: Mapped[str] = mapped_column(String, default="crop_fill")
|
||||
|
||||
|
||||
# widget_type -> its per-type extension table, keyed by widget_id. Used
|
||||
# by db.widget_locked() to resolve the right config row without importing
|
||||
# app/widgets/'s heavier render/action registry just for this lookup.
|
||||
@@ -561,6 +582,7 @@ WIDGET_CONFIG_MODELS: dict[str, type] = {
|
||||
"calendar": CalendarWidgetConfig,
|
||||
"whiteboard": WhiteboardWidgetConfig,
|
||||
"tasks": TaskWidgetConfig,
|
||||
"static": StaticWidgetConfig,
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user