lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
82 lines • 4.79 kB
JavaScript
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