Skip to content

Tabbed window and a contact sheet progress bar - #43

Merged
akendrick merged 7 commits into
mainfrom
feature/tabs
Nov 2, 2026
Merged

akendrick merged 7 commits into
mainfrom
feature/tabs

Conversation

@akendrick

Copy link
Copy Markdown
Owner

Stacked on #42 (contact sheets).

Tabs

  • One window, five toolbar tabs (⌘1–⌘5): Print, Negative, Contact Sheet, Printer Calibration, Process Calibration. No more floating wizard windows.
  • Each tab keeps its own work. Print and Negative each remember their own photo, printer and paper (negative_printer / negative_paper added to settings.json, Python and Swift), so you can calibrate one printer, print on another and refine a process at the same time.
  • Process Calibration holds both steps: 1. Blocking colour, 2. Process curve. Each calibration tab runs one run; New Calibration / New Process start over.
  • Hand-offs offer to use the result: a printer calibration goes to the Print tab (only when that printer is chosen), a blocking colour moves on to the process curve, a process curve goes to the Negative tab and offers Save Setup…, and a contact sheet goes to Print It or Make a Negative.
  • On quit, OpenQuad asks whether to keep open photos and the contact sheet for next time (Keep / Start Fresh / Cancel), and reopens on the last tab.
  • Shared settings are read, changed and saved, so the two photo tabs never overwrite each other's keys.

Contact sheet progress

  • Photos load one at a time, each appearing as it's ready, behind a progress bar showing "Opening frame-04.tif (4 of 12) · about 18 s left".

Tests

  • New TabsTests (per-tab state, tab memory, units, hand-offs, keeping work, loading estimates); guide test updated for the rewritten guide (v12).
  • Swift core 66 / app 28 passing; ruff, mypy --strict and the pytest suite pass.

🤖 Generated with Claude Code

akendrick and others added 6 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>
One window with five toolbar tabs (⌘1–⌘5): Print, Negative, Contact Sheet,
Printer Calibration and Process Calibration. Each keeps its own work; Print and
Negative each remember their own photo, printer and paper. Finished calibrations,
blocking colours, process curves and contact sheets hand off to the tab that uses
them. On quit, OpenQuad asks whether to keep open work for next time, and reopens
on the last tab. Contact sheets load photos one at a time behind a progress bar
with an estimate of the time left.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@akendrick
akendrick changed the base branch from feature/contact-sheet to main November 2, 2026 17:06
@akendrick
akendrick merged commit 56ba388 into main Nov 2, 2026
5 checks passed
@akendrick
akendrick deleted the feature/tabs branch November 2, 2026 17:20
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