Skip to content

Granular per-setting copy/paste and apply-to-roll#604

Merged
marcinz606 merged 1 commit into
mainfrom
feat/granular-copy
Jul 22, 2026
Merged

Granular per-setting copy/paste and apply-to-roll#604
marcinz606 merged 1 commit into
mainfrom
feat/granular-copy

Conversation

@marcinz606

@marcinz606 marcinz606 commented Jul 22, 2026

Copy link
Copy Markdown
Owner

What

Copy/paste and Apply settings… (sync to selection / whole roll) are now per-setting instead of a handful of broad section checkboxes.

A new picker — built on the keyboard-shortcut editor's collapsible sections — lists only the settings that differ from default on the source frame, grouped by area (Tone, Colour, Lab, Toning, Finish, Crop, Rotation, Process, Retouch, Metadata, Export) with each value shown. Tick what you want, hit Apply. Paste now pops the same picker (Ctrl+V) rather than replacing the whole config at once.

How

  • negpy/desktop/settings_catalog.py (new) — declarative CATALOG of copyable SettingRows (labels + fields), edited_sections() for non-default detection, and apply_selected_fields() for the per-field merge. Per-channel R/G/B trims collapse into one grouped row; crosstalk strength/profile/matrix copy atomically.
  • granular_settings_dialog.py (new) — GranularSettingsDialog reusing CollapsibleSection; shared by paste and apply. Scope radios (Selected / Whole roll) and the roll-baseline bounds toggles show only in apply mode.
  • session.pysync_selected_settings(rows, bounds_flags, scope) and apply_pasted_fields(rows). Removed build_synced_config + aspect constants. Deleted SyncSettingsDialog.
  • All four paste triggers (canvas menu, toolbar, filmstrip menu, Ctrl+V) route through open_paste_dialog.

Per-frame data — dust spots, heal strokes, crop bounds — is never in the catalog, so it's never overwritten.

closes #601

Tests

Ported test_sync_settings.py (catalog integrity, edited_sections, apply_selected_fields, grouped trims, crosstalk, target-preservation) and the session/dialog tests to the new API. Full suite: 2403 passed, lint + type green.

Replace the coarse section-checkbox Apply dialog and all-or-nothing paste
with a per-setting picker built on the shortcut-editor's collapsible
sections. It lists only the settings that differ from default on the
source frame, grouped by area with values shown; the user ticks what to
apply.

- settings_catalog.py: declarative catalog of copyable settings, edited
  detection (edited_sections) and a per-field merge (apply_selected_fields).
- GranularSettingsDialog: shared by paste (Ctrl+V now opens the picker) and
  "Apply settings..."; roll-baseline bounds kept as the one special path.
- session: sync_selected_settings takes rows + bounds flags;
  apply_pasted_fields replaces instant paste. Removed build_synced_config
  and the aspect constants.

Per-frame data (dust spots, heal strokes, crop bounds) is never
overwritten. Tests ported to the new API.
@marcinz606
marcinz606 merged commit ec66499 into main Jul 22, 2026
1 check passed
@marcinz606
marcinz606 deleted the feat/granular-copy branch July 22, 2026 21:12
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.

more granular copy/paste of edits & edits sync

1 participant