diff --git a/core/focus_manager.ts b/core/focus_manager.ts index 01be4813f..3d0a9347f 100644 --- a/core/focus_manager.ts +++ b/core/focus_manager.ts @@ -458,6 +458,13 @@ export class FocusManager { }; } + /** + * @returns whether something is currently holding ephemeral focus + */ + ephemeralFocusTaken(): boolean { + return this.currentlyHoldsEphemeralFocus; + } + /** * Ensures that the manager is currently allowing operations that change its * internal focus state (such as via focusNode()). diff --git a/core/shortcut_items.ts b/core/shortcut_items.ts index c175637c6..fb1ca0fce 100644 --- a/core/shortcut_items.ts +++ b/core/shortcut_items.ts @@ -9,6 +9,7 @@ import {BlockSvg} from './block_svg.js'; import * as clipboard from './clipboard.js'; import * as eventUtils from './events/utils.js'; +import {getFocusManager} from './focus_manager.js'; import {Gesture} from './gesture.js'; import { ICopyable, @@ -72,7 +73,9 @@ export function registerDelete() { focused != null && isIDeletable(focused) && focused.isDeletable() && - !Gesture.inProgress() + !Gesture.inProgress() && + // Don't delete the block if a field editor is open + !getFocusManager().ephemeralFocusTaken() ); }, callback(workspace, e, shortcut, scope) { @@ -152,7 +155,8 @@ export function registerCopy() { !workspace.isReadOnly() && !Gesture.inProgress() && !!focused && - isCopyable(focused) + isCopyable(focused) && + !getFocusManager().ephemeralFocusTaken() ); }, callback(workspace, e, shortcut, scope) { @@ -199,7 +203,8 @@ export function registerCut() { isCopyable(focused) && // Extra criteria for cut (not just copy): !focused.workspace.isFlyout && - focused.isDeletable() + focused.isDeletable() && + !getFocusManager().ephemeralFocusTaken() ); }, callback(workspace, e, shortcut, scope) { @@ -246,7 +251,11 @@ export function registerPaste() { const pasteShortcut: KeyboardShortcut = { name: names.PASTE, preconditionFn(workspace) { - return !workspace.isReadOnly() && !Gesture.inProgress(); + return ( + !workspace.isReadOnly() && + !Gesture.inProgress() && + !getFocusManager().ephemeralFocusTaken() + ); }, callback(workspace: WorkspaceSvg, e: Event) { if (!copyData || !copyWorkspace) return false; @@ -305,7 +314,11 @@ export function registerUndo() { const undoShortcut: KeyboardShortcut = { name: names.UNDO, preconditionFn(workspace) { - return !workspace.isReadOnly() && !Gesture.inProgress(); + return ( + !workspace.isReadOnly() && + !Gesture.inProgress() && + !getFocusManager().ephemeralFocusTaken() + ); }, callback(workspace, e) { // 'z' for undo 'Z' is for redo. @@ -340,7 +353,11 @@ export function registerRedo() { const redoShortcut: KeyboardShortcut = { name: names.REDO, preconditionFn(workspace) { - return !Gesture.inProgress() && !workspace.isReadOnly(); + return ( + !Gesture.inProgress() && + !workspace.isReadOnly() && + !getFocusManager().ephemeralFocusTaken() + ); }, callback(workspace, e) { // 'z' for undo 'Z' is for redo.