Skip to content

Gear & Metadata: Roll/Frame tab split, Items/Presets split, folder-name inference - #1113

Draft
PabloRuizCuevas wants to merge 10 commits into
marcinz606:mainfrom
PabloRuizCuevas:feat/pr-gear-metadata-reorg
Draft

PabloRuizCuevas wants to merge 10 commits into
marcinz606:mainfrom
PabloRuizCuevas:feat/pr-gear-metadata-reorg

Conversation

@PabloRuizCuevas

@PabloRuizCuevas PabloRuizCuevas commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Summary

The Gear & Metadata surface gets reorganized across several fronts that all touch the same area of the app.

  • Setup becomes its own Roll tab; Edit renames to Frame: Calibration, Demosaic, Roll Analysis, Normalization and Presets are roll-wide facts set once, not per-frame edits -- most already carry forward automatically (sticky settings) or persist as an app-wide default (Linear RAW, Narrowband, Demosaic), unlike genuine per-image adjustments. They get their own top-level Roll tab (built the same flat-stack-of-cards way Metadata and Gear already are), out of what's renamed Frame: the per-image workflow groups (Geometry, Tone, Color, Finish), Favorites and History.
  • Gear tab splits into Items and Presets subtabs, with their own shortcut registry entries.
  • Gear combos default to your own gear, offering the full catalog only on "+"; Add Custom leaves real fields blank, naming only display_name.
  • Protect Original Metadata moves from Metadata to the Export tab (it's export-time behavior, not metadata content).
  • Suggest camera and film stock from a folder name: importing a folder as a roll matches its name against your own gear library (cameras and film stocks only, matched as shared words or squashed abbreviations). A match opens Roll Settings pre-filled and ticked; nothing is invented from free text, and two candidates matching the same field counts as no match. The tag-icon Roll Settings button offers the same suggestion by hand, and camera/film-stock are checked independently so an unrelated field already set doesn't block the other from being suggested.
  • Infer from folder name button on the Metadata tab's Analog Gear card: the same folder-name match, triggered directly, without opening Roll Settings. This also infers ISO and capture date from the folder name (any plausible number or date in the name), gear matched only against your own library -- same button, same feature, just extended a bit further.
  • Metadata Preview and Metadata Presets stay always-expanded, with no collapse chevron — every other card keeps its chevron and default expanded state.

Note: this PR is based on main but its branch includes #1109's commits (folder and virtual rolls, Roll Settings dialog, New Roll workflow -- this reorganization needs the Roll concept #1109 introduces) -- please review/merge #1109 first. This branch was rebuilt fresh off #1109's current tip, so once #1109 lands, this diff will automatically shrink to just the gear/metadata changes.

Testing

make all (ruff check/format, full pytest) passes with only one known unrelated failure (test_load_tooltip_follows_a_rebinding, a macOS key-symbol rendering difference, pre-existing on main).

🤖 Generated with Claude Code

@PabloRuizCuevas PabloRuizCuevas changed the title Gear & Metadata: detachable Roll panel, Items/Presets split, folder-name inference Gear & Metadata: Roll/Frame tab split, detachable Roll panel, Items/Presets split, folder-name inference Sep 15, 2026
@PabloRuizCuevas PabloRuizCuevas changed the title Gear & Metadata: Roll/Frame tab split, detachable Roll panel, Items/Presets split, folder-name inference Gear & Metadata: Roll/Frame tab split, Items/Presets split, folder-name inference Sep 15, 2026
PabloRuizCuevas and others added 10 commits September 17, 2026 17:13
… workflow

Rolls (negpy/services/assets/rolls.py) replace folders as the library's
primary listing: importing a folder recognizes it as a roll; Save as
Roll… turns any loaded batch into a reopenable virtual roll, not
necessarily from one folder. The Library tree lists every roll flat,
color-coded (folder amber, virtual coral, no left-side twisty gutter),
with Rename…, bulk Delete…, and an opt-in "rename the folder on disk"
checkbox that rehomes every loaded path when the renamed roll is the
active one.

Roll Settings dialog tags gear, capture, place, process and scanning
metadata for the current frame, a selection, or the whole roll in one
dialog, with a Load-preset flow to fill and tick fields.

New Roll moves off the toolbar onto the Film Strip section's own
header menu (CollapsibleSection.set_actions_menu), next to Reset Roll
to Defaults — a roll-wide reset (reused _asset_defaults, one frame's
worth of logic applied to every visible one) with its own confirm
dialog. The top-level toolbar is gone: actions live in the row of the
section they act on, Library's own corner row or the Film Strip row
next to the loaded frames. restore_session now recognizes the active
roll on restart too, the same "only when unambiguous" rule an
already-open multi-folder session uses.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…o Frame

Calibration, Demosaic, Roll Analysis, Normalization and Presets are roll-wide
facts set once, not per-frame edits, so they move into their own top-level
Roll tab (a flat stack of cards, built from ControlsPanel's sections directly
rather than a ControlsPanel page). What remains -- Geometry, Tone, Color,
Finish, Favorites, History -- keeps its own inner tab switcher under a
renamed Frame group, with the sticky Analysis section now pinned there
instead of above every group. reveal_section routes a Roll-tab section to
the Roll group instead of Frame's inner switcher.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
tab_setup becomes tab_roll, matching the right-panel rename; the
analysis_draw tool button follows it to the Roll group. New tab_gear,
tab_gear_items and tab_gear_presets entries cover the Gear tab this PR
adds. KEYBOARD.md is regenerated.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
show_tab_by_key("setup") is now show_tab_by_key("roll"). The gear-library
step splits into a Metadata step and a Gear Library step, targeting the
new top-level Gear tab instead of the retired Manage... button.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
GearLibraryPanel replaces GearLibraryDialog: a persistent tab, not a
dialog, with its own Items/Presets switcher. Items holds physical gear
with a bundled/personal Catalog toggle; Presets holds saved metadata
field sets, which have no bundled counterpart, so the toggle stays on
Items only.

Gear combos across the app default to personal gear: own_gear_entries()
filters bundled items out (keeping one already selected), appending an
Other... row that opens GearCatalogDialog -- pick a built-in model to
clone into a personal copy, or Add Custom for a blank one with only
display_name filled.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
match_gear_for_folder() matches a roll's folder name against the gear
catalog (bundled and personal) two ways: shared words and a squashed,
delimiter-free run, for scan-folder abbreviations. More than one
candidate for a field counts as no match. A standalone ISO/capture-date
reader covers what isn't a catalog lookup; a matched film stock already
carries its own ISO, so the ISO guess only fires when no stock matched.

A folder becoming a roll for the first time (import, or the tag-icon
Roll Settings button by hand) offers Roll Settings pre-filled and ticked
via RollSettingsDialog.apply_detected_gear(). Camera and film stock are
checked independently, so an unrelated field already set on the frame
doesn't block the other from being suggested.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The Camera/Lens/Film stock combos default to personal gear via
own_gear_entries(), with Other... resolving through GearCatalogDialog
the same way the Gear tab's own combos do. Infer from folder name fills
whichever of camera, film stock, ISO and capture date the frame doesn't
already carry, from the active roll's folder name (or the current
frame's own folder with no roll active) -- the same match Roll Settings
offers on import.

Metadata Preview and Metadata Presets stay always-expanded, with no
collapse chevron, via make_section's new collapsible=False; every other
card keeps its chevron and default expanded state. Preview pins above
the per-frame cards, which now scroll in their own area below it, the
same pattern Frame's Analysis section uses above its tabs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Protect Original Metadata and Sync To Batch are export-time behaviors
over the Metadata tab's per-frame fields, not metadata content
themselves, so they live beside the Export button rather than on that
tab. Both still read and write MetadataConfig; Metadata's own fields
disable under Protect through the ordinary config sync.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Setup's content moves to a new "Roll tab" section (renumbered §10);
Geometry through History shift up to fill its old slot. New "Gear tab"
section (§12) documents Items/Presets. Metadata (§11) points Protect
Original Metadata at Export, drops the retired Manage... bullet in
favor of a Gear-tab pointer, and documents own-gear search plus Infer
from folder name. Export (§13) documents its new Protect/Sync bullets.
The workflow table leads with Roll, then Frame's own tab bar, then the
tabs that never change the render (Metadata, Gear, Export, Scan).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Import Folder as a Roll... and the tag-icon Roll Settings button both
offer the folder-name gear match; the earlier docs commit covered the
Roll/Metadata/Gear/Export sections but missed these two Film Strip
bullets.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@PabloRuizCuevas
PabloRuizCuevas force-pushed the feat/pr-gear-metadata-reorg branch from 6103e55 to e79e57a Compare September 17, 2026 11:03
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