UNPKG

mylingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

82 lines (74 loc) 3.48 kB
import { useEffect } from "preact/hooks" import { isPositionedItem } from "../../api/core/PositionedItem" import openFolder from "../../api/files/openFolder" import saveJSON from "../../api/files/saveJSON" import deserialize from "../../api/serializer/deserialize" import serialize from "../../api/serializer/serialize" import settings from "../../api/settings" import applyCentripetalQuaternion from "../../display/utils/applyCentripetalQuaternion" import { emitEditorCenterView } from "../../events/onEditorCenterView" import { onKeyClear } from "../../events/onKeyClear" import { emitSelectionTarget } from "../../events/onSelectionTarget" import { getCentripetal } from "../../states/useCentripetal" import { setMultipleSelection, getMultipleSelection } from "../../states/useMultipleSelection" import { getMultipleSelectionTargets } from "../../states/useMultipleSelectionTargets" import { getSelectionTarget } from "../../states/useSelectionTarget" import { setTransformControlsSpace } from "../../states/useTransformControlsSpace" import deleteSelected from "./deleteSelected" export default () => { useEffect(() => { const handleKeyDown = async (e: KeyboardEvent) => { if (e.key === "Shift" || e.key === "Meta" || e.key === "Control") setMultipleSelection(true) if (e.key === "Backspace" || e.key === "Delete") { e.preventDefault() !getMultipleSelection() && deleteSelected() return } const keyLowerCase = e.key.toLocaleLowerCase() if (keyLowerCase === "g") { settings.gridHelper = !settings.gridHelper return } const target = getSelectionTarget() if (e.metaKey || e.ctrlKey) { e.preventDefault() if (keyLowerCase === "s") saveJSON() else if (keyLowerCase === "o") openFolder() else if (target) { if (keyLowerCase === "c") { const targets = getMultipleSelectionTargets() if (targets.length) { //todo: copy multiple } else { const [item] = deserialize(await serialize(target)) if (target.parent && item) { target.parent.attach(item) emitSelectionTarget(item) } } } else if (e.key === "ArrowUp" && getCentripetal()) { applyCentripetalQuaternion(target) setTransformControlsSpace("local") } } } else if (keyLowerCase === "c") isPositionedItem(target) && emitEditorCenterView(target) } const handleKeyUp = (e: KeyboardEvent) => { if (e.key === "Shift" || e.key === "Meta" || e.key === "Control") setMultipleSelection(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() } }, []) }