Skip to content

Commit 6a85ad8

Browse files
Julien Moreau-Mathisjulien-moreau
authored andcommitted
fix: copy/past and focus shortcuts don't require elements to be focused
#562
1 parent ef190e2 commit 6a85ad8

File tree

3 files changed

+17
-6
lines changed

3 files changed

+17
-6
lines changed

editor/src/editor/layout/graph.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
} from "../../ui/shadcn/ui/context-menu";
3232

3333
import { isSound } from "../../tools/guards/sound";
34+
import { isDomTextInputFocused } from "../../tools/dom";
3435
import { isSceneLinkNode } from "../../tools/guards/scene";
3536
import { updateAllLights } from "../../tools/light/shadows";
3637
import { getCollisionMeshFor } from "../../tools/mesh/collision";
@@ -129,8 +130,8 @@ export class EditorGraph extends Component<IEditorGraphProps, IEditorGraphState>
129130
onTextureModifiedObservable.add((texture) => this._handleNodeModified(texture));
130131
onParticleSystemModifiedObservable.add((particleSystem) => this._handleNodeModified(particleSystem));
131132

132-
document.addEventListener("copy", () => this.state.isFocused && this.copySelectedNodes());
133-
document.addEventListener("paste", () => this.state.isFocused && this.pasteSelectedNodes());
133+
document.addEventListener("copy", () => !isDomTextInputFocused() && this.copySelectedNodes());
134+
document.addEventListener("paste", () => !isDomTextInputFocused() && this.pasteSelectedNodes());
134135
}
135136

136137
public render(): ReactNode {

editor/src/editor/layout/preview.tsx

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import { Editor } from "../main";
4242
import { isSound } from "../../tools/guards/sound";
4343
import { Tween } from "../../tools/animation/tween";
4444
import { isVector3 } from "../../tools/guards/math";
45+
import { isDomTextInputFocused } from "../../tools/dom";
4546
import { isNodeLocked } from "../../tools/node/metadata";
4647
import { registerUndoRedo } from "../../tools/undoredo";
4748
import { initializeHavok } from "../../tools/physics/init";
@@ -189,10 +190,7 @@ export class EditorPreview extends Component<IEditorPreviewProps, IEditorPreview
189190
ipcRenderer.on("gizmo:rotation", () => this.setActiveGizmo("rotation"));
190191
ipcRenderer.on("gizmo:scaling", () => this.setActiveGizmo("scaling"));
191192

192-
document.addEventListener("copy", () => this.state.isFocused && this.props.editor.layout.graph.copySelectedNodes());
193-
document.addEventListener("paste", () => this.state.isFocused && this.props.editor.layout.graph.pasteSelectedNodes());
194-
195-
ipcRenderer.on("preview:focus", () => this.state.isFocused && this.focusObject());
193+
ipcRenderer.on("preview:focus", () => !isDomTextInputFocused() && this.focusObject());
196194
ipcRenderer.on("preview:edit-camera", () => this.props.editor.layout.inspector.setEditedObject(this.props.editor.layout.preview.scene.activeCamera));
197195

198196
onTextureAddedObservable.add(() => checkProjectCachedCompressedTextures(props.editor));

editor/src/tools/dom.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,15 @@ export function isDomElementDescendantOf(element: HTMLElement, parent: HTMLEleme
2929

3030
return false;
3131
}
32+
33+
/**
34+
* Returns wether or not the currently focused DOM element is any text input.
35+
*/
36+
export function isDomTextInputFocused() {
37+
const element = document.activeElement as HTMLInputElement | HTMLTextAreaElement;
38+
if (!element) {
39+
return false;
40+
}
41+
42+
return (element.tagName === "INPUT" || element.tagName === "TEXTAREA" || element.isContentEditable) && !element.readOnly && !element.disabled;
43+
}

0 commit comments

Comments
 (0)