UNPKG

lingo3d

Version:

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

82 lines 4.79 kB
import { jsx as _jsx, jsxs as _jsxs } from "preact/jsx-runtime"; import { getExtensionType } from "@lincode/filetypes"; import { get, set } from "@lincode/utils"; import { useState } from "preact/hooks"; import Timeline from "../../display/Timeline"; import TimelineAudio from "../../display/TimelineAudio"; import { emitSelectionTarget } from "../../events/onSelectionTarget"; import { emitTimelineClearKeyframe } from "../../events/onTimelineClearKeyframe"; import unsafeGetValue from "../../utils/unsafeGetValue"; import ContextMenu from "../component/ContextMenu"; import MenuButton from "../component/MenuButton"; import useSyncState from "../hooks/useSyncState"; import { setTimeline } from "../../states/useTimeline"; import { getTimelineData, processKeyframe } from "../../states/useTimelineData"; import { getTimelineLayer } from "../../states/useTimelineLayer"; import { signal } from "@preact/signals"; import { uuidMap } from "../../collections/idCollections"; import { timelinePtr } from "../../pointers/timelinePtr"; import { timelineFramePtr } from "../../pointers/timelineFramePtr"; export const timelineContextMenuSignal = signal(undefined); const TimelineContextMenu = () => { const [dataCopied, setDataCopied] = useState(); const [timelineData] = useSyncState(getTimelineData); const timelineLayer = useSyncState(getTimelineLayer); return (_jsxs(ContextMenu, { positionSignal: timelineContextMenuSignal, input: timelineContextMenuSignal.value?.create === "audio" ? { label: "Audio src", onInput: (value) => { const [timeline] = timelinePtr; if (!timeline) return; const audio = new TimelineAudio(); audio.name = value; if (getExtensionType(value) === "audio") audio.src = value; timeline.mergeData({ [audio.uuid]: {} }); timeline.append(audio); //todo: refactor sceneGraphExpanded to make below work // setSceneGraphExpanded(new Set([timeline.outerObject3d])) emitSelectionTarget(audio); } } : timelineContextMenuSignal.value?.create === "timeline" ? { label: "Timeline name", onInput: (value) => { const timeline = new Timeline(); timeline.name = value; timeline.data = {}; setTimeline(timeline); emitSelectionTarget(timeline); } } : undefined, children: [_jsx(MenuButton, { disabled: timelineContextMenuSignal.value?.keyframe || !timelineData || !timelineLayer || !(timelineLayer.split(" ")[0] in timelineData), onClick: () => { processKeyframe((timelineData, uuid, property, frame) => set(timelineData, [uuid, property, frame], unsafeGetValue(uuidMap.get(uuid), property))); timelineContextMenuSignal.value = undefined; }, children: "Add keyframe" }), _jsx(MenuButton, { disabled: !timelineContextMenuSignal.value?.keyframe, onClick: () => { const data = {}; processKeyframe((timelineData, uuid, property, frame) => set(data, [uuid, property, "0"], get(timelineData, [uuid, property, frame])), true); setDataCopied(data); timelineContextMenuSignal.value = undefined; }, children: "Copy keyframe" }), _jsx(MenuButton, { disabled: !dataCopied, onClick: dataCopied ? () => { const data = {}; const frame = timelineFramePtr[0] + ""; for (const [uuid, properties] of Object.entries(dataCopied)) for (const [property, frames] of Object.entries(properties)) for (const value of Object.values(frames)) set(data, [uuid, property, frame], value); timelinePtr[0]?.mergeData(data); timelineContextMenuSignal.value = undefined; } : undefined, children: "Paste keyframe" }), _jsx(MenuButton, { disabled: !timelineContextMenuSignal.value?.keyframe, onClick: () => { emitTimelineClearKeyframe(); timelineContextMenuSignal.value = undefined; }, children: "Clear keyframe" })] })); }; export default TimelineContextMenu; //# sourceMappingURL=TimelineContextMenu.js.map