Skip to content

feat(addons): add detail view with description and screenshots - #706

Open
knipknap wants to merge 5 commits into
mainfrom
feat/addon-detail-view
Open

knipknap wants to merge 5 commits into
mainfrom
feat/addon-detail-view

Conversation

@knipknap

@knipknap knipknap commented Nov 15, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Clicking an addon row — in the installed addons list or in the Addon Registry dialog — now opens a detail view with:

  • a swipeable screenshot carousel,
  • the addon's long description rendered as Markdown (reusing the existing MarkdownView widget),
  • author, version, and license,
  • a link to the repository,
  • the Install / Update / Unlock action, shared with the registry rows via a new action_button helper.

Companion registry PR (merged): barebaric/rayforge-registry#13.

Builtin addons

All 10 builtin addons now ship a Markdown long_description and screenshots in their manifests, so the detail view is populated out of the box. Local manifests list repo-relative screenshot paths; the detail view resolves them against the addon's repository (the Rayforge repo for builtins) at the version tag, falling back to the default branch for development builds. AsyncImage gained a fallback URL for this.

Two new screenshot targets cover the addons that had no screenshots:

  • app-settings:tools — the tool library settings page (seeds sample tools)
  • addon:cnc:adaptive-clearing — the actual adaptive clearing toolpath in the 3D canvas (a pocket with two islands, cleared on a spindle machine, at 80% playback)

The detail-view screenshot (app-settings:addons:detail) was regenerated and now shows the carousel and Markdown rendering.

Implementation notes

  • AddonMetadata gains long_description and screenshots. Registry entries keep only absolute HTTP(S) URLs; local manifests keep sanitized repo-relative paths.
  • Screenshots are downloaded over plain HTTPS with a disk cache (CACHE_DIR/addon-images, sha256-keyed, 5 MB cap) and decoded with pyvips (PNG/JPEG/WebP, shrink-only). No git is required on any platform.
  • AddonManager.fetch_registry_cached() (5 min TTL) avoids re-downloading the registry for every detail view; failed fetches are not cached.
  • The action button is hidden for addons without a repository URL (e.g. builtins).

Translations

  • The edited docs pages (Addons, Addon Manifest) are updated in all seven website languages.
  • The new by {author} UI string is extracted and translated in every shipped locale; catalogs regenerated via update-translations and verified additions-only with msgfmt --check.

Testing

  • tests/addon_mgr: 161 passed (parsing, registry cache, local screenshot paths).
  • UI tests (xvfb-run pytest -m ui): 40 passed (dialog content, Markdown rendering, screenshot resolution incl. tag/main/non-GitHub cases, fallback download, row activation in both lists — all offline).
  • pixi run lint (ruff, flake8, pyflakes, pyright): clean; also ran as the pre-commit hook on every commit.
  • All screenshot targets generated and visually verified.

Clicking an addon row in the addon manager or the registry dialog
opens a detail view with the addon's long description, a screenshot
carousel, author/version/license info, a repository link, and the
install/update/unlock action.

Screenshots are fetched over plain HTTPS from URLs published by the
registry (pinned to the addon's release tag) and cached on disk, so
no git installation is required on any platform. Addons without
registry data still show their local metadata.
Reuse the existing MarkdownView widget (also used for machine notes)
instead of a plain label, so addon authors can use headings, lists,
emphasis, links, and code blocks in long_description.
Give every builtin addon a Markdown long_description and screenshots
in its manifest, so the detail view is populated out of the box.

Local manifests list repo-relative screenshot paths; the detail view
resolves them against the addon's repository (the Rayforge repo for
builtins) at the version tag, falling back to the default branch for
development builds. AsyncImage gains a fallback URL for this.

Add screenshot targets for the two addons that had no screenshots:
app-settings:tools (tool library page) and addon:cnc:adaptive-clearing
(CNC step settings on a spindle machine).
Update the translated addon and addon-manifest docs pages in all
seven website languages for the detail view, Markdown descriptions,
and screenshots.

Extract the new 'by {author}' UI string and translate it in every
shipped locale; en keeps the empty fallback.
Replace the CNC settings-dialog screenshot with the actual adaptive
clearing toolpath rendered in the 3D canvas: a pocket with two
islands, cleared on a spindle machine, at 80% playback. Add a
dedicated pocket SVG asset for the target.

This branch was successfully deployed

1 active deployment
pypi — 2fbce4d6 Deployed Nov 15, 2026 by knipknap via Build and Publish Wheel #2659
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant