Skip to content

Commit 3ccfba9

Browse files
authored
feat: ephemeral focus public getter, use in shortcut precondition (#9110)
1 parent 0498ed6 commit 3ccfba9

2 files changed

Lines changed: 30 additions & 6 deletions

File tree

core/focus_manager.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,13 @@ export class FocusManager {
458458
};
459459
}
460460

461+
/**
462+
* @returns whether something is currently holding ephemeral focus
463+
*/
464+
ephemeralFocusTaken(): boolean {
465+
return this.currentlyHoldsEphemeralFocus;
466+
}
467+
461468
/**
462469
* Ensures that the manager is currently allowing operations that change its
463470
* internal focus state (such as via focusNode()).

core/shortcut_items.ts

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import {BlockSvg} from './block_svg.js';
1010
import * as clipboard from './clipboard.js';
1111
import * as eventUtils from './events/utils.js';
12+
import {getFocusManager} from './focus_manager.js';
1213
import {Gesture} from './gesture.js';
1314
import {
1415
ICopyable,
@@ -72,7 +73,9 @@ export function registerDelete() {
7273
focused != null &&
7374
isIDeletable(focused) &&
7475
focused.isDeletable() &&
75-
!Gesture.inProgress()
76+
!Gesture.inProgress() &&
77+
// Don't delete the block if a field editor is open
78+
!getFocusManager().ephemeralFocusTaken()
7679
);
7780
},
7881
callback(workspace, e, shortcut, scope) {
@@ -152,7 +155,8 @@ export function registerCopy() {
152155
!workspace.isReadOnly() &&
153156
!Gesture.inProgress() &&
154157
!!focused &&
155-
isCopyable(focused)
158+
isCopyable(focused) &&
159+
!getFocusManager().ephemeralFocusTaken()
156160
);
157161
},
158162
callback(workspace, e, shortcut, scope) {
@@ -199,7 +203,8 @@ export function registerCut() {
199203
isCopyable(focused) &&
200204
// Extra criteria for cut (not just copy):
201205
!focused.workspace.isFlyout &&
202-
focused.isDeletable()
206+
focused.isDeletable() &&
207+
!getFocusManager().ephemeralFocusTaken()
203208
);
204209
},
205210
callback(workspace, e, shortcut, scope) {
@@ -246,7 +251,11 @@ export function registerPaste() {
246251
const pasteShortcut: KeyboardShortcut = {
247252
name: names.PASTE,
248253
preconditionFn(workspace) {
249-
return !workspace.isReadOnly() && !Gesture.inProgress();
254+
return (
255+
!workspace.isReadOnly() &&
256+
!Gesture.inProgress() &&
257+
!getFocusManager().ephemeralFocusTaken()
258+
);
250259
},
251260
callback(workspace: WorkspaceSvg, e: Event) {
252261
if (!copyData || !copyWorkspace) return false;
@@ -305,7 +314,11 @@ export function registerUndo() {
305314
const undoShortcut: KeyboardShortcut = {
306315
name: names.UNDO,
307316
preconditionFn(workspace) {
308-
return !workspace.isReadOnly() && !Gesture.inProgress();
317+
return (
318+
!workspace.isReadOnly() &&
319+
!Gesture.inProgress() &&
320+
!getFocusManager().ephemeralFocusTaken()
321+
);
309322
},
310323
callback(workspace, e) {
311324
// 'z' for undo 'Z' is for redo.
@@ -340,7 +353,11 @@ export function registerRedo() {
340353
const redoShortcut: KeyboardShortcut = {
341354
name: names.REDO,
342355
preconditionFn(workspace) {
343-
return !Gesture.inProgress() && !workspace.isReadOnly();
356+
return (
357+
!Gesture.inProgress() &&
358+
!workspace.isReadOnly() &&
359+
!getFocusManager().ephemeralFocusTaken()
360+
);
344361
},
345362
callback(workspace, e) {
346363
// 'z' for undo 'Z' is for redo.

0 commit comments

Comments
 (0)