Gear & Metadata: Roll/Frame tab split, Items/Presets split, folder-name inference - #1113
Draft
PabloRuizCuevas wants to merge 10 commits into
Draft
PabloRuizCuevas wants to merge 10 commits into
PabloRuizCuevas wants to merge 10 commits into
Conversation
… 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
force-pushed
the
feat/pr-gear-metadata-reorg
branch
from
September 17, 2026 11:03
6103e55 to
e79e57a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The Gear & Metadata surface gets reorganized across several fronts that all touch the same area of the app.
display_name.Note: this PR is based on
mainbut 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 onmain).🤖 Generated with Claude Code