extensions / openOutpaint-webUI-extension /javascript /openoutpaint-imagehistory.js
방재호
init
b5ba7a5
async function openoutpaint_get_image_from_history() {
return new Promise(function (resolve, reject) {
var buttons = gradioApp().querySelectorAll(
'#tab_images_history [style="display: block;"].tabitem div[id$=_gallery] .gallery-item'
);
var button = gradioApp().querySelector(
'#tab_images_history [style="display: block;"].tabitem div[id$=_gallery] .gallery-item.\\!ring-2'
);
if (!button) button = buttons[0];
if (!button)
reject(new Error("[openoutpaint] No image available in the gallery"));
const canvas = document.createElement("canvas");
const image = document.createElement("img");
image.onload = () => {
canvas.width = image.width;
canvas.height = image.height;
canvas.getContext("2d").drawImage(image, 0, 0);
resolve(canvas.toDataURL());
};
image.src = button.querySelector("img").src;
});
}
function openoutpaint_send_history_gallery(
name = "Image Browser Resource",
tab
) {
openoutpaint_get_image_from_history()
.then((dataURL) => {
// Send to openOutpaint
openoutpaint.frame.contentWindow.postMessage({
key: openoutpaint.key,
type: "openoutpaint/add-resource",
image: {
dataURL,
resourceName: name,
},
});
// Send prompt to openOutpaint
const tab = get_uiCurrentTabContent().id;
const prompt =
tab === "tab_txt2img"
? gradioApp().querySelector("#txt2img_prompt textarea").value
: gradioApp().querySelector("#img2img_prompt textarea").value;
const negPrompt =
tab === "tab_txt2img"
? gradioApp().querySelector("#txt2img_neg_prompt textarea").value
: gradioApp().querySelector("#img2img_neg_prompt textarea").value;
openoutpaint.frame.contentWindow.postMessage({
key: openoutpaint.key,
type: "openoutpaint/set-prompt",
prompt,
negPrompt,
});
// Change Tab
Array.from(
gradioApp().querySelectorAll("#tabs > div:first-child button")
).forEach((button) => {
if (button.textContent.trim() === "openOutpaint") {
button.click();
}
});
})
.catch((error) => {
console.warn("[openoutpaint] No image selected to send to openOutpaint");
});
}
document.addEventListener("DOMContentLoaded", () => {
let tries = 3;
const onload = () => {
const element = gradioApp().getElementById("tab_images_history");
const tabsEl = gradioApp().getElementById("images_history_tab");
if (element) {
console.debug(`[oo-ext] Detected image history extension`);
// Gets tab buttons
const tabs = Array.from(tabsEl.firstChild.querySelectorAll("button")).map(
(button) => button.textContent.trim()
);
tabs.forEach((tab) => {
const buttonPanel = gradioApp().getElementById(
`${tab}_images_history_button_panel`
);
if (!buttonPanel) return;
const button = document.createElement("button");
button.textContent = "Send to openOutpaint";
button.classList.add(
"gr-button",
"gr-button-lg",
"gr-button-secondary"
);
button.addEventListener("click", () => {
openoutpaint_send_history_gallery(`Image Browser (${tab}) Resource`);
});
buttonPanel.appendChild(button);
});
} else if (tries-- > 0) {
// Tries n times every 1 second before giving up
setTimeout(onload, 1000);
}
};
onload();
});