| const general = require('../general') |
| const thumbnail = require('../../thumbnail') |
| const html_manip = require('../html_manip') |
| const api = require('../api') |
| const psapi = require('../../psapi') |
| const sdapi = require('../../sdapi_py_re') |
| const Enum = require('../../enum') |
| |
| async function promptForUpdate(header_message, long_message) { |
| const shell = require('uxp').shell |
|
|
| ;(async () => { |
| const buttons = ['Cancel', 'OK'] |
| const r1 = await dialog_box.prompt( |
| header_message, |
| long_message, |
| buttons |
| |
| |
| |
| |
| |
| ) |
| try { |
| let url |
| if (r1 === 'Cancel') { |
| |
| console.log('cancel') |
| } else if (r1 === 'Github') { |
| url = |
| 'https://github.com/AbdullahAlfaraj/Auto-Photoshop-StableDiffusion-Plugin' |
| |
| } else if (r1 === 'Discord') { |
| console.log('Discord') |
| |
| |
| |
| } else if (r1 === 'Ok') { |
| } |
| |
| } catch (e) { |
| console.warn(e, url) |
| } |
| })() |
| } |
|
|
| async function updateClickEventHandler(current_version) { |
| try { |
| const online_data = await general.requestOnlineData() |
| const b_need_update = general.compareVersions( |
| current_version, |
| online_data.new_version |
| ) |
|
|
| let header_message = "You're Plugin is up to date." |
| let long_message = '' |
| if (b_need_update) { |
| header_message = `New Version is Available (${online_data.new_version})` |
| long_message = online_data.update_message |
| } |
|
|
| await promptForUpdate(header_message, long_message) |
| } catch (e) { |
| console.warn(e) |
| } |
| } |
|
|
| function viewMaskExpansion() { |
| if (g_generation_session.base64maskExpansionImage) { |
| const mask_src = general.base64ToBase64Url( |
| g_generation_session.base64maskExpansionImage |
| ) |
| html_manip.setInitImageMaskSrc(mask_src) |
| } else { |
| console.log( |
| 'the mask has not been expanded, g_generation_session.base64maskExpansionImage is empty' |
| ) |
| } |
| } |
| function viewDrawnMask() { |
| |
| if (g_generation_session.activeBase64MaskImage) { |
| const mask_src = general.base64ToBase64Url( |
| g_generation_session.activeBase64MaskImage |
| ) |
| html_manip.setInitImageMaskSrc(mask_src) |
| } else { |
| console.log('no mask is available') |
| } |
| } |
|
|
| async function clipInterrogate() { |
| try { |
| const width = html_manip.getWidth() |
| const height = html_manip.getHeight() |
| const selectionInfo = await psapi.getSelectionInfoExe() |
|
|
| const base64 = await io.IO.getSelectionFromCanvasAsBase64Interface_New( |
| width, |
| height, |
| selectionInfo, |
| true |
| ) |
|
|
| const url = `${g_sd_url}/sdapi/v1/interrogate` |
|
|
| const payload = { |
| image: base64, |
| model: 'clip', |
| } |
| const result_json = await api.requestPost(url, payload) |
| console.log(result_json) |
| return result_json |
| } catch (e) { |
| console.warn(e) |
| } |
| } |
|
|
| function getHrScaleSliderSDValue() { |
| sd_value = html_manip.getSliderSdValue('hrScaleSlider', 1, 100, 1, 4) |
| return sd_value |
| } |
| function setHrScaleSliderSDValue(sd_value) { |
| const slider_id = 'hrScaleSlider' |
| const label_id = 'hrScaleLabel' |
| html_manip.setSliderSdValue(slider_id, label_id, sd_value, 1, 100, 1, 4) |
| } |
| function getImageCfgScaleSDValue() { |
| sd_value = html_manip.getSliderSdValue('slImageCfgScale', 0, 30, 0, 3) |
| return sd_value |
| } |
| function setImageCfgScaleSDValue(sd_value) { |
| const slider_id = 'slImageCfgScale' |
| const label_id = 'lImageCfgScale' |
| |
| html_manip.setSliderSdValue(slider_id, label_id, sd_value, 0, 30, 0, 3) |
| } |
|
|
| function updateHrScaleFromToLabel() { |
| |
| |
| |
|
|
| const hr_scale = getHrScaleSliderSDValue() |
| const [width, height] = [html_manip.getWidth(), html_manip.getHeight()] |
| const [hr_width, hr_height] = [ |
| parseInt(width * hr_scale), |
| parseInt(height * hr_scale), |
| ] |
| document.getElementById( |
| 'lHrScaleFromTo' |
| ).textContent = `${width}x${height} -> ${hr_width}x${hr_height}` |
| } |
| function getLoraModelPrompt(lora_model_name) { |
| return `<lora:${lora_model_name}:1>` |
| } |
| async function populateLoraModelMenu() { |
| try { |
| const lora_models_json = await sdapi.requestLoraModels() |
| const lora_models_names = Object.keys(lora_models_json) |
|
|
| document.getElementById('mLoraModelMenu').innerHTML = '' |
|
|
| html_manip.populateMenu( |
| 'mLoraModelMenu', |
| 'mLoraModelItemClass', |
| lora_models_names, |
| (item, item_html_element) => { |
| item_html_element.innerHTML = item |
| item_html_element.onclick = () => { |
| const lora_prompt = getLoraModelPrompt(item) |
| const prompt = html_manip.getPrompt() |
| html_manip.autoFillInPrompt(`${prompt} ${lora_prompt}`) |
| } |
| }, |
| false, |
| 'Select Lora' |
| ) |
| } catch (e) { |
| console.warn('populateLoraModelMenu error: ', e) |
| } |
| } |
|
|
| function displayImageCfgScaleSlider(mode) { |
| const b_slider_enabled = document.getElementById( |
| 'chUseImageCfgScaleSlider' |
| ).checked |
| if (b_slider_enabled) { |
| if (mode === Enum.generationModeEnum['Txt2Img']) { |
| document.getElementById('slImageCfgScale').style.display = 'none' |
| } else if (mode === Enum.generationModeEnum['Img2Img']) { |
| document.getElementById('slImageCfgScale').style.display = 'block' |
| } else if (mode === Enum.generationModeEnum['Inpaint']) { |
| document.getElementById('slImageCfgScale').style.display = 'block' |
| } else if (mode === Enum.generationModeEnum['Outpaint']) { |
| document.getElementById('slImageCfgScale').style.display = 'none' |
| } else { |
| document.getElementById('slImageCfgScale').style.display = 'none' |
| } |
| } else { |
| document.getElementById('slImageCfgScale').style.display = 'none' |
| } |
| } |
| function initInitMaskElement() { |
| |
| const mask_image_html = html_manip.getInitImageMaskElement() |
| const mask_parent_element = mask_image_html.parentElement |
|
|
| this.thumbnail_container = thumbnail.Thumbnail.wrapImgInContainer( |
| mask_image_html, |
| 'viewer-image-container' |
| ) |
| mask_parent_element.appendChild(thumbnail_container) |
| thumbnail.Thumbnail.addSPButtonToContainer( |
| this.thumbnail_container, |
| 'svg_sp_btn', |
| 'view original mask', |
|
|
| viewDrawnMask, |
| null |
| ) |
| thumbnail.Thumbnail.addSPButtonToContainer( |
| this.thumbnail_container, |
| 'svg_sp_btn_expand', |
| 'view modified mask', |
|
|
| viewMaskExpansion, |
| null |
| ) |
| populateLoraModelMenu() |
| } |
|
|
| async function refreshSDTab() { |
| populateLoraModelMenu() |
| } |
| document.getElementById('hrScaleSlider').addEventListener('input', (evt) => { |
| const sd_value = getHrScaleSliderSDValue() |
| setHrScaleSliderSDValue(sd_value.toFixed(2)) |
| updateHrScaleFromToLabel() |
| }) |
| document.getElementById('btnUpdate').addEventListener('click', async () => { |
| await updateClickEventHandler(g_version) |
| }) |
|
|
| document |
| .getElementById('slMaskExpansion') |
| .addEventListener('change', async (evt) => { |
| document.getElementById('slMaskExpansion') |
| const original_mask = g_generation_session.activeBase64MaskImage |
| if (original_mask) { |
| |
| |
| const iterations = evt.target.value |
| const modified_mask = await py_re.maskExpansionRequest( |
| original_mask, |
| iterations |
| ) |
| if (modified_mask) { |
| g_generation_session.base64maskExpansionImage = modified_mask |
| viewMaskExpansion() |
| } |
| } |
| }) |
|
|
| document |
| .getElementById('btnInterrogate') |
| .addEventListener('click', async () => { |
| |
| setTimeout(() => { |
| g_generation_session.sudo_timer_id = |
| general.sudoTimer('Interrogate') |
| }, 1000) |
| const interrogate_result = await clipInterrogate() |
|
|
| if (interrogate_result.caption) { |
| html_manip.autoFillInPrompt(interrogate_result.caption) |
| } |
|
|
| |
|
|
| html_manip.updateProgressBarsHtml(0, 'No work in progress') |
| g_generation_session.sudo_timer_id = clearInterval( |
| g_generation_session.sudo_timer_id |
| ) |
| }) |
|
|
| function ctrlBackspaceDelete(text) { |
| try { |
| let index = text.indexOf(String.fromCharCode(127)) |
| let new_text = text |
| if (index >= 0) { |
| |
| console.log('Ctrl + Enter pressed') |
|
|
| function ctrlBackspaceDeleteLogic(string, index) { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| if (index < 1) { |
| return string |
| } |
| let i = index - 1 |
| if (/\s/.test(string[i])) { |
| while (i > 0 && /\s/.test(string[i - 1])) { |
| i-- |
| } |
| } else { |
| while ( |
| i > 0 && |
| /\s/.test(string[i - 1]) === /\s/.test(string[i]) |
| ) { |
| i-- |
| } |
| } |
| return string.slice(0, i) + string.slice(index) |
| } |
| new_text = ctrlBackspaceDeleteLogic(text, index + 1) |
| } |
|
|
| return new_text |
| } catch (error) { |
| console.warn(error) |
| } |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function initSDTab() { |
| initInitMaskElement() |
| html_manip.sliderAddEventListener_new( |
| 'slImageCfgScale', |
| 'lImageCfgScale', |
| 0, |
| 30, |
| 0, |
| 3 |
| ) |
| } |
|
|
| initSDTab() |
| module.exports = { |
| updateClickEventHandler, |
| viewMaskExpansion, |
| viewDrawnMask, |
| clipInterrogate, |
| getHrScaleSliderSDValue, |
| getLoraModelPrompt, |
| populateLoraModelMenu, |
| getImageCfgScaleSDValue, |
| setImageCfgScaleSDValue, |
| refreshSDTab, |
| displayImageCfgScaleSlider, |
| } |
|
|