imageviewer.js 6.6 KB
Newer Older
A
AUTOMATIC 已提交
1
// A full size 'lightbox' preview modal shown when left clicking on gallery previews
2

D
DepFA 已提交
3 4 5 6
function closeModal() {
  gradioApp().getElementById("lightboxModal").style.display = "none";
}

7
function showModal(event) {
8 9 10 11 12 13 14
  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 + ')');
  }
15 16
  lb.style.display = "block";
  lb.focus()
17
  event.stopPropagation()
D
DepFA 已提交
18 19
}

20 21 22 23 24
function negmod(n, m) {
  return ((n % m) + m) % m;
}

function modalImageSwitch(offset){
25 26 27 28 29 30 31
  var allgalleryButtons = gradioApp().querySelectorAll(".gallery-item.transition-all")
  var galleryButtons = []
  allgalleryButtons.forEach(function(elem){
    if(elem.parentElement.offsetParent){
        galleryButtons.push(elem);
    }
  })
32

33
  if(galleryButtons.length>1){
34 35 36 37 38 39 40
      var allcurrentButtons = gradioApp().querySelectorAll(".gallery-item.transition-all.\\!ring-2")
      var currentButton = null
      allcurrentButtons.forEach(function(elem){
        if(elem.parentElement.offsetParent){
            currentButton = elem;
        }
      })
41

42 43
      var result = -1
      galleryButtons.forEach(function(v, i){ if(v==currentButton) { result = i } })
D
DepFA 已提交
44

45 46 47
      if(result != -1){
        nextButton = galleryButtons[negmod((result+offset),galleryButtons.length)]
        nextButton.click()
48 49 50 51 52 53 54
        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)
55 56 57
      }
  }
}
D
DepFA 已提交
58

59 60 61
function modalNextImage(event){
  modalImageSwitch(1)
  event.stopPropagation()
D
DepFA 已提交
62 63
}

64 65 66 67 68 69 70 71 72 73 74 75 76
function modalPrevImage(event){
  modalImageSwitch(-1)  
  event.stopPropagation()
}

function modalKeyHandler(event){
    switch (event.key) {
        case "ArrowLeft":
            modalPrevImage(event)
            break;
        case "ArrowRight":
            modalNextImage(event)
            break;
A
Adam Snodgrass 已提交
77 78 79
        case "Escape":
            closeModal();
            break;
80 81 82
    }
}

D
typo  
DepFA 已提交
83 84 85 86 87 88
function showGalleryImage(){
    setTimeout(function() {
        fullImg_preview = gradioApp().querySelectorAll('img.w-full.object-contain')
        
        if(fullImg_preview != null){
            fullImg_preview.forEach(function function_name(e) {
G
guaneec 已提交
89 90 91
                if (e.dataset.modded)
                    return;
                e.dataset.modded = true;
D
typo  
DepFA 已提交
92 93 94 95 96
                if(e && e.parentElement.tagName == 'DIV'){

                    e.style.cursor='pointer'

                    e.addEventListener('click', function (evt) {
97
                        if(!opts.js_modal_lightbox) return;
A
Aidan Holland 已提交
98
                        modalZoomSet(gradioApp().getElementById('modalImage'), opts.js_modal_lightbox_initially_zoomed)
99
                        showModal(evt)
D
typo  
DepFA 已提交
100 101 102 103 104 105 106 107
                    },true);
                }
            });
        }

    }, 100);
}

108 109
function modalZoomSet(modalImage, enable){
    if( enable ){
D
DepFA 已提交
110
        modalImage.classList.add('modalImageFullscreen');
111
    } else{
D
DepFA 已提交
112 113
        modalImage.classList.remove('modalImageFullscreen');
    }
114 115 116 117 118
}

function modalZoomToggle(event){
    modalImage = gradioApp().getElementById("modalImage");
    modalZoomSet(modalImage, !modalImage.classList.contains('modalImageFullscreen'))
D
DepFA 已提交
119 120 121
    event.stopPropagation()
}

122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
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()
}

D
typo  
DepFA 已提交
137 138 139 140 141 142
function galleryImageHandler(e){
    if(e && e.parentElement.tagName == 'BUTTON'){
        e.onclick = showGalleryImage;
    }
}

A
AUTOMATIC 已提交
143
onUiUpdate(function(){
D
DepFA 已提交
144 145 146 147
    fullImg_preview = gradioApp().querySelectorAll('img.w-full')
        if(fullImg_preview != null){
	    fullImg_preview.forEach(galleryImageHandler);
    }
A
AUTOMATIC 已提交
148
})
149 150

document.addEventListener("DOMContentLoaded", function() {
D
DepFA 已提交
151 152 153
    const modalFragment = document.createDocumentFragment();
    const modal = document.createElement('div')
    modal.onclick = closeModal;
D
DepFA 已提交
154 155 156 157
    modal.id = "lightboxModal";
    modal.tabIndex=0
    modal.addEventListener('keydown', modalKeyHandler, true)

158 159 160 161
    const modalControls = document.createElement('div')
    modalControls.className = 'modalControls gradio-container';
    modal.append(modalControls);
    
D
DepFA 已提交
162 163 164 165
    const modalZoom = document.createElement('span')
    modalZoom.className = 'modalZoom cursor';
    modalZoom.innerHTML = '⤡'
    modalZoom.addEventListener('click', modalZoomToggle, true)
166
    modalZoom.title = "Toggle zoomed view";
167 168
    modalControls.appendChild(modalZoom)

169 170 171
    const modalTileImage = document.createElement('span')
    modalTileImage.className = 'modalTileImage cursor';
    modalTileImage.innerHTML = '⊞'
172
    modalTileImage.addEventListener('click', modalTileImageToggle, true)
173
    modalTileImage.title = "Preview tiling";
174 175 176 177 178 179
    modalControls.appendChild(modalTileImage)

    const modalClose = document.createElement('span')
    modalClose.className = 'modalClose cursor';
    modalClose.innerHTML = '×'
    modalClose.onclick = closeModal;
180
    modalClose.title = "Close image viewer";
181
    modalControls.appendChild(modalClose)
D
DepFA 已提交
182

D
DepFA 已提交
183 184 185
    const modalImage = document.createElement('img')
    modalImage.id = 'modalImage';
    modalImage.onclick = closeModal;
186 187
    modalImage.tabIndex=0
    modalImage.addEventListener('keydown', modalKeyHandler, true)
D
DepFA 已提交
188 189
    modal.appendChild(modalImage)

190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
    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)


D
DepFA 已提交
208 209 210 211
    gradioApp().getRootNode().appendChild(modal)
    
    document.body.appendChild(modalFragment);
	
212
});