feat(canvas): finalize mixer reconnect swap and related updates

This commit is contained in:
2026-04-11 07:42:42 +02:00
parent f3dcaf89f2
commit 028fce35c2
52 changed files with 3859 additions and 272 deletions

View File

@@ -11,6 +11,10 @@ import {
resolveRenderPreviewInputFromGraph,
type RenderPreviewInput,
} from "@/lib/canvas-render-preview";
import {
resolveMixerPreviewFromGraph,
type MixerPreviewState,
} from "@/lib/canvas-mixer-preview";
interface CompareNodeData {
leftUrl?: string;
@@ -25,6 +29,7 @@ type CompareSideState = {
finalUrl?: string;
label?: string;
previewInput?: RenderPreviewInput;
mixerPreviewState?: MixerPreviewState;
isStaleRenderOutput: boolean;
};
@@ -59,6 +64,7 @@ export default function CompareNode({ id, data, selected, width }: NodeProps) {
const label = finalLabel ?? sourceLabel ?? defaultLabel;
let previewInput: RenderPreviewInput | undefined;
let mixerPreviewState: MixerPreviewState | undefined;
let isStaleRenderOutput = false;
if (sourceNode && sourceNode.type === "render") {
@@ -97,11 +103,36 @@ export default function CompareNode({ id, data, selected, width }: NodeProps) {
}
}
if (finalUrl) {
return { finalUrl, label, previewInput, isStaleRenderOutput };
if (sourceNode && sourceNode.type === "mixer") {
const mixerPreview = resolveMixerPreviewFromGraph({
nodeId: sourceNode.id,
graph,
});
if (mixerPreview.status === "ready") {
mixerPreviewState = mixerPreview;
}
}
return { label, previewInput, isStaleRenderOutput };
const visibleFinalUrl =
sourceNode?.type === "mixer" && mixerPreviewState ? undefined : finalUrl;
if (visibleFinalUrl) {
return {
finalUrl: visibleFinalUrl,
label,
previewInput,
mixerPreviewState,
isStaleRenderOutput,
};
}
return {
label,
previewInput,
mixerPreviewState,
isStaleRenderOutput,
};
};
return {
@@ -117,8 +148,16 @@ export default function CompareNode({ id, data, selected, width }: NodeProps) {
graph,
]);
const hasLeft = Boolean(resolvedSides.left.finalUrl || resolvedSides.left.previewInput);
const hasRight = Boolean(resolvedSides.right.finalUrl || resolvedSides.right.previewInput);
const hasLeft = Boolean(
resolvedSides.left.finalUrl ||
resolvedSides.left.previewInput ||
resolvedSides.left.mixerPreviewState,
);
const hasRight = Boolean(
resolvedSides.right.finalUrl ||
resolvedSides.right.previewInput ||
resolvedSides.right.mixerPreviewState,
);
const hasConnectedRenderInput = useMemo(
() =>
incomingEdges.some((edge) => {
@@ -273,6 +312,7 @@ export default function CompareNode({ id, data, selected, width }: NodeProps) {
finalUrl={resolvedSides.right.finalUrl}
label={resolvedSides.right.label}
previewInput={resolvedSides.right.previewInput}
mixerPreviewState={resolvedSides.right.mixerPreviewState}
nodeWidth={previewNodeWidth}
preferPreview={effectiveDisplayMode === "preview"}
/>
@@ -283,6 +323,7 @@ export default function CompareNode({ id, data, selected, width }: NodeProps) {
finalUrl={resolvedSides.left.finalUrl}
label={resolvedSides.left.label}
previewInput={resolvedSides.left.previewInput}
mixerPreviewState={resolvedSides.left.mixerPreviewState}
nodeWidth={previewNodeWidth}
clipWidthPercent={sliderX}
preferPreview={effectiveDisplayMode === "preview"}