|
const html_manip = require('./html_manip') |
|
const presets = require('./presets/preset') |
|
const layer_util = require('../utility/layer') |
|
const psapi = require('../psapi') |
|
const Enum = require('../enum') |
|
const { executeAsModal } = require('photoshop').core |
|
|
|
class UI { |
|
constructor() {} |
|
|
|
onStartSessionUI() { |
|
|
|
|
|
const accept_class_btns = Array.from( |
|
document.getElementsByClassName('acceptClass') |
|
) |
|
|
|
const discard_class_btns = Array.from( |
|
document.getElementsByClassName('discardClass') |
|
) |
|
|
|
const discard_selected_class_btns = Array.from( |
|
document.getElementsByClassName('discardSelectedClass') |
|
) |
|
|
|
const accept_selected_class_btns = Array.from( |
|
document.getElementsByClassName('acceptSelectedClass') |
|
) |
|
|
|
|
|
accept_class_btns.forEach( |
|
(element) => (element.style.display = 'inline-block') |
|
) |
|
discard_class_btns.forEach( |
|
(element) => (element.style.display = 'inline-block') |
|
) |
|
discard_selected_class_btns.forEach( |
|
(element) => (element.style.display = 'inline-block') |
|
) |
|
accept_selected_class_btns.forEach( |
|
(element) => (element.style.display = 'inline-block') |
|
) |
|
|
|
this.generateMoreUI() |
|
} |
|
onActiveSessionUI() {} |
|
generateModeUI(mode) { |
|
const generate_btns = Array.from( |
|
document.getElementsByClassName('btnGenerateClass') |
|
) |
|
generate_btns.forEach((element) => { |
|
element.textContent = `Generate ${mode}` |
|
}) |
|
html_manip.setGenerateButtonsColor('generate', 'generate-more') |
|
} |
|
generateMoreUI() { |
|
const generate_btns = Array.from( |
|
document.getElementsByClassName('btnGenerateClass') |
|
) |
|
const generation_mode = g_generation_session.mode |
|
const generation_name = getCurrentGenerationModeByValue(generation_mode) |
|
generate_btns.forEach((element) => { |
|
element.textContent = `Generate More ${generation_name}` |
|
}) |
|
html_manip.setGenerateButtonsColor('generate-more', 'generate') |
|
} |
|
|
|
onEndSessionUI() { |
|
const accept_class_btns = Array.from( |
|
document.getElementsByClassName('acceptClass') |
|
) |
|
|
|
const discard_class_btns = Array.from( |
|
document.getElementsByClassName('discardClass') |
|
) |
|
const discard_selected_class_btns = Array.from( |
|
document.getElementsByClassName('discardSelectedClass') |
|
) |
|
|
|
const accept_selected_class_btns = Array.from( |
|
|
|
document.getElementsByClassName('acceptSelectedClass') |
|
) |
|
|
|
accept_class_btns.forEach((element) => (element.style.display = 'none')) |
|
discard_class_btns.forEach( |
|
(element) => (element.style.display = 'none') |
|
) |
|
discard_selected_class_btns.forEach( |
|
(element) => (element.style.display = 'none') |
|
) |
|
|
|
accept_selected_class_btns.forEach( |
|
(element) => (element.style.display = 'none') |
|
) |
|
|
|
this.generateModeUI(g_sd_mode) |
|
} |
|
|
|
setGenerateBtnText(textContent) { |
|
const generate_btns = Array.from( |
|
document.getElementsByClassName('btnGenerateClass') |
|
) |
|
generate_btns.forEach((element) => { |
|
element.textContent = textContent |
|
}) |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UIElement { |
|
constructor() { |
|
this.name |
|
this.html_elem |
|
this.sd_value |
|
} |
|
setValue() {} |
|
getValue() {} |
|
} |
|
function createUIElement(getter, setter) { |
|
let ui_element_obj = new UIElement() |
|
ui_element_obj.getValue = getter |
|
ui_element_obj.setValue = setter |
|
return ui_element_obj |
|
} |
|
class UISettings { |
|
|
|
constructor() { |
|
|
|
|
|
|
|
this.width = createUIElement( |
|
html_manip.getWidth, |
|
html_manip.autoFillInWidth |
|
) |
|
this.height = createUIElement( |
|
html_manip.getHeight, |
|
html_manip.autoFillInHeight |
|
) |
|
this.steps = createUIElement( |
|
html_manip.getSteps, |
|
html_manip.autoFillInSteps |
|
) |
|
this.batch_number = createUIElement( |
|
html_manip.getBatchNumber, |
|
html_manip.autoFillInBatchNumber |
|
) |
|
this.firstphase_width = createUIElement( |
|
html_manip.getHrWidth, |
|
html_manip.autoFillInHRWidth |
|
) |
|
this.firstphase_height = createUIElement( |
|
html_manip.getHrHeight, |
|
html_manip.autoFillInHRHeight |
|
) |
|
this.cfg = createUIElement(html_manip.getCFG, html_manip.setCFG) |
|
this.denoising_strength = createUIElement( |
|
html_manip.getDenoisingStrength, |
|
html_manip.autoFillInDenoisingStrength |
|
) |
|
|
|
this.mask_content = createUIElement( |
|
html_manip.getMaskContent, |
|
html_manip.setMaskContent |
|
) |
|
this.seed = createUIElement(html_manip.getSeed, html_manip.setSeed) |
|
this.prompt = createUIElement( |
|
html_manip.getPrompt, |
|
html_manip.autoFillInPrompt |
|
) |
|
this.negative_prompt = createUIElement( |
|
html_manip.getNegativePrompt, |
|
html_manip.autoFillInNegativePrompt |
|
) |
|
this.mask_blur = createUIElement( |
|
html_manip.getMaskBlur, |
|
html_manip.setMaskBlur |
|
) |
|
this.mask_expansion = createUIElement( |
|
html_manip.getMaskExpansion, |
|
html_manip.setMaskExpansion |
|
) |
|
this.samplers = createUIElement( |
|
html_manip.getCheckedSamplerName, |
|
html_manip.autoFillInSampler |
|
) |
|
|
|
this.uiElements = { |
|
|
|
|
|
prompt: this.prompt, |
|
negative_prompt: this.negative_prompt, |
|
|
|
batch_size: this.batch_number, |
|
steps: this.steps, |
|
width: this.width, |
|
height: this.height, |
|
firstphase_width: this.firstphase_width, |
|
firstphase_height: this.firstphase_height, |
|
cfg_scale: this.cfg, |
|
denoising_strength: this.denoising_strength, |
|
|
|
mask_blur: this.mask_blur, |
|
mask_expansion: this.mask_expansion, |
|
|
|
|
|
|
|
seed: this.seed, |
|
sampler_index: this.samplers, |
|
mask_content: this.mask_content, |
|
} |
|
} |
|
|
|
autoFillInSettings(settings) { |
|
for (const [name, value] of Object.entries(settings)) { |
|
if (this.uiElements.hasOwnProperty(name) && value) { |
|
|
|
const old_value = this.uiElements[name].getValue() |
|
console.log( |
|
'(name,old_value) => newValue:', |
|
name, |
|
old_value, |
|
value |
|
) |
|
|
|
this.uiElements[name].setValue(value) |
|
} |
|
} |
|
} |
|
getSettings() { |
|
let settings = {} |
|
for (const [name, ui_element] of Object.entries(this.uiElements)) { |
|
if (ui_element) { |
|
const value = ui_element.getValue() |
|
settings[name] = value |
|
} |
|
} |
|
return settings |
|
} |
|
|
|
saveAsJson(json_file_name, settings) { |
|
for (const [name, value] of Object.entries(settings)) { |
|
if (this.uiElements.hasOwnProperty(name) && value) { |
|
|
|
const old_value = this.uiElements[name].getValue() |
|
console.log( |
|
'(name,old_value) => newValue:', |
|
name, |
|
old_value, |
|
value |
|
) |
|
|
|
|
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
function loadPreset(ui_settings, preset) { |
|
console.log('preset:', preset) |
|
ui_settings.autoFillInSettings(preset) |
|
} |
|
|
|
function loadLatentNoiseSettings(ui_settings) { |
|
loadPreset(ui_settings, presets.LatentNoiseSettings) |
|
} |
|
|
|
function loadFillSettings(ui_settings) { |
|
loadPreset(ui_settings, presets.FillSettings) |
|
} |
|
function loadOriginalSettings(ui_settings) { |
|
loadPreset(ui_settings, presets.OriginalSettings) |
|
} |
|
async function loadHealBrushSettings(ui_settings) { |
|
document.getElementById('rbModeInpaint').click() |
|
|
|
loadPreset(ui_settings, presets.HealBrushSettings) |
|
} |
|
function loadCustomPreset(ui_settings_obj, custom_preset_settings) { |
|
loadPreset(ui_settings_obj, custom_preset_settings) |
|
} |
|
|
|
function loadCustomPresetsSettings() {} |
|
async function mapCustomPresetsToLoaders(ui_settings_obj) { |
|
const name_to_settings_obj = await presets.getAllCustomPresetsSettings( |
|
Enum.PresetTypeEnum['SDPreset'] |
|
) |
|
const preset_name_to_loader_obj = {} |
|
for (const [preset_name, preset_settings] of Object.entries( |
|
name_to_settings_obj |
|
)) { |
|
preset_name_to_loader_obj[preset_name] = () => { |
|
loadCustomPreset(ui_settings_obj, preset_settings) |
|
} |
|
} |
|
return preset_name_to_loader_obj |
|
} |
|
|
|
const g_nativePresets = { |
|
fill: loadFillSettings, |
|
original: loadOriginalSettings, |
|
'latent noise': loadLatentNoiseSettings, |
|
'Heal Brush': loadHealBrushSettings, |
|
} |
|
|
|
async function getLoadedPresets(ui_settings_obj) { |
|
let customPresets |
|
|
|
customPresets = await mapCustomPresetsToLoaders(ui_settings_obj) |
|
console.log('customPresets: ', customPresets) |
|
let loadedPresets = { |
|
...g_nativePresets, |
|
...customPresets, |
|
} |
|
return loadedPresets |
|
} |
|
let g_ui_settings_object = new UISettings() |
|
function getUISettingsObject() { |
|
return g_ui_settings_object |
|
} |
|
|
|
|
|
function addPresetMenuItem(preset_title) { |
|
|
|
const menu_item_element = document.createElement('sp-menu-item') |
|
menu_item_element.className = 'mPresetMenuItem' |
|
menu_item_element.innerHTML = preset_title |
|
|
|
|
|
|
|
|
|
return menu_item_element |
|
} |
|
|
|
async function populatePresetMenu() { |
|
document.getElementById('mPresetMenu').innerHTML = '' |
|
const divider_elem = document.createElement('sp-menu-divider') |
|
const preset_name = 'Select Smart Preset' |
|
const preset_func = () => {} |
|
const dummy_preset_item = addPresetMenuItem(preset_name, preset_func) |
|
dummy_preset_item.setAttribute('selected', 'selected') |
|
|
|
document.getElementById('mPresetMenu').appendChild(dummy_preset_item) |
|
document.getElementById('mPresetMenu').appendChild(divider_elem) |
|
const presets = await getLoadedPresets(g_ui_settings_object) |
|
for ([key, value] of Object.entries(presets)) { |
|
const preset_menu_item = addPresetMenuItem(key, value) |
|
document.getElementById('mPresetMenu').appendChild(preset_menu_item) |
|
} |
|
} |
|
|
|
populatePresetMenu() |
|
|
|
document |
|
.getElementById('mPresetMenu') |
|
.addEventListener('change', async (evt) => { |
|
const preset_index = evt.target.selectedIndex |
|
const preset_name = evt.target.options[preset_index].textContent |
|
const presets = await getLoadedPresets(g_ui_settings_object) |
|
if (presets.hasOwnProperty(preset_name)) { |
|
const loader = presets[preset_name] |
|
if (loader.constructor.name === 'AsyncFunction') { |
|
await loader(g_ui_settings_object) |
|
} else { |
|
loader(g_ui_settings_object) |
|
} |
|
} |
|
}) |
|
|
|
module.exports = { |
|
UI, |
|
UIElement, |
|
UISettings, |
|
loadLatentNoiseSettings, |
|
loadFillSettings, |
|
loadHealBrushSettings, |
|
getLoadedPresets, |
|
getUISettingsObject, |
|
populatePresetMenu, |
|
} |
|
|