| | (function () { |
| | async function checkEditorAvailable() { |
| | const EDITOR_PATH = '/openpose_editor_index'; |
| | const res = await fetch(EDITOR_PATH); |
| | return res.status === 200; |
| | } |
| |
|
| | const cnetOpenposeEditorRegisteredElements = new Set(); |
| | function loadOpenposeEditor() { |
| | |
| | |
| | function updateInput(target) { |
| | let e = new Event("input", { bubbles: true }) |
| | Object.defineProperty(e, "target", { value: target }) |
| | target.dispatchEvent(e); |
| | } |
| |
|
| | function navigateIframe(iframe) { |
| | function getPathname(rawURL) { |
| | try { |
| | return new URL(rawURL).pathname; |
| | } catch (e) { |
| | return rawURL; |
| | } |
| | } |
| |
|
| | return new Promise((resolve) => { |
| | const EDITOR_PATH = '/openpose_editor_index'; |
| | const darkThemeParam = document.body.classList.contains('dark') ? |
| | new URLSearchParams({ theme: 'dark' }).toString() : |
| | ''; |
| |
|
| | window.addEventListener('message', (event) => { |
| | const message = event.data; |
| | if (message['ready']) resolve(); |
| | }, { once: true }); |
| |
|
| | if (getPathname(iframe.src) !== EDITOR_PATH) { |
| | iframe.src = `${EDITOR_PATH}?${darkThemeParam}`; |
| | |
| | |
| | setTimeout(resolve, 5000); |
| | } else { |
| | |
| | resolve(); |
| | } |
| | }); |
| | } |
| |
|
| | const imageRows = gradioApp().querySelectorAll('.cnet-image-row'); |
| | imageRows.forEach(imageRow => { |
| | if (cnetOpenposeEditorRegisteredElements.has(imageRow)) return; |
| | cnetOpenposeEditorRegisteredElements.add(imageRow); |
| |
|
| | const generatedImageGroup = imageRow.querySelector('.cnet-generated-image-group'); |
| | const editButton = generatedImageGroup.querySelector('.cnet-edit-pose'); |
| |
|
| | editButton.addEventListener('click', async () => { |
| | const inputImageGroup = imageRow.querySelector('.cnet-input-image-group'); |
| | const inputImage = inputImageGroup.querySelector('.cnet-image img'); |
| | const downloadLink = generatedImageGroup.querySelector('.cnet-download-pose a'); |
| | const modalId = editButton.id.replace('cnet-modal-open-', ''); |
| | const modalIframe = generatedImageGroup.querySelector('.cnet-modal iframe'); |
| |
|
| | await navigateIframe(modalIframe); |
| | modalIframe.contentWindow.postMessage({ |
| | modalId, |
| | imageURL: inputImage.src, |
| | poseURL: downloadLink.href, |
| | }, '*'); |
| | |
| | |
| | |
| | modalIframe.contentWindow.focus(); |
| | }); |
| |
|
| | window.addEventListener('message', (event) => { |
| | const message = event.data; |
| | const downloadLink = generatedImageGroup.querySelector('.cnet-download-pose a'); |
| | const renderButton = generatedImageGroup.querySelector('.cnet-render-pose'); |
| | const poseTextbox = generatedImageGroup.querySelector('.cnet-pose-json textarea'); |
| | const modalId = editButton.id.replace('cnet-modal-open-', ''); |
| | const closeModalButton = generatedImageGroup.querySelector('.cnet-modal .cnet-modal-close'); |
| |
|
| | if (message.modalId !== modalId) return; |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | downloadLink.href = message.poseURL; |
| | poseTextbox.value = message.poseURL; |
| | updateInput(poseTextbox); |
| | renderButton.click(); |
| | closeModalButton.click(); |
| | }); |
| | }); |
| | } |
| |
|
| | function loadPlaceHolder() { |
| | const imageRows = gradioApp().querySelectorAll('.cnet-image-row'); |
| | imageRows.forEach(imageRow => { |
| | if (cnetOpenposeEditorRegisteredElements.has(imageRow)) return; |
| | cnetOpenposeEditorRegisteredElements.add(imageRow); |
| |
|
| | const generatedImageGroup = imageRow.querySelector('.cnet-generated-image-group'); |
| | const editButton = generatedImageGroup.querySelector('.cnet-edit-pose'); |
| | const modalContent = generatedImageGroup.querySelector('.cnet-modal-content'); |
| |
|
| | modalContent.classList.add('alert'); |
| | modalContent.innerHTML = ` |
| | <div> |
| | <p>Openpose editor not found. Please make sure you have an openpose |
| | editor available on /openpose_editor_index. To hide the edit button, |
| | you can check "Disable openpose edit" in Settings.<br> |
| | |
| | Following extension(s) provide integration with ControlNet:</p> |
| | <ul style="list-style-type:none;"> |
| | <li><a href="https://github.com/huchenlei/sd-webui-openpose-editor"> |
| | huchenlei/sd-webui-openpose-editor</a></li> |
| | </ul> |
| | </div> |
| | `; |
| |
|
| | editButton.innerHTML = '<del>' + editButton.innerHTML + '</del>'; |
| | }); |
| | } |
| |
|
| | checkEditorAvailable().then(editorAvailable => { |
| | onUiUpdate(() => { |
| | if (editorAvailable) |
| | loadOpenposeEditor(); |
| | else |
| | loadPlaceHolder(); |
| | }); |
| | }); |
| | })(); |