| |
| function closeModal() { |
| gradioApp().getElementById("lightboxModal").style.display = "none"; |
| } |
|
|
| function showModal(event) { |
| const source = event.target || event.srcElement; |
| const modalImage = gradioApp().getElementById("modalImage") |
| const lb = gradioApp().getElementById("lightboxModal") |
| modalImage.src = source.src |
| if (modalImage.style.display === 'none') { |
| lb.style.setProperty('background-image', 'url(' + source.src + ')'); |
| } |
| lb.style.display = "flex"; |
| lb.focus() |
|
|
| const tabTxt2Img = gradioApp().getElementById("tab_txt2img") |
| const tabImg2Img = gradioApp().getElementById("tab_img2img") |
| |
| if (tabTxt2Img.style.display != "none" || tabImg2Img.style.display != "none") { |
| gradioApp().getElementById("modal_save").style.display = "inline" |
| } else { |
| gradioApp().getElementById("modal_save").style.display = "none" |
| } |
| event.stopPropagation() |
| } |
|
|
| function negmod(n, m) { |
| return ((n % m) + m) % m; |
| } |
|
|
| function updateOnBackgroundChange() { |
| const modalImage = gradioApp().getElementById("modalImage") |
| if (modalImage && modalImage.offsetParent) { |
| let currentButton = selected_gallery_button(); |
|
|
| if (currentButton?.children?.length > 0 && modalImage.src != currentButton.children[0].src) { |
| modalImage.src = currentButton.children[0].src; |
| if (modalImage.style.display === 'none') { |
| modal.style.setProperty('background-image', `url(${modalImage.src})`) |
| } |
| } |
| } |
| } |
|
|
| function modalImageSwitch(offset) { |
| var galleryButtons = all_gallery_buttons(); |
|
|
| if (galleryButtons.length > 1) { |
| var currentButton = selected_gallery_button(); |
|
|
| var result = -1 |
| galleryButtons.forEach(function(v, i) { |
| if (v == currentButton) { |
| result = i |
| } |
| }) |
|
|
| if (result != -1) { |
| var nextButton = galleryButtons[negmod((result + offset), galleryButtons.length)] |
| nextButton.click() |
| const modalImage = gradioApp().getElementById("modalImage"); |
| const modal = gradioApp().getElementById("lightboxModal"); |
| modalImage.src = nextButton.children[0].src; |
| if (modalImage.style.display === 'none') { |
| modal.style.setProperty('background-image', `url(${modalImage.src})`) |
| } |
| setTimeout(function() { |
| modal.focus() |
| }, 10) |
| } |
| } |
| } |
|
|
| function saveImage(){ |
| const tabTxt2Img = gradioApp().getElementById("tab_txt2img") |
| const tabImg2Img = gradioApp().getElementById("tab_img2img") |
| const saveTxt2Img = "save_txt2img" |
| const saveImg2Img = "save_img2img" |
| if (tabTxt2Img.style.display != "none") { |
| gradioApp().getElementById(saveTxt2Img).click() |
| } else if (tabImg2Img.style.display != "none") { |
| gradioApp().getElementById(saveImg2Img).click() |
| } else { |
| console.error("missing implementation for saving modal of this type") |
| } |
| } |
|
|
| function modalSaveImage(event) { |
| saveImage() |
| event.stopPropagation() |
| } |
|
|
| function modalNextImage(event) { |
| modalImageSwitch(1) |
| event.stopPropagation() |
| } |
|
|
| function modalPrevImage(event) { |
| modalImageSwitch(-1) |
| event.stopPropagation() |
| } |
|
|
| function modalKeyHandler(event) { |
| switch (event.key) { |
| case "s": |
| saveImage() |
| break; |
| case "ArrowLeft": |
| modalPrevImage(event) |
| break; |
| case "ArrowRight": |
| modalNextImage(event) |
| break; |
| case "Escape": |
| closeModal(); |
| break; |
| } |
| } |
|
|
| function setupImageForLightbox(e) { |
| if (e.dataset.modded) |
| return; |
|
|
| e.dataset.modded = true; |
| e.style.cursor='pointer' |
| e.style.userSelect='none' |
|
|
| var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 |
|
|
| |
| |
| |
| var event = isFirefox ? 'mousedown' : 'click' |
|
|
| e.addEventListener(event, function (evt) { |
| if(!opts.js_modal_lightbox || evt.button != 0) return; |
|
|
| modalZoomSet(gradioApp().getElementById('modalImage'), opts.js_modal_lightbox_initially_zoomed) |
| evt.preventDefault() |
| showModal(evt) |
| }, true); |
|
|
| } |
|
|
| function modalZoomSet(modalImage, enable) { |
| if(modalImage) modalImage.classList.toggle('modalImageFullscreen', !!enable); |
| } |
|
|
| function modalZoomToggle(event) { |
| var modalImage = gradioApp().getElementById("modalImage"); |
| modalZoomSet(modalImage, !modalImage.classList.contains('modalImageFullscreen')) |
| event.stopPropagation() |
| } |
|
|
| function modalTileImageToggle(event) { |
| const modalImage = gradioApp().getElementById("modalImage"); |
| const modal = gradioApp().getElementById("lightboxModal"); |
| const isTiling = modalImage.style.display === 'none'; |
| if (isTiling) { |
| modalImage.style.display = 'block'; |
| modal.style.setProperty('background-image', 'none') |
| } else { |
| modalImage.style.display = 'none'; |
| modal.style.setProperty('background-image', `url(${modalImage.src})`) |
| } |
|
|
| event.stopPropagation() |
| } |
|
|
| function galleryImageHandler(e) { |
| |
| e.onclick = showGalleryImage; |
| |
| } |
|
|
| onUiUpdate(function() { |
| var fullImg_preview = gradioApp().querySelectorAll('.gradio-gallery > div > img') |
| if (fullImg_preview != null) { |
| fullImg_preview.forEach(setupImageForLightbox); |
| } |
| updateOnBackgroundChange(); |
| }) |
|
|
| document.addEventListener("DOMContentLoaded", function() { |
| |
| const modal = document.createElement('div') |
| modal.onclick = closeModal; |
| modal.id = "lightboxModal"; |
| modal.tabIndex = 0 |
| modal.addEventListener('keydown', modalKeyHandler, true) |
|
|
| const modalControls = document.createElement('div') |
| modalControls.className = 'modalControls gradio-container'; |
| modal.append(modalControls); |
|
|
| const modalZoom = document.createElement('span') |
| modalZoom.className = 'modalZoom cursor'; |
| modalZoom.innerHTML = '⤡' |
| modalZoom.addEventListener('click', modalZoomToggle, true) |
| modalZoom.title = "Toggle zoomed view"; |
| modalControls.appendChild(modalZoom) |
|
|
| const modalTileImage = document.createElement('span') |
| modalTileImage.className = 'modalTileImage cursor'; |
| modalTileImage.innerHTML = '⊞' |
| modalTileImage.addEventListener('click', modalTileImageToggle, true) |
| modalTileImage.title = "Preview tiling"; |
| modalControls.appendChild(modalTileImage) |
|
|
| const modalSave = document.createElement("span") |
| modalSave.className = "modalSave cursor" |
| modalSave.id = "modal_save" |
| modalSave.innerHTML = "🖫" |
| modalSave.addEventListener("click", modalSaveImage, true) |
| modalSave.title = "Save Image(s)" |
| modalControls.appendChild(modalSave) |
|
|
| const modalClose = document.createElement('span') |
| modalClose.className = 'modalClose cursor'; |
| modalClose.innerHTML = '×' |
| modalClose.onclick = closeModal; |
| modalClose.title = "Close image viewer"; |
| modalControls.appendChild(modalClose) |
|
|
| const modalImage = document.createElement('img') |
| modalImage.id = 'modalImage'; |
| modalImage.onclick = closeModal; |
| modalImage.tabIndex = 0 |
| modalImage.addEventListener('keydown', modalKeyHandler, true) |
| modal.appendChild(modalImage) |
|
|
| const modalPrev = document.createElement('a') |
| modalPrev.className = 'modalPrev'; |
| modalPrev.innerHTML = '❮' |
| modalPrev.tabIndex = 0 |
| modalPrev.addEventListener('click', modalPrevImage, true); |
| modalPrev.addEventListener('keydown', modalKeyHandler, true) |
| modal.appendChild(modalPrev) |
|
|
| const modalNext = document.createElement('a') |
| modalNext.className = 'modalNext'; |
| modalNext.innerHTML = '❯' |
| modalNext.tabIndex = 0 |
| modalNext.addEventListener('click', modalNextImage, true); |
| modalNext.addEventListener('keydown', modalKeyHandler, true) |
|
|
| modal.appendChild(modalNext) |
|
|
| try { |
| gradioApp().appendChild(modal); |
| } catch (e) { |
| gradioApp().body.appendChild(modal); |
| } |
|
|
| document.body.appendChild(modal); |
|
|
| }); |
|
|