import {Duration, formatDuration} from '../components/Duration';
import Element = JSX.Element;
import {Section} from "../components/Section";
import MultiRangeSlider from "../components/MultiSlider";
import {DemoHead} from "../header";
import {createSignal} from "solid-js";
import {downloadBuffer, edit} from "./tools";
export interface EditPageProps {
header: DemoHead;
demoData: ArrayBuffer;
setDropText: (string) => void,
name: string,
}
export const Editor = (props: EditPageProps) => {
let demoInfo: any[] | Element = [];
demoInfo = (
{props.header.map}
);
const [loading, setLoading] = createSignal(false);
const [cutFrom, setCutFrom] = createSignal(0);
const [cutTo, setCutTo] = createSignal(props.header.ticks);
const intervalPerTick = props.header.duration / props.header.ticks;
const [unlockPov, setUnlockPov] = createSignal(false);
const editCb = async () => {
try {
setLoading(true);
(props.setDropText)("Editing...");
await doEdit(props.name, props.demoData, props.header, unlockPov(), cutFrom(), cutTo());
(props.setDropText)(props.name);
setLoading(false);
} catch (e) {
(props.setDropText)("Error: " + e.toString());
setLoading(false);
}
}
return (
{demoInfo}
- Cuts the demo file to the selected tick range.
- Cutting demos is experimental, resulting demo files might crash, have broken animations or have other issues.
- Changing the specific cut range can sometimes work around issues with broken demos.
{
if (min !== cutFrom() || max !== cutTo()) {
setCutFrom(min);
setCutTo(max);
}
}}
labelFn={(ticks) => formatDuration(ticks * intervalPerTick)}
/>
);
}
async function doEdit(name: string, data: ArrayBuffer, header: DemoHead, unlockPov: boolean, from: number, to: number) {
let options = {
unlock_pov: unlockPov,
cut: (from > 0 || to < header.ticks) ? {from, to} : undefined,
}
console.log(options);
const edited = await edit(data, options);
downloadBuffer(edited, name.replace('.dem', '_edited.dem'));
}