407 lines
12 KiB
JavaScript
407 lines
12 KiB
JavaScript
const io = require('../io')
|
|
const html_manip = require('../html_manip')
|
|
const Enum = require('../../enum')
|
|
const event = require('../event')
|
|
|
|
let settings = {
|
|
model: null,
|
|
prompt_shortcut: null,
|
|
positive_prompt: null,
|
|
negative_prompt: null,
|
|
selection_mode: null,
|
|
batch_number: null,
|
|
steps: null,
|
|
width: null,
|
|
height: null,
|
|
firstphase_width: null,
|
|
firstphase_height: null,
|
|
cfg: null,
|
|
denoising_strength: null,
|
|
hi_res_denoising_strength: null,
|
|
mask_blur: null,
|
|
inpaint_at_full_res: null,
|
|
hi_res_fix: null,
|
|
inpaint_padding: null,
|
|
seed: null,
|
|
samplers: null,
|
|
mask_content: null,
|
|
}
|
|
|
|
let LatentNoiseSettings = {
|
|
model: null,
|
|
prompt_shortcut: null,
|
|
positive_prompt: null,
|
|
negative_prompt: null,
|
|
generation_mode: null,
|
|
batch_number: null,
|
|
steps: null,
|
|
width: null,
|
|
height: null,
|
|
firstphase_width: null,
|
|
firstphase_height: null,
|
|
cfg: null,
|
|
denoising_strength: 0.92,
|
|
hi_res_denoising_strength: null,
|
|
mask_blur: null,
|
|
inpaint_at_full_res: null,
|
|
hi_res_fix: null,
|
|
inpaint_padding: null,
|
|
seed: null,
|
|
samplers: null,
|
|
mask_content: '2',
|
|
}
|
|
|
|
let FillSettings = {
|
|
model: null,
|
|
prompt_shortcut: null,
|
|
positive_prompt: null,
|
|
negative_prompt: null,
|
|
generation_mode: null,
|
|
batch_number: null,
|
|
steps: null,
|
|
width: null,
|
|
height: null,
|
|
firstphase_width: null,
|
|
firstphase_height: null,
|
|
cfg: null,
|
|
denoising_strength: 0.7,
|
|
hi_res_denoising_strength: null,
|
|
mask_blur: null,
|
|
inpaint_at_full_res: null,
|
|
hi_res_fix: null,
|
|
inpaint_padding: null,
|
|
seed: null,
|
|
samplers: null,
|
|
mask_content: '0',
|
|
}
|
|
let OriginalSettings = {
|
|
model: null,
|
|
prompt_shortcut: null,
|
|
positive_prompt: null,
|
|
negative_prompt: null,
|
|
generation_mode: null,
|
|
batch_number: null,
|
|
steps: null,
|
|
width: null,
|
|
height: null,
|
|
firstphase_width: null,
|
|
firstphase_height: null,
|
|
cfg: null,
|
|
denoising_strength: 0.7,
|
|
hi_res_denoising_strength: null,
|
|
mask_blur: null,
|
|
inpaint_at_full_res: null,
|
|
hi_res_fix: null,
|
|
inpaint_padding: null,
|
|
seed: null,
|
|
samplers: null,
|
|
mask_content: '1',
|
|
}
|
|
let HealBrushSettings = {
|
|
model: null,
|
|
prompt_shortcut: null,
|
|
positive_prompt: null,
|
|
negative_prompt: null,
|
|
generation_mode: null,
|
|
batch_number: null,
|
|
steps: '25',
|
|
width: null,
|
|
height: null,
|
|
firstphase_width: null,
|
|
firstphase_height: null,
|
|
cfg: '9',
|
|
denoising_strength: 0.92,
|
|
hi_res_denoising_strength: null,
|
|
mask_blur: 1,
|
|
inpaint_at_full_res: null,
|
|
hi_res_fix: null,
|
|
inpaint_padding: null,
|
|
seed: null,
|
|
samplers: null,
|
|
mask_content: '2',
|
|
mask_expansion: 2,
|
|
}
|
|
|
|
function nullAllSettings() {}
|
|
|
|
class Preset {
|
|
constructor() {}
|
|
|
|
loadPresetFromJson(preset_path) {}
|
|
savePresetToJson(preset_path, settings) {}
|
|
}
|
|
|
|
function getPresetSettingsHtml() {
|
|
const value_str = document.getElementById('taPresetSettings').value
|
|
const value_json = JSON.parse(value_str)
|
|
return value_json
|
|
}
|
|
function setPresetSettingsHtml(preset_settings) {
|
|
const JSONInPrettyFormat = JSON.stringify(preset_settings, undefined, 7)
|
|
preset_settings_element = document.getElementById('taPresetSettings')
|
|
preset_settings_element.value = JSONInPrettyFormat
|
|
|
|
const new_lines_count = general.countNewLines(JSONInPrettyFormat)
|
|
new_lines_count
|
|
preset_settings_element.style.height =
|
|
Math.min(new_lines_count * 12 + 100, 800).toString() + 'px'
|
|
}
|
|
|
|
function getPresetName() {
|
|
const preset_name = document.getElementById('tiPresetName').value
|
|
return preset_name
|
|
}
|
|
function setPresetName(preset_name) {
|
|
document.getElementById('tiPresetName').value = preset_name
|
|
}
|
|
|
|
function getPresetSettings(preset_type) {
|
|
let preset_settings
|
|
if (preset_type === Enum.PresetTypeEnum['SDPreset']) {
|
|
preset_settings = g_ui_settings_object.getSettings()
|
|
} else if (preset_type === Enum.PresetTypeEnum['ControlNetPreset']) {
|
|
const { getUnitsData } =
|
|
require('../../typescripts/dist/bundle').control_net // only import ControlNetUnit to avoid circular dependency
|
|
preset_settings = getUnitsData()
|
|
}
|
|
return preset_settings
|
|
}
|
|
|
|
function getPresetType() {
|
|
const presetType = document.getElementById('rgPresetType').selected
|
|
|
|
return presetType
|
|
}
|
|
|
|
document.getElementById('btnNewPreset').addEventListener('click', () => {
|
|
// const g_ui_settings_object = getUISettingsObject()
|
|
|
|
const preset_type = getPresetType()
|
|
const preset_settings = getPresetSettings(preset_type)
|
|
|
|
// const settings = g_ui_settings_object.getSettings()
|
|
|
|
setPresetSettingsHtml(preset_settings)
|
|
|
|
const preset_name = getPresetName()
|
|
setPresetNameLabel(preset_name)
|
|
})
|
|
|
|
function getPresetNameLabel() {
|
|
//use presetNameLabel as the final name for a preset
|
|
const preset_name = document.getElementById('lPresetName').textContent
|
|
return preset_name
|
|
}
|
|
function setPresetNameLabel(preset_name) {
|
|
document.getElementById('lPresetName').textContent = preset_name.trim()
|
|
}
|
|
|
|
async function populatePresetMenu() {
|
|
// presets = ['preset_1', 'preset_2', 'preset_3']
|
|
const preset_type = getPresetType()
|
|
const presets = await getAllCustomPresetsSettings(preset_type)
|
|
const presets_names = Object.keys(presets)
|
|
html_manip.populateMenu(
|
|
'mSettingTabPresetMenu',
|
|
'mPresetMenuItemClass',
|
|
presets_names,
|
|
(item, item_html_element) => {
|
|
item_html_element.innerHTML = item
|
|
}
|
|
)
|
|
}
|
|
async function deletePreset() {
|
|
try {
|
|
const preset_name = html_manip.getSelectedMenuItemTextContent(
|
|
'mSettingTabPresetMenu'
|
|
)
|
|
const preset_file_name = preset_name + '.json'
|
|
|
|
const preset_type = getPresetType()
|
|
const preset_folder_name = mapPresetTypeToPresetFolder(preset_type)
|
|
const custom_preset_entry = await io.IOFolder.getCustomPresetFolder(
|
|
preset_folder_name
|
|
)
|
|
|
|
await io.IOJson.deleteFile(custom_preset_entry, preset_file_name)
|
|
html_manip.unselectMenuItem('mSettingTabPresetMenu') // unselect the custom preset menu
|
|
setPresetSettingsHtml({}) //reset preset settings text area
|
|
setPresetName('')
|
|
setPresetNameLabel('')
|
|
await populatePresetMenu() // update the custom preset Menu
|
|
triggerUpdatePresetMenu(preset_type)
|
|
} catch (e) {
|
|
console.warn(e)
|
|
}
|
|
}
|
|
|
|
async function getCustomPresetEntries(preset_folder_name) {
|
|
const custom_preset_entry = await io.IOFolder.getCustomPresetFolder(
|
|
preset_folder_name
|
|
)
|
|
|
|
const custom_preset_entries = await io.IOJson.getJsonEntries(
|
|
custom_preset_entry
|
|
)
|
|
|
|
return custom_preset_entries
|
|
}
|
|
|
|
async function loadPresetSettingsFromFile(preset_file_name, preset_type) {
|
|
// const preset_type = getPresetType()
|
|
|
|
const preset_folder_name = mapPresetTypeToPresetFolder(preset_type)
|
|
const custom_preset_entry = await io.IOFolder.getCustomPresetFolder(
|
|
preset_folder_name
|
|
)
|
|
let preset_settings = {}
|
|
try {
|
|
preset_settings = await io.IOJson.loadJsonFromFile(
|
|
custom_preset_entry,
|
|
preset_file_name
|
|
)
|
|
} catch (e) {
|
|
console.warn(e)
|
|
}
|
|
return preset_settings
|
|
}
|
|
async function getAllCustomPresetsSettings(preset_type) {
|
|
const preset_folder_name = mapPresetTypeToPresetFolder(preset_type)
|
|
const custom_preset_entries = await getCustomPresetEntries(
|
|
preset_folder_name
|
|
)
|
|
let custom_presets = {}
|
|
for (const entry of custom_preset_entries) {
|
|
const preset_name = entry.name.split('.json')[0]
|
|
let preset_settings = await loadPresetSettingsFromFile(
|
|
entry.name,
|
|
preset_type
|
|
)
|
|
|
|
custom_presets[preset_name] = preset_settings
|
|
}
|
|
return custom_presets
|
|
}
|
|
|
|
function mapPresetTypeToPresetFolder(preset_type) {
|
|
let preset_folder
|
|
|
|
if (preset_type === Enum.PresetTypeEnum['SDPreset']) {
|
|
preset_folder = 'custom_preset'
|
|
} else if (preset_type === Enum.PresetTypeEnum['ControlNetPreset']) {
|
|
preset_folder = 'controlnet_preset'
|
|
}
|
|
return preset_folder
|
|
}
|
|
|
|
function triggerUpdatePresetMenu(preset_type) {
|
|
let menu_id
|
|
if (preset_type === Enum.PresetTypeEnum['SDPreset']) {
|
|
menu_id = '#mPresetMenu'
|
|
} else if (preset_type === Enum.PresetTypeEnum['ControlNetPreset']) {
|
|
menu_id = '#mControlNetPresetMenu'
|
|
}
|
|
event.triggerEvent(menu_id, event.updatePresetMenuEvent)
|
|
}
|
|
Array.from(document.getElementsByClassName('rbPresetType')).forEach((rb) => {
|
|
rb.addEventListener('click', async () => {
|
|
const preset_type = rb.value
|
|
await populatePresetMenu()
|
|
})
|
|
})
|
|
|
|
document.getElementById('btnSavePreset').addEventListener('click', async () => {
|
|
//save preset settings from textarea to json file
|
|
//reload the preset menu
|
|
const preset_type = getPresetType()
|
|
const custom_preset_folder_name = mapPresetTypeToPresetFolder(preset_type)
|
|
const custom_preset_entry = await io.IOFolder.getCustomPresetFolder(
|
|
custom_preset_folder_name
|
|
)
|
|
const preset_settings = getPresetSettingsHtml()
|
|
const preset_name = getPresetNameLabel()
|
|
|
|
//check if the file exist and prompt the user to override it or cancel
|
|
await io.IOJson.saveJsonToFileExe(
|
|
preset_settings,
|
|
custom_preset_entry,
|
|
preset_name + '.json'
|
|
)
|
|
await populatePresetMenu()
|
|
triggerUpdatePresetMenu(preset_type)
|
|
html_manip.selectMenuItem('mSettingTabPresetMenu', preset_name)
|
|
})
|
|
document
|
|
.getElementById('btnDeletePreset')
|
|
.addEventListener('click', async () => {
|
|
await deletePreset()
|
|
})
|
|
|
|
document.getElementById('tiPresetName').addEventListener('input', () => {
|
|
//save preset settings from textarea to json file
|
|
//reload the preset menu
|
|
const preset_name = getPresetName()
|
|
setPresetNameLabel(preset_name)
|
|
//check if the file exist and prompt the user to override it or cancel
|
|
})
|
|
document
|
|
.getElementById('mSettingTabPresetMenu')
|
|
.addEventListener('input', () => {
|
|
//Note: is this correct?! why use Input and change events together
|
|
//save preset settings from textarea to json file
|
|
//reload the preset menu
|
|
const preset_name = getPresetName()
|
|
setPresetNameLabel(preset_name)
|
|
//check if the file exist and prompt the user to override it or cancel
|
|
})
|
|
|
|
document
|
|
.getElementById('mSettingTabPresetMenu')
|
|
.addEventListener('change', async (evt) => {
|
|
try {
|
|
const preset_index = evt.target.selectedIndex
|
|
const preset_name = evt.target.options[preset_index].textContent
|
|
const preset_type = getPresetType()
|
|
setPresetName(preset_name)
|
|
setPresetNameLabel(preset_name)
|
|
|
|
const preset_settings = await loadPresetSettingsFromFile(
|
|
preset_name + '.json',
|
|
preset_type
|
|
)
|
|
setPresetSettingsHtml(preset_settings)
|
|
} catch (e) {}
|
|
})
|
|
|
|
document
|
|
.getElementById('mPresetMenu')
|
|
.addEventListener('updatePresetMenuEvent', async (event) => {
|
|
// console.log("I'm listening on a custom event")
|
|
const { populatePresetMenu } = require('../ui')
|
|
await populatePresetMenu()
|
|
})
|
|
|
|
async function initializePresetTab() {
|
|
try {
|
|
await populatePresetMenu()
|
|
|
|
const selected_rb =
|
|
html_manip.getSelectedRadioButtonElement('rbPresetType')
|
|
selected_rb.click() // to trigger the click event which will update the setting preset menu according to the preset type
|
|
} catch (e) {
|
|
console.error(e)
|
|
}
|
|
}
|
|
initializePresetTab()
|
|
module.exports = {
|
|
LatentNoiseSettings,
|
|
FillSettings,
|
|
OriginalSettings,
|
|
HealBrushSettings,
|
|
populatePresetMenu,
|
|
getCustomPresetEntries,
|
|
loadPresetSettingsFromFile,
|
|
getAllCustomPresetsSettings,
|
|
initializePresetTab,
|
|
}
|