|
let image_browser_state = "free" |
|
let image_browser_webui_ready = false |
|
let image_browser_started = false |
|
let image_browser_console_log = "" |
|
let image_browser_debug = false |
|
let image_browser_img_show_in_progress = false |
|
|
|
function image_browser_delay(ms){return new Promise(resolve => setTimeout(resolve, ms))} |
|
|
|
onUiLoaded(image_browser_start_it_up) |
|
|
|
async function image_browser_wait_for_webui() { |
|
if (image_browser_debug) console.log("image_browser_wait_for_webui:start") |
|
await image_browser_delay(500) |
|
sd_model = gradioApp().getElementById("setting_sd_model_checkpoint") |
|
if (!sd_model.querySelector(".eta-bar")) { |
|
image_browser_webui_ready = true |
|
image_browser_start() |
|
} else { |
|
|
|
const startTime = Date.now() |
|
|
|
const timeout = 40000 |
|
const webuiObserver = new MutationObserver(function(mutationsList) { |
|
if (image_browser_debug) console.log("webuiObserver:start") |
|
let found = false |
|
outerLoop: for (let i = 0; i < mutationsList.length; i++) { |
|
let mutation = mutationsList[i]; |
|
if (mutation.type === "childList") { |
|
for (let j = 0; j < mutation.removedNodes.length; j++) { |
|
let node = mutation.removedNodes[j]; |
|
if (node.nodeType === Node.ELEMENT_NODE && node.classList.contains("eta-bar")) { |
|
found = true |
|
break outerLoop; |
|
} |
|
} |
|
} |
|
} |
|
if (found || (Date.now() - startTime > timeout)) { |
|
image_browser_webui_ready = true |
|
webuiObserver.disconnect() |
|
if (image_browser_debug) console.log("webuiObserver:end") |
|
image_browser_start() |
|
} |
|
}) |
|
webuiObserver.observe(gradioApp(), { childList:true, subtree:true }) |
|
} |
|
if (image_browser_debug) console.log("image_browser_wait_for_webui:end") |
|
} |
|
|
|
async function image_browser_start_it_up() { |
|
if (image_browser_debug) console.log("image_browser_start_it_up:start") |
|
container = gradioApp().getElementById("image_browser_tabs_container") |
|
let controls = container.querySelectorAll('[id*="_control_"]') |
|
controls.forEach(function(control) { |
|
control.style.pointerEvents = "none" |
|
control.style.cursor = "not-allowed" |
|
control.style.opacity = "0.65" |
|
}) |
|
let warnings = container.querySelectorAll('[id*="_warning_box"]') |
|
warnings.forEach(function(warning) { |
|
warning.innerHTML = '<p style="font-weight: bold;">Waiting for webui...' |
|
}) |
|
|
|
image_browser_wait_for_webui() |
|
if (image_browser_debug) console.log("image_browser_start_it_up:end") |
|
} |
|
|
|
async function image_browser_lock(reason) { |
|
if (image_browser_debug) console.log("image_browser_lock:start") |
|
|
|
let i = 0 |
|
while (image_browser_state != "free") { |
|
await image_browser_delay(200) |
|
i = i + 1 |
|
if (i === 150) { |
|
throw new Error("Still locked after 30 seconds. Please Reload UI.") |
|
} |
|
} |
|
|
|
image_browser_state = reason |
|
if (image_browser_debug) console.log("image_browser_lock:end") |
|
} |
|
|
|
async function image_browser_unlock() { |
|
if (image_browser_debug) console.log("image_browser_unlock:start") |
|
image_browser_state = "free" |
|
if (image_browser_debug) console.log("image_browser_unlock:end") |
|
} |
|
|
|
const image_browser_click_image = async function() { |
|
if (image_browser_debug) console.log("image_browser_click_image:start") |
|
await image_browser_lock("image_browser_click_image") |
|
const tab_base_tag = image_browser_current_tab() |
|
const container = gradioApp().getElementById(tab_base_tag + "_image_browser_container") |
|
let child = this |
|
let index = 0 |
|
while((child = child.previousSibling) != null) { |
|
index = index + 1 |
|
} |
|
const set_btn = container.querySelector(".image_browser_set_index") |
|
let curr_idx |
|
try { |
|
curr_idx = set_btn.getAttribute("img_index") |
|
} catch (e) { |
|
curr_idx = -1 |
|
} |
|
if (curr_idx != index) { |
|
set_btn.setAttribute("img_index", index) |
|
} |
|
await image_browser_unlock() |
|
set_btn.click() |
|
if (image_browser_debug) console.log("image_browser_click_image:end") |
|
} |
|
|
|
async function image_browser_get_current_img(tab_base_tag, img_index, page_index, filenames, turn_page_switch, image_gallery) { |
|
if (image_browser_debug) console.log("image_browser_get_current_img:start") |
|
await image_browser_lock("image_browser_get_current_img") |
|
img_index = gradioApp().getElementById(tab_base_tag + '_image_browser_set_index').getAttribute("img_index") |
|
gradioApp().dispatchEvent(new Event("image_browser_get_current_img")) |
|
await image_browser_unlock() |
|
if (image_browser_debug) console.log("image_browser_get_current_img:end") |
|
return [ |
|
tab_base_tag, |
|
img_index, |
|
page_index, |
|
filenames, |
|
turn_page_switch, |
|
image_gallery |
|
] |
|
} |
|
|
|
async function image_browser_refresh_current_page_preview() { |
|
if (image_browser_debug) console.log("image_browser_refresh_current_page_preview:start") |
|
await image_browser_delay(200) |
|
const preview_div = gradioApp().querySelector('.preview') |
|
if (preview_div === null) { |
|
if (image_browser_debug) console.log("image_browser_refresh_current_page_preview:end") |
|
return |
|
} |
|
const tab_base_tag = image_browser_current_tab() |
|
const gallery = gradioApp().querySelector(`#${tab_base_tag}_image_browser`) |
|
const set_btn = gallery.querySelector(".image_browser_set_index") |
|
const curr_idx = parseInt(set_btn.getAttribute("img_index")) |
|
|
|
const gallery_items = gallery.querySelectorAll(".thumbnail-item") |
|
const curr_image = gallery_items[curr_idx] |
|
curr_image.click() |
|
if (image_browser_debug) console.log("image_browser_refresh_current_page_preview:end") |
|
} |
|
|
|
async function image_browser_turnpage(tab_base_tag) { |
|
if (image_browser_debug) console.log("image_browser_turnpage:start") |
|
while (!image_browser_started) { |
|
await image_browser_delay(200) |
|
} |
|
const gallery = gradioApp().querySelector(`#${tab_base_tag}_image_browser`) |
|
let clear |
|
try { |
|
clear = gallery.querySelector("button[aria-label='Clear']") |
|
if (clear) { |
|
clear.click() |
|
} |
|
} catch (e) { |
|
console.error(e) |
|
} |
|
if (image_browser_debug) console.log("image_browser_turnpage:end") |
|
} |
|
|
|
const image_browser_get_current_img_handler = (del_img_btn) => { |
|
if (image_browser_debug) console.log("image_browser_get_current_img_handler:start") |
|
|
|
del_img_btn.style.pointerEvents = "auto" |
|
del_img_btn.style.cursor = "default" |
|
del_img_btn.style.opacity = "1" |
|
if (image_browser_debug) console.log("image_browser_get_current_img_handler:end") |
|
} |
|
|
|
async function image_browser_select_image(tab_base_tag, img_index, select_image) { |
|
if (image_browser_debug) console.log("image_browser_select_image:start") |
|
if (select_image) { |
|
await image_browser_lock("image_browser_select_image") |
|
const del_img_btn = gradioApp().getElementById(tab_base_tag + "_image_browser_del_img_btn") |
|
|
|
del_img_btn.style.pointerEvents = "none" |
|
del_img_btn.style.cursor = "not-allowed" |
|
del_img_btn.style.opacity = "0.65" |
|
|
|
const gallery = gradioApp().getElementById(tab_base_tag + "_image_browser_gallery") |
|
const gallery_items = gallery.querySelectorAll(".thumbnail-item") |
|
if (img_index >= gallery_items.length || gallery_items.length == 0) { |
|
const refreshBtn = gradioApp().getElementById(tab_base_tag + "_image_browser_renew_page") |
|
refreshBtn.dispatchEvent(new Event("click")) |
|
} else { |
|
const curr_image = gallery_items[img_index] |
|
curr_image.click() |
|
} |
|
await image_browser_unlock() |
|
|
|
|
|
gradioApp().removeEventListener("image_browser_get_current_img", () => image_browser_get_current_img_handler(del_img_btn)) |
|
gradioApp().addEventListener("image_browser_get_current_img", () => image_browser_get_current_img_handler(del_img_btn)) |
|
} |
|
if (image_browser_debug) console.log("image_browser_select_image:end") |
|
} |
|
|
|
async function image_browser_gototab(tabname) { |
|
if (image_browser_debug) console.log("image_browser_gototab:start") |
|
await image_browser_lock("image_browser_gototab") |
|
|
|
tabNav = gradioApp().querySelector(".tab-nav") |
|
const tabNavChildren = tabNav.children |
|
let tabNavButtonNum |
|
if (typeof tabname === "number") { |
|
let buttonCnt = 0 |
|
for (let i = 0; i < tabNavChildren.length; i++) { |
|
if (tabNavChildren[i].tagName === "BUTTON") { |
|
if (buttonCnt === tabname) { |
|
tabNavButtonNum = i |
|
break |
|
} |
|
buttonCnt++ |
|
} |
|
} |
|
} else { |
|
for (let i = 0; i < tabNavChildren.length; i++) { |
|
if (tabNavChildren[i].tagName === "BUTTON" && tabNavChildren[i].textContent.trim() === tabname) { |
|
tabNavButtonNum = i |
|
break |
|
} |
|
} |
|
} |
|
let tabNavButton = tabNavChildren[tabNavButtonNum] |
|
tabNavButton.click() |
|
|
|
|
|
const startTime = Date.now() |
|
|
|
const timeout = 60000 |
|
|
|
await image_browser_delay(100) |
|
while (!tabNavButton.classList.contains("selected")) { |
|
tabNavButton = tabNavChildren[tabNavButtonNum] |
|
if (Date.now() - startTime > timeout) { |
|
throw new Error("image_browser_gototab: 60 seconds have passed") |
|
} |
|
await image_browser_delay(200) |
|
} |
|
|
|
await image_browser_unlock() |
|
if (image_browser_debug) console.log("image_browser_gototab:end") |
|
} |
|
|
|
async function image_browser_get_image_for_ext(tab_base_tag, image_index) { |
|
if (image_browser_debug) console.log("image_browser_get_image_for_ext:start") |
|
const image_browser_image = gradioApp().querySelectorAll(`#${tab_base_tag}_image_browser_gallery .thumbnail-item`)[image_index] |
|
|
|
const canvas = document.createElement("canvas") |
|
const image = document.createElement("img") |
|
image.src = image_browser_image.querySelector("img").src |
|
|
|
await image.decode() |
|
|
|
canvas.width = image.width |
|
canvas.height = image.height |
|
|
|
canvas.getContext("2d").drawImage(image, 0, 0) |
|
|
|
if (image_browser_debug) console.log("image_browser_get_image_for_ext:end") |
|
return canvas.toDataURL() |
|
} |
|
|
|
function image_browser_openoutpaint_send(tab_base_tag, image_index, image_browser_prompt, image_browser_neg_prompt, name = "WebUI Resource") { |
|
if (image_browser_debug) console.log("image_browser_openoutpaint_send:start") |
|
image_browser_get_image_for_ext(tab_base_tag, image_index) |
|
.then((dataURL) => { |
|
|
|
openoutpaint_send_image(dataURL, name) |
|
|
|
|
|
const tab = get_uiCurrentTabContent().id |
|
|
|
const prompt = image_browser_prompt |
|
const negPrompt = image_browser_neg_prompt |
|
openoutpaint.frame.contentWindow.postMessage({ |
|
key: openoutpaint.key, |
|
type: "openoutpaint/set-prompt", |
|
prompt, |
|
negPrompt, |
|
}) |
|
|
|
|
|
image_browser_gototab("openOutpaint") |
|
}) |
|
if (image_browser_debug) console.log("image_browser_openoutpaint_send:end") |
|
} |
|
|
|
async function image_browser_controlnet_send(toTabNum, tab_base_tag, image_index, controlnetNum, controlnetType) { |
|
if (image_browser_debug) console.log("image_browser_controlnet_send:start") |
|
|
|
const dataURL = await image_browser_get_image_for_ext(tab_base_tag, image_index) |
|
const blob = await (await fetch(dataURL)).blob() |
|
const dt = new DataTransfer() |
|
dt.items.add(new File([blob], "ImageBrowser.png", { type: blob.type })) |
|
const list = dt.files |
|
|
|
await image_browser_gototab(toTabNum) |
|
const current_tabid = image_browser_webui_current_tab() |
|
const current_tab = current_tabid.replace("tab_", "") |
|
const tab_controlnet = gradioApp().getElementById(current_tab + "_controlnet") |
|
let accordion = tab_controlnet.querySelector("#controlnet > .label-wrap > .icon") |
|
if (accordion.style.transform.includes("rotate(90deg)")) { |
|
accordion.click() |
|
|
|
const startTime = Date.now() |
|
|
|
const timeout = 60000 |
|
|
|
await image_browser_delay(100) |
|
while (accordion.style.transform.includes("rotate(90deg)")) { |
|
accordion = tab_controlnet.querySelector("#controlnet > .label-wrap > .icon") |
|
if (Date.now() - startTime > timeout) { |
|
throw new Error("image_browser_controlnet_send/accordion: 60 seconds have passed") |
|
} |
|
await image_browser_delay(200) |
|
} |
|
} |
|
|
|
let inputImage |
|
let inputContainer |
|
if (controlnetType == "single") { |
|
inputImage = gradioApp().getElementById(current_tab + "_controlnet_ControlNet_input_image") |
|
} else { |
|
const tabs = gradioApp().getElementById(current_tab + "_controlnet_tabs") |
|
const tab_num = (parseInt(controlnetNum) + 1).toString() |
|
tab_button = tabs.querySelector(".tab-nav > button:nth-child(" + tab_num + ")") |
|
tab_button.click() |
|
|
|
const startTime = Date.now() |
|
|
|
const timeout = 60000 |
|
|
|
await image_browser_delay(100) |
|
while (!tab_button.classList.contains("selected")) { |
|
tab_button = tabs.querySelector(".tab-nav > button:nth-child(" + tab_num + ")") |
|
if (Date.now() - startTime > timeout) { |
|
throw new Error("image_browser_controlnet_send/tabs: 60 seconds have passed") |
|
} |
|
await image_browser_delay(200) |
|
} |
|
inputImage = gradioApp().getElementById(current_tab + "_controlnet_ControlNet-" + controlnetNum.toString() + "_input_image") |
|
} |
|
try { |
|
inputContainer = inputImage.querySelector('div[data-testid="image"]') |
|
} catch (e) {} |
|
|
|
const input = inputContainer.querySelector("input[type='file']") |
|
|
|
let clear |
|
try { |
|
clear = inputContainer.querySelector("button[aria-label='Clear']") |
|
if (clear) { |
|
clear.click() |
|
} |
|
} catch (e) { |
|
console.error(e) |
|
} |
|
|
|
try { |
|
|
|
const startTime = Date.now() |
|
|
|
const timeout = 60000 |
|
while (clear) { |
|
clear = inputContainer.querySelector("button[aria-label='Clear']") |
|
if (Date.now() - startTime > timeout) { |
|
throw new Error("image_browser_controlnet_send/clear: 60 seconds have passed") |
|
} |
|
await image_browser_delay(200) |
|
} |
|
} catch (e) { |
|
console.error(e) |
|
} |
|
|
|
input.value = "" |
|
input.files = list |
|
const event = new Event("change", { "bubbles": true, "composed": true }) |
|
input.dispatchEvent(event) |
|
if (image_browser_debug) console.log("image_browser_controlnet_send:end") |
|
} |
|
|
|
function image_browser_controlnet_send_txt2img(tab_base_tag, image_index, controlnetNum, controlnetType) { |
|
image_browser_controlnet_send(0, tab_base_tag, image_index, controlnetNum, controlnetType) |
|
} |
|
|
|
function image_browser_controlnet_send_img2img(tab_base_tag, image_index, controlnetNum, controlnetType) { |
|
image_browser_controlnet_send(1, tab_base_tag, image_index, controlnetNum, controlnetType) |
|
} |
|
|
|
function image_browser_class_add(tab_base_tag) { |
|
gradioApp().getElementById(tab_base_tag + '_image_browser').classList.add("image_browser_container") |
|
gradioApp().getElementById(tab_base_tag + '_image_browser_set_index').classList.add("image_browser_set_index") |
|
gradioApp().getElementById(tab_base_tag + '_image_browser_del_img_btn').classList.add("image_browser_del_img_btn") |
|
gradioApp().getElementById(tab_base_tag + '_image_browser_gallery').classList.add("image_browser_gallery") |
|
} |
|
|
|
function btnClickHandler(tab_base_tag, btn) { |
|
if (image_browser_debug) console.log("btnClickHandler:start") |
|
const tabs_box = gradioApp().getElementById("image_browser_tabs_container") |
|
if (!tabs_box.classList.contains(tab_base_tag)) { |
|
gradioApp().getElementById(tab_base_tag + "_image_browser_renew_page").click() |
|
tabs_box.classList.add(tab_base_tag) |
|
} |
|
if (image_browser_debug) console.log("btnClickHandler:end") |
|
} |
|
|
|
function image_browser_init() { |
|
if (image_browser_debug) console.log("image_browser_init:start") |
|
const tab_base_tags = gradioApp().getElementById("image_browser_tab_base_tags_list") |
|
if (tab_base_tags) { |
|
const image_browser_tab_base_tags_list = tab_base_tags.querySelector("textarea").value.split(",") |
|
image_browser_tab_base_tags_list.forEach(function(tab_base_tag) { |
|
image_browser_class_add(tab_base_tag) |
|
}) |
|
|
|
const tab_btns = gradioApp().getElementById("image_browser_tabs_container").querySelector("div").querySelectorAll("button") |
|
tab_btns.forEach(function(btn, i) { |
|
const tab_base_tag = image_browser_tab_base_tags_list[i] |
|
btn.setAttribute("tab_base_tag", tab_base_tag) |
|
btn.removeEventListener('click', () => btnClickHandler(tab_base_tag, btn)) |
|
btn.addEventListener('click', () => btnClickHandler(tab_base_tag, btn)) |
|
}) |
|
|
|
if (gradioApp().getElementById("image_browser_preload").querySelector("input").checked) { |
|
setTimeout(function(){tab_btns[0].click()}, 100) |
|
} |
|
} |
|
image_browser_keydown() |
|
|
|
const image_browser_swipe = gradioApp().getElementById("image_browser_swipe").getElementsByTagName("input")[0] |
|
if (image_browser_swipe.checked) { |
|
image_browser_touch() |
|
} |
|
if (image_browser_debug) console.log("image_browser_init:end") |
|
} |
|
|
|
async function image_browser_wait_for_gallery_btn(tab_base_tag){ |
|
if (image_browser_debug) console.log("image_browser_wait_for_gallery_btn:start") |
|
await image_browser_delay(100) |
|
while (!gradioApp().getElementById(image_browser_current_tab() + "_image_browser_gallery").getElementsByClassName("thumbnail-item")) { |
|
await image_browser_delay(200) |
|
} |
|
if (image_browser_debug) console.log("image_browser_wait_for_gallery_btn:end") |
|
} |
|
|
|
function image_browser_hijack_console_log() { |
|
(function () { |
|
const oldLog = console.log |
|
console.log = function (message) { |
|
const formattedTime = new Date().toISOString().slice(0, -5).replace(/[TZ]/g, ' ').trim().replace(/\s+/g, '-').replace(/:/g, '-') |
|
image_browser_console_log = image_browser_console_log + formattedTime + " " + "image_browser.js: " + message + "\n" |
|
oldLog.apply(console, arguments) |
|
} |
|
})() |
|
image_browser_debug = true |
|
} |
|
|
|
function get_js_logs() { |
|
log_to_py = image_browser_console_log |
|
image_browser_console_log = "" |
|
return log_to_py |
|
} |
|
|
|
function isNumeric(str) { |
|
if (typeof str != "string") return false |
|
return !isNaN(str) && !isNaN(parseFloat(str)) |
|
} |
|
|
|
function image_browser_start() { |
|
if (image_browser_debug) console.log("image_browser_start:start") |
|
image_browser_init() |
|
const mutationObserver = new MutationObserver(function(mutationsList) { |
|
const tab_base_tags = gradioApp().getElementById("image_browser_tab_base_tags_list") |
|
if (tab_base_tags) { |
|
const image_browser_tab_base_tags_list = tab_base_tags.querySelector("textarea").value.split(",") |
|
image_browser_tab_base_tags_list.forEach(function(tab_base_tag) { |
|
image_browser_class_add(tab_base_tag) |
|
const tab_gallery_items = gradioApp().querySelectorAll('#' + tab_base_tag + '_image_browser .thumbnail-item') |
|
|
|
const image_browser_img_info_json = gradioApp().getElementById(tab_base_tag + "_image_browser_img_info").querySelector('[data-testid="textbox"]').value |
|
const image_browser_img_info = JSON.parse(image_browser_img_info_json) |
|
const filenames = Object.keys(image_browser_img_info) |
|
|
|
tab_gallery_items.forEach(function(gallery_item, i) { |
|
gallery_item.removeEventListener('click', image_browser_click_image, true) |
|
gallery_item.addEventListener('click', image_browser_click_image, true) |
|
|
|
const filename = filenames[i] |
|
try { |
|
let x = image_browser_img_info[filename].x |
|
let y = image_browser_img_info[filename].y |
|
if (isNumeric(x) && isNumeric(y)) { |
|
gallery_item.title = x + "x" + y |
|
} |
|
} catch (e) {} |
|
|
|
document.onkeyup = async function(e) { |
|
if (!image_browser_active()) { |
|
if (image_browser_debug) console.log("image_browser_start:end") |
|
return |
|
} |
|
const current_tab = image_browser_current_tab() |
|
image_browser_wait_for_gallery_btn(current_tab).then(() => { |
|
let gallery_btn |
|
gallery_btn = gradioApp().getElementById(current_tab + "_image_browser_gallery").querySelector(".thumbnail-item .selected") |
|
gallery_btn = gallery_btn && gallery_btn.length > 0 ? gallery_btn[0] : null |
|
if (gallery_btn) { |
|
image_browser_click_image.call(gallery_btn) |
|
} |
|
}) |
|
} |
|
}) |
|
|
|
const cls_btn = gradioApp().getElementById(tab_base_tag + '_image_browser_gallery').querySelector("svg") |
|
if (cls_btn) { |
|
cls_btn.removeEventListener('click', () => image_browser_renew_page(tab_base_tag), false) |
|
cls_btn.addEventListener('click', () => image_browser_renew_page(tab_base_tag), false) |
|
} |
|
}) |
|
const debug_level_option = gradioApp().getElementById("image_browser_debug_level_option").querySelector("textarea").value |
|
if ((debug_level_option == 'javascript' || debug_level_option == 'capture') && !image_browser_debug) { |
|
image_browser_hijack_console_log() |
|
} |
|
} |
|
}) |
|
mutationObserver.observe(gradioApp(), { childList:true, subtree:true }) |
|
image_browser_started = true |
|
image_browser_activate_controls() |
|
if (image_browser_debug) console.log("image_browser_start:end") |
|
} |
|
|
|
async function image_browser_activate_controls() { |
|
if (image_browser_debug) console.log("image_browser_activate_controls:start") |
|
await image_browser_delay(500) |
|
container = gradioApp().getElementById("image_browser_tabs_container") |
|
let controls = container.querySelectorAll('[id*="_control_"]') |
|
controls.forEach(function(control) { |
|
control.style.pointerEvents = "auto" |
|
control.style.cursor = "default" |
|
control.style.opacity = "1" |
|
}) |
|
let warnings = container.querySelectorAll('[id*="_warning_box"]') |
|
warnings.forEach(function(warning) { |
|
warning.innerHTML = "<p> " |
|
}) |
|
if (image_browser_debug) console.log("image_browser_activate_controls:end") |
|
} |
|
|
|
function image_browser_img_show_progress_update() { |
|
image_browser_img_show_in_progress = false |
|
} |
|
|
|
function image_browser_renew_page(tab_base_tag) { |
|
if (image_browser_debug) console.log("image_browser_renew_page:start") |
|
gradioApp().getElementById(tab_base_tag + '_image_browser_renew_page').click() |
|
if (image_browser_debug) console.log("image_browser_renew_page:end") |
|
} |
|
|
|
function image_browser_current_tab() { |
|
if (image_browser_debug) console.log("image_browser_current_tab:start") |
|
const tabs = gradioApp().getElementById("image_browser_tabs_container").querySelectorAll('[id$="_image_browser_container"]') |
|
const tab_base_tags = gradioApp().getElementById("image_browser_tab_base_tags_list") |
|
const image_browser_tab_base_tags_list = tab_base_tags.querySelector("textarea").value.split(",").sort((a, b) => b.length - a.length) |
|
for (const element of tabs) { |
|
if (element.style.display === "block") { |
|
const id = element.id |
|
const tab_base_tag = image_browser_tab_base_tags_list.find(element => id.startsWith(element)) || null |
|
if (image_browser_debug) console.log("image_browser_current_tab:end") |
|
return tab_base_tag |
|
} |
|
} |
|
if (image_browser_debug) console.log("image_browser_current_tab:end") |
|
} |
|
|
|
function image_browser_webui_current_tab() { |
|
if (image_browser_debug) console.log("image_browser_webui_current_tab:start") |
|
const tabs = gradioApp().getElementById("tabs").querySelectorAll('[id^="tab_"]') |
|
let id |
|
for (const element of tabs) { |
|
if (element.style.display === "block") { |
|
id = element.id |
|
break |
|
} |
|
} |
|
if (image_browser_debug) console.log("image_browser_webui_current_tab:end") |
|
return id |
|
} |
|
|
|
function image_browser_active() { |
|
if (image_browser_debug) console.log("image_browser_active:start") |
|
const ext_active = gradioApp().getElementById("tab_image_browser") |
|
if (image_browser_debug) console.log("image_browser_active:end") |
|
return ext_active && ext_active.style.display !== "none" |
|
} |
|
|
|
async function image_browser_delete_key(tab_base_tag) { |
|
|
|
const startTime = Date.now() |
|
|
|
const timeout = 60000 |
|
|
|
await image_browser_delay(100) |
|
while (image_browser_img_show_in_progress) { |
|
if (Date.now() - startTime > timeout) { |
|
throw new Error("image_browser_delete_key: 60 seconds have passed") |
|
} |
|
await image_browser_delay(200) |
|
} |
|
|
|
const deleteBtn = gradioApp().getElementById(tab_base_tag + "_image_browser_del_img_btn") |
|
deleteBtn.dispatchEvent(new Event("click")) |
|
} |
|
|
|
function image_browser_keydown() { |
|
if (image_browser_debug) console.log("image_browser_keydown:start") |
|
gradioApp().addEventListener("keydown", function(event) { |
|
|
|
if (!image_browser_active()) { |
|
if (image_browser_debug) console.log("image_browser_keydown:end") |
|
return |
|
} |
|
|
|
|
|
let target |
|
if (!event.composed) { |
|
target = event.target |
|
} else { |
|
target = event.composedPath()[0] |
|
} |
|
if (!target || target.nodeName === "INPUT" || target.nodeName === "TEXTAREA") { |
|
if (image_browser_debug) console.log("image_browser_keydown:end") |
|
return |
|
} |
|
|
|
const tab_base_tag = image_browser_current_tab() |
|
|
|
|
|
if (event.code >= "Digit0" && event.code <= "Digit5") { |
|
const selectedValue = event.code.charAt(event.code.length - 1) |
|
const radioInputs = gradioApp().getElementById(tab_base_tag + "_control_image_browser_ranking").getElementsByTagName("input") |
|
for (const input of radioInputs) { |
|
if (input.value === selectedValue || (selectedValue === '0' && input === radioInputs[radioInputs.length - 1])) { |
|
input.checked = true |
|
input.dispatchEvent(new Event("change")) |
|
break |
|
} |
|
} |
|
} |
|
|
|
const mod_keys = gradioApp().querySelector(`#${tab_base_tag}_image_browser_mod_keys textarea`).value |
|
let modifiers_pressed = false |
|
if (mod_keys.indexOf("C") !== -1 && mod_keys.indexOf("S") !== -1) { |
|
if (event.ctrlKey && event.shiftKey) { |
|
modifiers_pressed = true |
|
} |
|
} else if (mod_keys.indexOf("S") !== -1) { |
|
if (!event.ctrlKey && event.shiftKey) { |
|
modifiers_pressed = true |
|
} |
|
} else { |
|
if (event.ctrlKey && !event.shiftKey) { |
|
modifiers_pressed = true |
|
} |
|
} |
|
|
|
let modifiers_none = false |
|
if (!event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { |
|
modifiers_none = true |
|
} |
|
|
|
if (event.code == "KeyF" && modifiers_none) { |
|
if (tab_base_tag == "image_browser_tab_favorites") { |
|
if (image_browser_debug) console.log("image_browser_keydown:end") |
|
return |
|
} |
|
const favoriteBtn = gradioApp().getElementById(tab_base_tag + "_image_browser_favorites_btn") |
|
favoriteBtn.dispatchEvent(new Event("click")) |
|
} |
|
|
|
if (event.code == "KeyR" && modifiers_none) { |
|
const refreshBtn = gradioApp().getElementById(tab_base_tag + "_image_browser_renew_page") |
|
refreshBtn.dispatchEvent(new Event("click")) |
|
} |
|
|
|
if (event.code == "Delete" && modifiers_none) { |
|
image_browser_delete_key(tab_base_tag) |
|
} |
|
|
|
if (event.code == "ArrowLeft" && modifiers_pressed) { |
|
const prevBtn = gradioApp().getElementById(tab_base_tag + "_control_image_browser_prev_page") |
|
prevBtn.dispatchEvent(new Event("click")) |
|
} |
|
|
|
if (event.code == "ArrowLeft" && modifiers_none) { |
|
image_browser_img_show_in_progress = true |
|
const tab_base_tag = image_browser_current_tab() |
|
const set_btn = gradioApp().querySelector(`#${tab_base_tag}_image_browser .image_browser_set_index`) |
|
const curr_idx = parseInt(set_btn.getAttribute("img_index")) |
|
set_btn.setAttribute("img_index", curr_idx - 1) |
|
image_browser_refresh_current_page_preview() |
|
} |
|
|
|
if (event.code == "ArrowRight" && modifiers_pressed) { |
|
const nextBtn = gradioApp().getElementById(tab_base_tag + "_control_image_browser_next_page") |
|
nextBtn.dispatchEvent(new Event("click")) |
|
} |
|
|
|
if (event.code == "ArrowRight" && modifiers_none) { |
|
image_browser_img_show_in_progress = true |
|
const tab_base_tag = image_browser_current_tab() |
|
const set_btn = gradioApp().querySelector(`#${tab_base_tag}_image_browser .image_browser_set_index`) |
|
const curr_idx = parseInt(set_btn.getAttribute("img_index")) |
|
set_btn.setAttribute("img_index", curr_idx + 1) |
|
image_browser_refresh_current_page_preview() |
|
} |
|
}) |
|
if (image_browser_debug) console.log("image_browser_keydown:end") |
|
} |
|
|
|
function image_browser_touch() { |
|
if (image_browser_debug) console.log("image_browser_touch:start") |
|
let touchStartX = 0 |
|
let touchEndX = 0 |
|
gradioApp().addEventListener("touchstart", function(event) { |
|
if (!image_browser_active()) { |
|
if (image_browser_debug) console.log("image_browser_touch:end") |
|
return |
|
} |
|
touchStartX = event.touches[0].clientX; |
|
}) |
|
gradioApp().addEventListener("touchend", function(event) { |
|
if (!image_browser_active()) { |
|
if (image_browser_debug) console.log("image_browser_touch:end") |
|
return |
|
} |
|
touchEndX = event.changedTouches[0].clientX |
|
const touchDiffX = touchStartX - touchEndX |
|
if (touchDiffX > 50) { |
|
const tab_base_tag = image_browser_current_tab() |
|
const set_btn = gradioApp().querySelector(`#${tab_base_tag}_image_browser .image_browser_set_index`) |
|
const curr_idx = parseInt(set_btn.getAttribute("img_index")) |
|
if (curr_idx >= 1) { |
|
set_btn.setAttribute("img_index", curr_idx - 1) |
|
image_browser_refresh_current_page_preview() |
|
} |
|
} else if (touchDiffX < -50) { |
|
const tab_base_tag = image_browser_current_tab() |
|
const gallery = gradioApp().querySelector(`#${tab_base_tag}_image_browser`) |
|
const gallery_items = gallery.querySelectorAll(".thumbnail-item") |
|
const thumbnails = gallery_items.length / 2 |
|
const set_btn = gradioApp().querySelector(`#${tab_base_tag}_image_browser .image_browser_set_index`) |
|
const curr_idx = parseInt(set_btn.getAttribute("img_index")) |
|
if (curr_idx + 1 < thumbnails) { |
|
set_btn.setAttribute("img_index", curr_idx + 1) |
|
image_browser_refresh_current_page_preview() |
|
} |
|
} |
|
}) |
|
if (image_browser_debug) console.log("image_browser_touch:end") |
|
} |
|
|