lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
122 lines • 4.79 kB
JavaScript
import { createEffect } from "@lincode/reactivity";
import openFolder from "../../api/files/openFolder";
import saveJSON from "../../api/files/saveJSON";
import deleteSelected from "./deleteSelected";
import { emitEditorCenterView } from "../../events/onEditorCenterView";
import { onKeyClear } from "../../events/onKeyClear";
import { emitSelectionTarget } from "../../events/onSelectionTarget";
import { setEditorCamera, getEditorCamera } from "../../states/useEditorCamera";
import { setMultipleSelection } from "../../states/useMultipleSelection";
import { getSplitView, setSplitView } from "../../states/useSplitView";
import { getWorldPlayComputed } from "../../states/useWorldPlayComputed";
import mainCamera from "../mainCamera";
import copySelected from "./copySelected";
import { setTransformControlsSnap } from "../../states/useTransformControlsSnap";
import { getUILayer, setUILayer } from "../../states/useUILayer";
import { getHotKeysEnabled, setHotKeysEnabled } from "../../states/useHotKeysEnabled";
import settings from "../../api/settings";
import { container } from "../renderLoop/containers";
import MeshAppendable from "../../display/core/MeshAppendable";
import { selectionTargetPtr } from "../../pointers/selectionTargetPtr";
import { redo, undo } from "../../api/undoStack";
const enabledSet = new Set();
export const enableHotKeysOnElement = (el) => {
el.addEventListener("mouseover", () => enabledSet.add(el));
el.addEventListener("mouseout", () => enabledSet.delete(el));
el.addEventListener("drop", () => setHotKeysEnabled(true));
};
enableHotKeysOnElement(container);
export const handleStopPropagation = (e) => {
e.stopPropagation();
setHotKeysEnabled(!!enabledSet.size);
};
document.addEventListener("mousedown", () => setHotKeysEnabled(!!enabledSet.size));
const metaHotKey = (e) => {
e.preventDefault();
setMultipleSelection(false);
};
createEffect(() => {
if (getWorldPlayComputed() || !getHotKeysEnabled())
return;
const handleKeyDown = (e) => {
if (e.key === "Shift" || e.key === "Meta" || e.key === "Control")
setMultipleSelection(true);
if (e.key === "Shift")
setTransformControlsSnap(true);
if (e.key === "Backspace" || e.key === "Delete") {
e.preventDefault();
deleteSelected();
return;
}
const keyLowerCase = e.key.toLocaleLowerCase();
if (keyLowerCase === "g") {
settings.grid = !settings.grid;
return;
}
if (keyLowerCase === "1") {
if (!getSplitView())
setEditorCamera(getEditorCamera() === mainCamera ? undefined : mainCamera);
setSplitView(false);
return;
}
if (keyLowerCase === "2") {
setSplitView(true);
setEditorCamera(undefined);
return;
}
if (keyLowerCase === "3") {
setUILayer(!getUILayer());
return;
}
const [target] = selectionTargetPtr;
if (e.metaKey || e.ctrlKey) {
if (keyLowerCase === "z") {
metaHotKey(e);
if (e.shiftKey)
redo();
else
undo();
}
if (keyLowerCase === "y") {
metaHotKey(e);
redo();
}
if (keyLowerCase === "s") {
metaHotKey(e);
saveJSON();
}
else if (keyLowerCase === "o") {
metaHotKey(e);
openFolder();
}
else if (keyLowerCase === "c") {
metaHotKey(e);
copySelected();
}
else if (keyLowerCase === "p")
metaHotKey(e);
}
else if (keyLowerCase === "c") {
setEditorCamera(mainCamera);
setUILayer(false);
target instanceof MeshAppendable && emitEditorCenterView(target);
}
else if (keyLowerCase === "escape")
target && emitSelectionTarget(undefined);
};
const handleKeyUp = (e) => {
if (e.key === "Shift" || e.key === "Meta" || e.key === "Control")
setMultipleSelection(false);
if (e.key === "Shift")
setTransformControlsSnap(false);
};
document.addEventListener("keydown", handleKeyDown);
document.addEventListener("keyup", handleKeyUp);
const handle = onKeyClear(() => setMultipleSelection(false));
return () => {
document.removeEventListener("keydown", handleKeyDown);
document.removeEventListener("keyup", handleKeyUp);
handle.cancel();
};
}, [getWorldPlayComputed, getHotKeysEnabled]);
//# sourceMappingURL=index.js.map