You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
2.3 KiB
98 lines
2.3 KiB
1 year ago
|
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;
|
||
|
},
|
||
|
};
|
||
|
}
|