Skip to content

Contact sheets - #42

Merged
akendrick merged 5 commits into
mainfrom
feature/contact-sheet
Nov 2, 2026
Merged

akendrick merged 5 commits into
mainfrom
feature/contact-sheet

Conversation

@akendrick

Copy link
Copy Markdown
Owner

Stacked on #41 (setups), which is stacked on #40 (units). GitHub retargets each to main as the one below merges.

Summary

  • New section: contact sheets. Open it from File > New Contact Sheet… (⇧⌘N), or Make a Contact Sheet… under Photo. Add up to 16 photos (Add Photos… or drop them on the sheet; drag the list to reorder).
  • Options: portrait or landscape, black or white background, whole photos or cropped to fill their cells, optional file names, an optional 21-step greyscale wedge along the bottom, and the space between photos (in inches or mm).
  • Size: the sheet fills the print window's printable room: the page inside its margins, less the safe edge and outline for a negative, and within Fit within when that is set. A landscape sheet is turned to stand up on the page.
  • Use Sheet saves a 16-bit TIFF in ~/Library/Application Support/OpenQuad/contact-sheets/ and makes it the photo in the print window, ready to print or to print as a digital negative.
  • Core: Python openquad.contactsheet and openquad contact-sheet PHOTOS... -o sheet.tif [--size WxH --background white --crop --wedge --labels --gap IN]. Swift ContactSheet matches pixel for pixel: resizing is an exact integer box average. File names use each platform's font, so they are left out of the comparison, as with the blocking sheet.
  • Guide (v11), README and changelog updated.

Test plan

  • Python: 11 contact sheet tests (grid, cells, resize, crop/fit, wedge, labels, CLI); full suite in pre-commit; ruff, mypy --strict
  • Swift core 66 tests, including 5 whole sheets, 5 grids and 5 resizes matched to Python
  • Swift app 20 tests: printable room, add/reorder/remove, 16-photo limit, make, use as photo (landscape turned)
  • Snapshot of the window: 12 photos with names and wedge on black

🤖 Generated with Claude Code

akendrick and others added 4 commits November 1, 2026 18:49
OpenQuad > Settings… switches every length the app shows and takes (safe edge,
black outline, set sizes, print sizes, margins, the summary) between inches and
millimetres; remembered in settings.json ("units"). Files, settings and the
command line stay in inches.

- Python: openquad.units; PrintSession.units in the summary; Settings.units
- Swift core: LengthUnit, matched by new mm session vectors
- App: Settings window, length steppers that step in 1 mm / 0.5 mm, mm sizes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Save Setup… (negative mode) keeps the process curve (copied in beside the
setup), ink colour, mirror, safe edge, black outline, printer and paper under a
name; the Setup menu applies one and shows which setup the settings match.
Stored as .oqsetup JSON in OpenQuad's setups folder.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new window (File > New Contact Sheet…, or Make a Contact Sheet… under Photo)
arranges up to 16 photos on a sheet the size of the page's printable room,
portrait or landscape, on black or white, whole or cropped to fill each cell,
with optional file names and a 21-step greyscale wedge. Use Sheet makes it the
photo in the print window, to print as is or as a digital negative.

- Python: openquad.contactsheet (exact integer box resizing), `openquad contact-sheet`
- Swift core: ContactSheet, matched pixel for pixel by new vectors
- App: ContactSheetModel/View, printable room from the print window, guide v11

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@akendrick
akendrick changed the base branch from feature/negative-setups to main November 2, 2026 16:48
@akendrick
akendrick merged commit f729ca7 into main Nov 2, 2026
9 of 10 checks passed
@akendrick
akendrick deleted the feature/contact-sheet branch November 2, 2026 17:07
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