Spaces:
Running
on
Zero
Running
on
Zero
| 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; | |
| }, | |
| }; | |
| } | |