46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
// SimpleSyrup - workflow-focused ComfyUI extensions for image generation
|
|
// Copyright (C) 2026 Artificial Sweetener and contributors
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
interface FixedDomWidget {
|
|
computeSize?: (width?: number) => [number, number];
|
|
computeLayoutSize?:
|
|
| ((node: unknown) => {
|
|
minHeight: number;
|
|
maxHeight?: number;
|
|
minWidth: number;
|
|
maxWidth?: number;
|
|
})
|
|
| undefined;
|
|
}
|
|
|
|
interface WidgetLayoutNode {
|
|
arrange?: () => void;
|
|
graph?: {
|
|
setDirtyCanvas?: (foreground: boolean, background: boolean) => void;
|
|
};
|
|
}
|
|
|
|
/** Keep a custom DOM widget content-sized in both Comfy node renderers. */
|
|
export class FixedDomWidgetLayout {
|
|
constructor(
|
|
private readonly node: WidgetLayoutNode,
|
|
widget: FixedDomWidget,
|
|
measure: (width?: number) => [number, number]
|
|
) {
|
|
Object.defineProperty(widget, "computeLayoutSize", {
|
|
configurable: true,
|
|
value: undefined,
|
|
writable: true
|
|
});
|
|
widget.computeSize = measure;
|
|
}
|
|
|
|
/** Recompute legacy widget allocation after the content mode changes. */
|
|
reflow(): void {
|
|
if (!this.node.graph) return;
|
|
this.node.arrange?.();
|
|
this.node.graph.setDirtyCanvas?.(true, true);
|
|
}
|
|
}
|