Spaces:
Building
on
A10G
Building
on
A10G
import { $el } from "../ui.js"; | |
export function calculateImageGrid(imgs, dw, dh) { | |
let best = 0; | |
let w = imgs[0].naturalWidth; | |
let h = imgs[0].naturalHeight; | |
const numImages = imgs.length; | |
let cellWidth, cellHeight, cols, rows, shiftX; | |
// compact style | |
for (let c = 1; c <= numImages; c++) { | |
const r = Math.ceil(numImages / c); | |
const cW = dw / c; | |
const cH = dh / r; | |
const scaleX = cW / w; | |
const scaleY = cH / h; | |
const scale = Math.min(scaleX, scaleY, 1); | |
const imageW = w * scale; | |
const imageH = h * scale; | |
const area = imageW * imageH * numImages; | |
if (area > best) { | |
best = area; | |
cellWidth = imageW; | |
cellHeight = imageH; | |
cols = c; | |
rows = r; | |
shiftX = c * ((cW - imageW) / 2); | |
} | |
} | |
return { cellWidth, cellHeight, cols, rows, shiftX }; | |
} | |
export function createImageHost(node) { | |
const el = $el("div.comfy-img-preview"); | |
let currentImgs; | |
let first = true; | |
function updateSize() { | |
let w = null; | |
let h = null; | |
if (currentImgs) { | |
let elH = el.clientHeight; | |
if (first) { | |
first = false; | |
// On first run, if we are small then grow a bit | |
if (elH < 190) { | |
elH = 190; | |
} | |
el.style.setProperty("--comfy-widget-min-height", elH); | |
} else { | |
el.style.setProperty("--comfy-widget-min-height", null); | |
} | |
const nw = node.size[0]; | |
({ cellWidth: w, cellHeight: h } = calculateImageGrid(currentImgs, nw - 20, elH)); | |
w += "px"; | |
h += "px"; | |
el.style.setProperty("--comfy-img-preview-width", w); | |
el.style.setProperty("--comfy-img-preview-height", h); | |
} | |
} | |
return { | |
el, | |
updateImages(imgs) { | |
if (imgs !== currentImgs) { | |
if (currentImgs == null) { | |
requestAnimationFrame(() => { | |
updateSize(); | |
}); | |
} | |
el.replaceChildren(...imgs); | |
currentImgs = imgs; | |
node.onResize(node.size); | |
node.graph.setDirtyCanvas(true, true); | |
} | |
}, | |
getHeight() { | |
updateSize(); | |
}, | |
onDraw() { | |
// Element from point uses a hittest find elements so we need to toggle pointer events | |
el.style.pointerEvents = "all"; | |
const over = document.elementFromPoint(app.canvas.mouse[0], app.canvas.mouse[1]); | |
el.style.pointerEvents = "none"; | |
if(!over) return; | |
// Set the overIndex so Open Image etc work | |
const idx = currentImgs.indexOf(over); | |
node.overIndex = idx; | |
}, | |
}; | |
} | |