Repository navigation
Shortcuts for every command, Last Filter, New from Clipboard, Camera Raw presets, crop ratios, History panel - #3
Merged
Conversation
Only commands that shipped with a key could be remapped in Edit › Keyboard Shortcuts, a saved key couldn't be removed, and one saved entry that no longer fit threw away every other override. The Delete-key menu entries were also looked up as U+0008, so changing Fill or Content-Aware Fill did nothing. Ported from upstream: a More Menu Commands section lists every menu command without a default key by its "Menu › Item" title, each row gets a clear button, saved overrides load one at a time so a bad one drops alone, and Delete is recorded as U+007F. Also covers the commands the port left out (Check for Updates, Hide Compositor, Show All, Open Recent › Clear Menu), and names the ⌥⌘H entry Hide Others, which is what that key does. Ports robbietilton#186 Co-authored-by: Fvzion <jairocampos7@outlook.com>
Running the same filter twice meant reopening its panel and pressing OK again. As in Photoshop, ⌘F now applies the last Filter-menu filter again with the settings it was applied with, without the panel, as one undo step. A filter with nothing to apply closes without leaving an invisible edit open. The upstream test that read ⌘F from the app's real menu bar can't run under the test host, whose menu bar isn't the app's; a test of the shortcut entry replaces it, and the menu bar stays a manual check. Ports robbietilton#192 Co-authored-by: Rezaul Arif <rezaulkarimarif.ctG@gmail.com>
Starting a project from a screenshot or a copied image took New Canvas, Return and Paste. New from Clipboard opens a project the size of the copied image, with it as the only layer, in one undo step; pixels copied in an open project come first, as Paste takes them. Image files copied in Finder open as dropping them on the Dock icon does, and a copied file that isn't an image doesn't count, though Finder copies its icon as image data. The shortcut is ⌥⌘N rather than upstream's ⇧⌘V, which Photoshop uses for Paste in Place. The menu item is disabled without an image on the clipboard; nothing announces clipboard changes, so the app checks the change count each second while it's active and then looks only at the kinds of data and the copied files' types, which doesn't make macOS ask for clipboard access. The tests use pasteboards of their own, never the person's clipboard. Ports robbietilton#201 and the handling of files copied in Finder from robbietilton#176 Co-authored-by: Timo Grevers <timo@omniscale.nl> Co-authored-by: oasido <asido.ofek@gmail.com>
Camera Raw could only be reset as a whole, and a look had to be rebuilt by hand for every photo. Each section header now has a reset button that puts that section back to its defaults, choices and midpoints included, and shows it again if its eye was off, so the next change isn't made unseen. A Presets menu at the top of the panel saves the settings under a name and applies, renames or deletes saved looks. Presets live in one JSON file in Application Support, not in projects, so the project format doesn't change. A preset this build can't read stays in the file, an unreadable file is moved aside to .bak before it is replaced, and missing fields take their defaults. Geometry guide lines stay out of presets: they belong to the image they were drawn on. The settings types become Codable for this. Ports robbietilton#187 and robbietilton#198 Co-authored-by: Fvzion <jairocampos7@outlook.com>
The crop ratio picker offered a fixed list, so 9:20 or 2.39:1 couldn't be cropped to. Its new Custom… entry takes a width and a height; the ratio is chosen, applied to the frame, and listed after the built-in ones from then on, newest first and across tabs and launches, like the tool's switches. Cancel and Apply Crop sat at the far end of the bar, away from the ratio they act with; they now follow the ratio picker, with the crop size after them so its changing width never moves them. Requested upstream in robbietilton#165 and robbietilton#202
Undo steps could only be walked one at a time. A History panel, switched to from above the Layers panel, lists every step by name, oldest first, after the state before the oldest step kept. Clicking one goes back or forward to it in one move, restoring the document once rather than step by step; the steps after it stay, dimmed, for Redo, and a new edit drops them, as in Photoshop. Renaming a layer or editing an adjustment brings the Layers panel back, since both happen there. Reimplements the History panel from the closed robbietilton#146 on the existing DocumentHistory, without that PR's selection tools. Co-authored-by: vfxbro <faqyouman@gmail.com>
The shortcut loader dropped a saved override the rules now refuse on its own, but a value that didn't decode at all (damaged, or edited by hand) still failed the whole dictionary and reset every shortcut. Each entry now decodes on its own, and one that can't be read is skipped like any other refused entry.
The ratio picker's Custom… entry asks for a ratio instead of being one; hosting the crop bar shows the choice going back to the ratio it had while the form opens.
…ages Plans, notes, verification and final summaries for the shortcuts and workflow tasks, and the offscreen and Dev-app captures their notes and the PR show.
…shortcuts-and-workflow Conflicts: README (custom crop ratios next to Image Rotation) and the Layer menu (Show/Hide Layer keeps its assignable shortcut beside #2's Show/Hide All Other Layers). The menu commands #1 and #2 added had no way to take a key, which this PR promises for every menu command, so they're now in More Menu Commands: File › Export As…, Edit › Stroke…, Image › Image Rotation's three items, and Layer › Apply Layer Mask, Show or Hide All Other Layers, Merge Visible, Flatten Image, Align, Distribute and Layer Style. Unsharp Mask and High Pass were already covered by the generated Filter list.
Conflict: ToolDefaults. This PR made isTesting visible to CustomCropRatios; #6 added the settings store beside it. Both kept.
unsavedWorkIsNeverReplacedWithoutAsking checked that the reload question was pending after a fixed 0.9 s sleep. On CI's slower runners the watcher's event sometimes came later, failing main (74ff4b6, and before at 5b0a588, a docs-only commit) and PR #3. It now waits for the question with the suite's eventually helper, as its sibling tests do.
…into feat/shortcuts-and-workflow
itsjavi
added a commit
that referenced
this pull request
Oct 8, 2026
…eam-fixes Conflict: SelectionClipboard's Paste. This PR admits a pasted image against DocumentLimits before decoding it (pastedImage); #3 moved Paste onto a shared pasteboardImage helper. Paste keeps the admission; New from Clipboard keeps the helper, since it checks the limits itself before opening the image.
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
Five workflow features from the upstream review (backlog doc-1), ported or reimplemented: shortcuts for every menu command plus Filter › Last Filter, File › New from Clipboard, Camera Raw section resets and presets, custom crop ratios with the crop buttons moved next to the ratio, and a History panel. One commit per task or upstream PR, with co-author credit.
Merge note: merge this after the upstream-fixes PR. TASK-22 lists TASK-10 (Camera Raw speed) as a dependency for ordering only; the two touch different Camera Raw code.
TASK-18: shortcuts for every menu command, and Last Filter (⌘F)
assignableShortcut). Each row gets a ⊗ that clears its key. Saved overrides load one at a time, so a refused one drops alone instead of resetting all of them. Delete is recorded as U+007F, so the Fill and Content-Aware Fill entries are found again.fix:commit). Upstream still reset everything in that case.CompositorTestHost, so a test of the shortcut entry replaces it.TASK-13: File › New from Clipboard
NSPasteboardItem.detectedMetadatacontent types, never at the contents, so it can't trigger macOS's clipboard-access prompt. The command reads the clipboard only when chosen.NSPasteboard.withUniqueName()pasteboards and never touch the general pasteboard.TASK-22: Camera Raw section resets and presets
.bakbefore it's replaced.Codable. Two hunks needed reduced context because the fork's Camera Raw filesimport CPixels.TASK-23: custom crop ratios, and the crop buttons next to the ratio picker
tool.cropRatios). Ratios are now parsed generally instead of from a fixedswitch.TASK-25: History panel
DocumentHistorygainsstepNames,positionandjump(to:). A jump moves entries between the undo and redo stacks in one go, trims once, and restores the document once instead of replaying every Undo.Testing
Only the relevant suites, as one final run:
Result: 62 tests in 8 suites passed. After that run, two tests were added and checked with
--filter 'CropRatioTests|KeyboardShortcutTests'(18 tests passed): the undecodable-shortcut test and the hosted crop bar checking Custom….make devbuilds, and the Dev app launches with every menu shortcut resolving.Not run:
SelectionClipboardTests, because it writes the real general pasteboard. Paste's change is only moving its image reading intoEditorSession.pasteboardImage.Screenshots
The Keyboard Shortcuts window, Camera Raw panel and crop bar can't be reached from launch, so they were rendered offscreen in throwaway test runs (
NSHostingView+cacheDisplay). "Before" images come from a throwaway worktree of main (caf0627). The window captures come from the Dev app.Keyboard Shortcuts, top of the list. Before / after: clear buttons, plus the New from Clipboard and Last Filter entries.
Keyboard Shortcuts, scrolled to the end of Menus. Before / after: the new More Menu Commands section.
Camera Raw panel, with Exposure, Contrast and Vibrance edited on a two-color test image. Before / after: the Presets menu, and a reset button in each header (dimmed for Color Grading, which is at its defaults).
Crop bar on a 300×200 image. Before:
After, with the buttons next to the ratio picker:
After, with a typed 9:20 chosen:
The Custom… form (after):
Side panel, after five edits and one Undo, rendered offscreen. Before (Layers only) / after (History selected; the undone step is dimmed):
Dev app with a 1200×800 fixture PNG opened. Before:
After, with Layers selected:
After, with History selected:
New from Clipboard has no screenshot: reaching it needs an image on the real clipboard.
Manual checks still needed
Expected overlaps with other PRs
CompositorApp.swift(menu items),UI/KeyboardShortcuts.swift(robbietilton#186 reworks the registry: new menu items without a default key need an entry inShortcutDefinition.assignableMenuCommandsand.assignableShortcut("Menu › Item"); ones with a default key need an entry inShortcutDefinition.all, or a Debug assertion fires),ContentView.swift(one line for the side panel, one for the filter panel),Document/Filters.swift,Document/EditorSession.swift,README.md.Upstream (robbietilton/Compositor):