123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- // A full size 'lightbox' preview modal shown when left clicking on gallery previews
- 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 = "block";
- lb.focus()
- event.stopPropagation()
- }
- function negmod(n, m) {
- return ((n % m) + m) % m;
- }
- function modalImageSwitch(offset){
- var allgalleryButtons = gradioApp().querySelectorAll(".gallery-item.transition-all")
- var galleryButtons = []
- allgalleryButtons.forEach(function(elem){
- if(elem.parentElement.offsetParent){
- galleryButtons.push(elem);
- }
- })
- if(galleryButtons.length>1){
- var allcurrentButtons = gradioApp().querySelectorAll(".gallery-item.transition-all.\\!ring-2")
- var currentButton = null
- allcurrentButtons.forEach(function(elem){
- if(elem.parentElement.offsetParent){
- currentButton = elem;
- }
- })
- var result = -1
- galleryButtons.forEach(function(v, i){ if(v==currentButton) { result = i } })
- if(result != -1){
- 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 modalNextImage(event){
- modalImageSwitch(1)
- event.stopPropagation()
- }
- function modalPrevImage(event){
- modalImageSwitch(-1)
- event.stopPropagation()
- }
- function modalKeyHandler(event){
- switch (event.key) {
- case "ArrowLeft":
- modalPrevImage(event)
- break;
- case "ArrowRight":
- modalNextImage(event)
- break;
- case "Escape":
- closeModal();
- break;
- }
- }
- function showGalleryImage(){
- setTimeout(function() {
- fullImg_preview = gradioApp().querySelectorAll('img.w-full.object-contain')
-
- if(fullImg_preview != null){
- fullImg_preview.forEach(function function_name(e) {
- if(e && e.parentElement.tagName == 'DIV'){
- e.style.cursor='pointer'
- e.addEventListener('click', function (evt) {
- if(!opts.js_modal_lightbox) return;
- modalZoomSet(gradioApp().getElementById('modalImage'), opts.js_modal_lightbox_initialy_zoomed)
- showModal(evt)
- },true);
- }
- });
- }
- }, 100);
- }
- function modalZoomSet(modalImage, enable){
- if( enable ){
- modalImage.classList.add('modalImageFullscreen');
- } else{
- modalImage.classList.remove('modalImageFullscreen');
- }
- }
- function modalZoomToggle(event){
- 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){
- if(e && e.parentElement.tagName == 'BUTTON'){
- e.onclick = showGalleryImage;
- }
- }
- onUiUpdate(function(){
- fullImg_preview = gradioApp().querySelectorAll('img.w-full')
- if(fullImg_preview != null){
- fullImg_preview.forEach(galleryImageHandler);
- }
- })
- document.addEventListener("DOMContentLoaded", function() {
- const modalFragment = document.createDocumentFragment();
- 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 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)
- gradioApp().getRootNode().appendChild(modal)
-
- document.body.appendChild(modalFragment);
-
- });
|