|
import gradio as gr |
|
import modules.sd_samplers |
|
import modules.scripts as scripts |
|
from modules import shared |
|
import json |
|
import os |
|
import shutil |
|
from pprint import pprint |
|
from modules.ui import gr_show |
|
from collections import namedtuple |
|
from pathlib import Path |
|
|
|
try: |
|
import launch |
|
|
|
if not launch.is_installed("colorama"): |
|
launch.run_pip("install colorama") |
|
except: |
|
pass |
|
|
|
try: |
|
from colorama import just_fix_windows_console, Fore, Style |
|
just_fix_windows_console() |
|
except: |
|
pass |
|
|
|
update_flag = "preset_manager_update_check" |
|
|
|
additional_config_source = "additional_components.json" |
|
additional_config_target = "additional_configs.json" |
|
presets_config_source = "preset_configuration.json" |
|
presets_config_target = "presets.json" |
|
|
|
file_path = scripts.basedir() |
|
scripts_path = os.path.join(file_path, "scripts") |
|
path_to_update_flag = os.path.join(scripts_path, update_flag) |
|
is_update_available = False |
|
if os.path.exists(path_to_update_flag): |
|
is_update_available = True |
|
try: |
|
print(Fore.CYAN + "Thank you for using:" + Fore.GREEN + "https://github.com/Gerschel/sd_web_ui_preset_utils/") |
|
print(Fore.RED +""" |
|
______ _ ___ ___ |
|
| ___ \ | | | \/ | |
|
| |_/ / __ ___ ___ ___| |_ | . . | __ _ _ __ __ _ __ _ ___ _ __ |
|
| __/ '__/ _ \/ __|/ _ \ __| | |\/| |/ _` | '_ \ / _` |/ _` |/ _ \ '__| |
|
| | | | | __/\__ \ __/ |_ | | | | (_| | | | | (_| | (_| | __/ | |
|
\_| |_| \___||___/\___|\__| \_| |_/\__,_|_| |_|\__,_|\__, |\___|_| |
|
__/ | |
|
|___/ |
|
""") |
|
print(Fore.YELLOW + "By: Gerschel Payne") |
|
print(Style.RESET_ALL + "Preset Manager: Checking for pre-existing configuration files.") |
|
except NameError: |
|
print( "Thank you for using: https://github.com/Gerschel/sd_web_ui_preset_utils/") |
|
print(""" |
|
______ _ ___ ___ |
|
| ___ \ | | | \/ | |
|
| |_/ / __ ___ ___ ___| |_ | . . | __ _ _ __ __ _ __ _ ___ _ __ |
|
| __/ '__/ _ \/ __|/ _ \ __| | |\/| |/ _` | '_ \ / _` |/ _` |/ _ \ '__| |
|
| | | | | __/\__ \ __/ |_ | | | | (_| | | | | (_| | (_| | __/ | |
|
\_| |_| \___||___/\___|\__| \_| |_/\__,_|_| |_|\__,_|\__, |\___|_| |
|
__/ | |
|
|___/ |
|
""") |
|
print("By: Gerschel Payne") |
|
print("Preset Manager: Checking for pre-existing configuration files.") |
|
|
|
|
|
source_path = os.path.join(file_path, additional_config_source) |
|
target_path = os.path.join(file_path, additional_config_target) |
|
if not os.path.exists(target_path): |
|
shutil.move(source_path, target_path) |
|
print(f"Created: {additional_config_target}") |
|
else: |
|
print(f"Not writing {additional_config_target}: config exists already") |
|
|
|
source_path = os.path.join(file_path, presets_config_source) |
|
target_path = os.path.join(file_path, presets_config_target) |
|
if not os.path.exists(target_path): |
|
shutil.move(source_path, target_path) |
|
print(f"Created: {presets_config_target}") |
|
else: |
|
print(f"Not writing {presets_config_target}: config exists already") |
|
|
|
|
|
os.remove(path_to_update_flag) |
|
|
|
|
|
|
|
class PresetManager(scripts.Script): |
|
|
|
BASEDIR = scripts.basedir() |
|
|
|
def update_component_name(self, preset, oldval, newval): |
|
if preset.get(oldval) is not None: |
|
preset[newval] = preset.pop(oldval) |
|
|
|
def update_config(self): |
|
"""This is a as per need method that will change per need""" |
|
component_remap = { |
|
"Highres. fix": "Hires. fix", |
|
"Firstpass width": "Upscaler", |
|
"Firstpass height": "Upscale by", |
|
"Sampling Steps": "Sampling steps" |
|
} |
|
config = self.get_config(self.settings_file) |
|
for preset in config.values(): |
|
for old_val, new_val in component_remap.items(): |
|
self.update_component_name(preset, old_val, new_val) |
|
|
|
|
|
self.save_config(self.settings_file, config) |
|
|
|
|
|
def __init__(self, *args, **kwargs): |
|
|
|
self.compinfo = namedtuple("CompInfo", ["component", "label", "elem_id", "kwargs"]) |
|
|
|
|
|
self.settings_file = "presets.json" |
|
|
|
self.additional_settings_file = "additional_configs.json" |
|
|
|
|
|
self.additional_components_for_presets = self.get_config(self.additional_settings_file) |
|
self.available_components = [ |
|
"Prompt", |
|
"Negative prompt", |
|
"Sampling steps", |
|
"Sampling method", |
|
"Width", |
|
"Height", |
|
"Restore faces", |
|
"Tiling", |
|
"Hires. fix", |
|
"Highres. fix", |
|
"Upscaler", |
|
"Upscale by", |
|
"Hires. steps", |
|
"Resize width to", |
|
"Resize height to", |
|
"Seed", |
|
"Extra", |
|
"Variation seed", |
|
"Variation strength", |
|
"Resize seed from width", |
|
"Resize seed from height", |
|
"Firstpass width", |
|
"Firstpass height", |
|
"Denoising strength", |
|
"Batch count", |
|
"Batch size", |
|
"CFG Scale", |
|
"Script", |
|
] |
|
|
|
if is_update_available: |
|
self.update_config() |
|
|
|
|
|
self.all_components = [] |
|
|
|
|
|
PresetManager.all_presets = self.get_config(self.settings_file) |
|
|
|
|
|
self.component_map = {k: None for k in self.available_components} |
|
self.additional_components_map = {k:None for k in self.additional_components_for_presets["additionalComponents"]} |
|
self.additional_components = [x for x in self.additional_components_map] |
|
|
|
|
|
self.component_map = {**self.component_map, **self.additional_components_map} |
|
self.available_components = self.available_components + self.additional_components |
|
|
|
|
|
|
|
def fakeinit(self, *args, **kwargs): |
|
""" |
|
__init__ workaround, since some data is not available during instantiation, such as is_img2img, filename, etc. |
|
This method is called from .show(), as that's the first method ScriptRunner calls after handing some state dat (is_txt2img, is_img2img2) |
|
""" |
|
|
|
self.elm_prfx = "preset-util" |
|
|
|
|
|
|
|
|
|
|
|
if self.is_txt2img: |
|
|
|
PresetManager.txt2img_preset_dropdown = gr.Dropdown( |
|
label="Presets", |
|
choices=list(PresetManager.all_presets.keys()), |
|
render = False, |
|
elem_id=f"{self.elm_prfx}_preset_qs_dd" |
|
) |
|
|
|
PresetManager.txt2img_save_detailed_name_dropdown = gr.Dropdown(render=False, |
|
choices=PresetManager.txt2img_preset_dropdown.choices, |
|
label="Presets", |
|
elem_id=f"{self.elm_prfx}_preset_ds_dd" |
|
) |
|
|
|
|
|
PresetManager.img2img_preset_dropdown = gr.Dropdown( |
|
label="Presets", |
|
choices=list(PresetManager.all_presets.keys()), |
|
render = False, |
|
elem_id=f"{self.elm_prfx}_preset_qs_dd" |
|
) |
|
|
|
PresetManager.img2img_save_detailed_name_dropdown = gr.Dropdown(render=False, |
|
choices=PresetManager.img2img_preset_dropdown.choices, |
|
label="Presets", |
|
elem_id=f"{self.elm_prfx}_preset_ds_dd" |
|
) |
|
|
|
|
|
|
|
self.stackable_check = gr.Checkbox(value=True, label="Stackable", elem_id=f"{self.elm_prfx}_stackable_check", render=False) |
|
self.save_as = gr.Text(render=False, label="Quick Save", elem_id=f"{self.elm_prfx}_save_qs_txt") |
|
self.save_button = gr.Button(value="Save", variant="secondary", render=False, visible=False, elem_id=f"{self.elm_prfx}_save_qs_bttn") |
|
|
|
|
|
|
|
self.stackable_check_det = gr.Checkbox(value=True, label="Stackable", elem_id=f"{self.elm_prfx}_stackable_check_det", render=False) |
|
self.save_detail_md = gr.Markdown(render=False, value="<center>Options are all options hardcoded, and additional you added in additional_components.py</center>\ |
|
<center>Make your choices, adjust your settings, set a name, save. To edit a prior choice, select from dropdown and overwrite.</center>\ |
|
<center>To apply, go to quick set. Save now works immediately in other tab without restart, filters out non-common between tabs.</center>\ |
|
<center>Settings stack. If it's not checked, it wont overwrite. Apply one, then another. Reset is old, update how you need.</center>\ |
|
<center>Stackable checkbox is not used for saves, it's used when making a selection from the dropdown, whether to apply as stackable or not</center>", elem_id=f"{self.elm_prfx}_mess_qs_md") |
|
self.save_detailed_as = gr.Text(render=False, label="Detailed Save As", elem_id=f"{self.elm_prfx}_save_ds_txt") |
|
self.save_detailed_button = gr.Button(value="Save", variant="primary", render=False, visible=False, elem_id=f"{self.elm_prfx}_save_ds_bttn") |
|
self.save_detailed_delete_button = gr.Button(value="❌Delete", render=False, elem_id=f"{self.elm_prfx}_del_ds_bttn") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.gr_restart_bttn = gr.Button(value="Restart", variant="primary", render=False, elem_id=f"{self.elm_prfx}_restart_bttn") |
|
|
|
|
|
|
|
self.gather_button = gr.Button(value="Gather", render = False, variant="primary", elem_id=f"{self.elm_prfx}_gather_bttn") |
|
self.inspect_dd = gr.Dropdown(render = False, type="index", interactive=True, elem_id=f"{self.elm_prfx}_inspect_dd") |
|
self.inspect_ta = gr.TextArea(render=False, elem_id=f"{self.elm_prfx}_inspect_txt") |
|
|
|
|
|
self.info_markdown = gr.Markdown(value="<center>!⚠! THIS IS IN ALPHA !⚠!</center>\n\ |
|
<center>🐉 I WILL INTRODUCE SOME BREAKING CHANGES (I will try to avoid it) 🐉</center>\ |
|
<center>🙏 Please recommend your favorite script composers to implement element id's 🙏</center>\n\ |
|
<br>\ |
|
<center>If they implement unique element id's, they can get support for presets without making their own</center>\ |
|
<center>❗ I have not added element id support yet, there are more labels than id's ❗</center>\ |
|
<br>\ |
|
<center>❗❗But labels sometimes collide. I can't do 'Mask Blur' because it also matches 'Mask Blur' in scripts❗❗</center>\ |
|
<center>Try adding a component label to additional_components.json with element id 'null' without quotes for None</center>\ |
|
<br>\ |
|
<center><strong>I would like to support all custom scripts, but need script path/name/title, some distinguishing factor</strong></center>\ |
|
<center>through the kwargs in IOComponent_init 'after_compoenet' and 'before_component'</center>\ |
|
<center><link>https://github.com/Gerschel/sd_web_ui_preset_utils</link></center>", render=False) |
|
|
|
|
|
def title(self): |
|
return "Presets" |
|
|
|
def show(self, is_img2img): |
|
self.fakeinit() |
|
return True |
|
if self.ui_first == "sampler": |
|
if shared.opts.samplers_in_dropdown: |
|
self.before_component_label = "Sampling method" |
|
else: |
|
self.before_component_label = "Sampling Steps" |
|
return True |
|
else: |
|
self.before_component_label = self.positon_manager |
|
return True |
|
|
|
def before_component(self, component, **kwargs): |
|
pass |
|
def _before_component(self, component, **kwargs): |
|
|
|
|
|
|
|
|
|
with gr.Accordion(label="Preset Manager", open = False, elem_id=f"{'txt2img' if self.is_txt2img else 'img2img'}_preset_manager_accordion"): |
|
|
|
with gr.Tab(label="Quick"): |
|
with gr.Row(equal_height = True): |
|
if self.is_txt2img: |
|
PresetManager.txt2img_preset_dropdown.render() |
|
else: |
|
PresetManager.img2img_preset_dropdown.render() |
|
with gr.Column(elem_id=f"{self.elm_prfx}_ref_del_col_qs"): |
|
self.stackable_check.render() |
|
with gr.Row(): |
|
with gr.Column(scale=12): |
|
self.save_as.render() |
|
with gr.Column(scale=1): |
|
self.save_button.render() |
|
|
|
|
|
with gr.Tab(label="Detailed"): |
|
with gr.Accordion(label="Basic info", open=False): |
|
self.save_detail_md.render() |
|
with gr.Column(scale=1): |
|
with gr.Row(equal_height = True): |
|
if self.is_txt2img: |
|
PresetManager.txt2img_save_detailed_name_dropdown.render() |
|
else: |
|
PresetManager.img2img_save_detailed_name_dropdown.render() |
|
with gr.Column(elem_id=f"{self.elm_prfx}_ref_del_col_ds"): |
|
self.save_detailed_delete_button.render() |
|
self.stackable_check_det.render() |
|
with gr.Row(): |
|
with gr.Column(scale=12): |
|
self.save_detailed_as.render() |
|
with gr.Column(scale=1): |
|
self.save_detailed_button.render() |
|
with gr.Column(scale=1) as detailed_check: |
|
self.detailed_check = detailed_check |
|
|
|
|
|
|
|
with gr.Tab(label="Restart"): |
|
self.gr_restart_bttn.render() |
|
|
|
|
|
with gr.Tab(label = "Print"): |
|
self.gather_button.render() |
|
self.inspect_dd.render() |
|
self.inspect_ta.render() |
|
|
|
|
|
with gr.Tab(label="Info"): |
|
self.info_markdown.render() |
|
|
|
|
|
def after_component(self, component, **kwargs): |
|
if hasattr(component, "label") or hasattr(component, "elem_id"): |
|
self.all_components.append(self.compinfo( |
|
component=component, |
|
label=component.label if hasattr(component, "label") else None, |
|
elem_id=component.elem_id if hasattr(component, "elem_id") else None, |
|
kwargs=kwargs |
|
) |
|
) |
|
label = kwargs.get("label") |
|
ele = kwargs.get("elem_id") |
|
|
|
|
|
if label in self.component_map: |
|
self.component_map.update({component.label: component}) |
|
|
|
|
|
if ele == "txt2img_generation_info_button" or ele == "img2img_generation_info_button": |
|
self._before_component("") |
|
self.save_detailed_checkbox_group = gr.CheckboxGroup(render=False, choices=list(x for x in self.available_components if self.component_map[x] is not None), elem_id=f"{self.elm_prfx}_select_ds_chckgrp", label="This preset affects?") |
|
with self.detailed_check: |
|
self.save_detailed_checkbox_group.render() |
|
self._ui() |
|
|
|
def ui(self, *args): |
|
pass |
|
|
|
def _ui(self): |
|
|
|
|
|
|
|
if self.is_txt2img: |
|
|
|
PresetManager.txt2img_preset_dropdown.change( |
|
fn=self.fetch_valid_values_from_preset, |
|
inputs=[self.stackable_check, PresetManager.txt2img_preset_dropdown] + [self.component_map[comp_name] for comp_name in list(x for x in self.available_components if self.component_map[x] is not None)], |
|
outputs=[self.component_map[comp_name] for comp_name in list(x for x in self.available_components if self.component_map[x] is not None)], |
|
) |
|
|
|
PresetManager.txt2img_save_detailed_name_dropdown.change( |
|
fn = self.save_detailed_fetch_valid_values_from_preset, |
|
inputs = [self.stackable_check_det, PresetManager.txt2img_save_detailed_name_dropdown] + [self.component_map[comp_name] for comp_name in list(x for x in self.available_components if self.component_map[x] is not None)], |
|
outputs = [self.save_detailed_checkbox_group, self.save_detailed_as] + [self.component_map[comp_name] for comp_name in list(x for x in self.available_components if self.component_map[x] is not None)], |
|
) |
|
else: |
|
|
|
PresetManager.img2img_preset_dropdown.change( |
|
fn=self.fetch_valid_values_from_preset, |
|
inputs=[self.stackable_check, PresetManager.img2img_preset_dropdown] + [self.component_map[comp_name] for comp_name in list(x for x in self.available_components if self.component_map[x] is not None)], |
|
outputs=[self.component_map[comp_name] for comp_name in list(x for x in self.available_components if self.component_map[x] is not None)], |
|
) |
|
|
|
PresetManager.img2img_save_detailed_name_dropdown.change( |
|
fn = self.save_detailed_fetch_valid_values_from_preset, |
|
inputs = [self.stackable_check_det, PresetManager.img2img_save_detailed_name_dropdown] + [self.component_map[comp_name] for comp_name in list(x for x in self.available_components if self.component_map[x] is not None)], |
|
outputs = [self.save_detailed_checkbox_group, self.save_detailed_as] + [self.component_map[comp_name] for comp_name in list(x for x in self.available_components if self.component_map[x] is not None)], |
|
) |
|
|
|
|
|
|
|
self.save_button.click( |
|
fn = self.wrapper_save_config(path=self.settings_file), |
|
inputs = [self.save_as] + [self.component_map[comp_name] for comp_name in list(x for x in self.available_components if self.component_map[x] is not None)], |
|
outputs = [self.save_as, PresetManager.txt2img_preset_dropdown, PresetManager.img2img_preset_dropdown, PresetManager.txt2img_save_detailed_name_dropdown, PresetManager.img2img_save_detailed_name_dropdown] |
|
|
|
) |
|
|
|
self.save_detailed_button.click( |
|
fn = self.save_detailed_config(path=self.settings_file), |
|
|
|
inputs = [self.save_detailed_as , self.save_detailed_checkbox_group] + [self.component_map[comp_name] for comp_name in list(x for x in self.available_components if self.component_map[x] is not None)], |
|
outputs = [self.save_detailed_as, PresetManager.txt2img_save_detailed_name_dropdown, PresetManager.img2img_save_detailed_name_dropdown, PresetManager.txt2img_preset_dropdown, PresetManager.img2img_preset_dropdown] |
|
|
|
) |
|
self.save_detailed_delete_button.click( |
|
fn = lambda x: self.delete_preset(x, self.settings_file), |
|
inputs = PresetManager.txt2img_save_detailed_name_dropdown if self.is_txt2img else PresetManager.img2img_save_detailed_name_dropdown, |
|
outputs = [PresetManager.txt2img_preset_dropdown, PresetManager.img2img_preset_dropdown, PresetManager.txt2img_save_detailed_name_dropdown, PresetManager.img2img_save_detailed_name_dropdown] |
|
) |
|
|
|
|
|
|
|
|
|
self.save_as.change( |
|
fn = lambda x: gr.update(variant = "primary" if bool(x) else "secondary", visible = bool(x)), |
|
inputs = self.save_as, |
|
outputs = self.save_button |
|
) |
|
|
|
|
|
self.save_detailed_as.change( |
|
fn = lambda x: gr.update(visible = bool(x)), |
|
inputs = self.save_detailed_as, |
|
outputs = self.save_detailed_button |
|
) |
|
|
|
self.gr_restart_bttn.click(fn=self.local_request_restart, _js='restart_reload', inputs=[], outputs=[]) |
|
|
|
|
|
self.gather_button.click( |
|
fn = self.f_b_syncer, |
|
outputs=[self.inspect_dd, self.gather_button] |
|
) |
|
self.inspect_dd.change( |
|
fn = lambda x: self.inspection_formatter(x), |
|
inputs = self.inspect_dd, |
|
outputs = self.inspect_ta, |
|
) |
|
|
|
|
|
def f_b_syncer(self): |
|
""" |
|
?Front/Backend synchronizer? |
|
Not knowing what else to call it, simple idea, rough to figure out. When updating choices on the front-end, back-end isn't updated, make them both match |
|
https://github.com/gradio-app/gradio/discussions/2848 |
|
""" |
|
self.inspect_dd.choices = [str(x) for x in self.all_components] |
|
return [gr.update(choices=[str(x) for x in self.all_components]), gr.Button.update(visible=False)] |
|
|
|
|
|
def inspection_formatter(self, x): |
|
comp = self.all_components[x] |
|
text = f"Component Label: {comp.label}\nElement ID: {comp.elem_id}\nComponent: {comp.component}\nAll Info Handed Down: {comp.kwargs}" |
|
return text |
|
|
|
|
|
def run(self, p, *args): |
|
pass |
|
|
|
|
|
def wrapper_save_config(self, path): |
|
""" |
|
Helper function to utilize closure |
|
""" |
|
|
|
def func(setting_name, *new_setting): |
|
""" |
|
Formats setting and overwrites file |
|
input: setting_name is text autoformatted from clicks input |
|
new_settings is a tuple (by using packing) of formatted text, outputs from |
|
click method must be in same order of labels |
|
""" |
|
|
|
try: |
|
return_dict = {} |
|
|
|
for i,k in enumerate(x for x in self.component_map if self.component_map[x] is not None): |
|
if k != "Sampling method" and not hasattr(self.component_map[k], "type"): |
|
return_dict.update({k: new_setting[i]}) |
|
elif k == "Sampling method": |
|
return_dict.update({k: modules.sd_samplers.samplers[new_setting[i]].name if self.is_txt2img else modules.sd_samplers.samplers_for_img2img[new_setting[i]].name}) |
|
elif self.component_map[k].type == "index": |
|
return_dict.update({k: self.component_map[k].choices[new_setting[i]]}) |
|
else: |
|
return_dict.update({k: new_setting[i]}) |
|
new_setting = return_dict |
|
|
|
except IndexError as e: |
|
print(f"IndexError : {e}\n\ |
|
Length: {len(new_setting)}\tvalue: {new_setting}\n\ |
|
Length: {len(self.component_map)}\t keys: {list(self.component_map.keys())}\n\ |
|
\tvalues: {list(self.component_map.values())}\n\ |
|
Length: {len(self.available_components)}\t keys: {self.available_components}") |
|
|
|
file = os.path.join(PresetManager.BASEDIR, path) |
|
PresetManager.all_presets.update({setting_name : new_setting}) |
|
|
|
with open(file, "w") as f: |
|
json.dump(PresetManager.all_presets, f, indent=4) |
|
|
|
return [gr.update(value=""), gr.update(choices = list(PresetManager.all_presets.keys())), gr.update(choices = list(PresetManager.all_presets.keys())), gr.update(choices = list(PresetManager.all_presets.keys())), gr.update(choices = list(PresetManager.all_presets.keys()))] |
|
return func |
|
|
|
|
|
def save_detailed_config(self, path): |
|
""" |
|
Helper function to utilize closure |
|
""" |
|
|
|
|
|
def func(setting_name, *new_setting): |
|
""" |
|
Formats setting and overwrites file |
|
input: setting_name is text autoformatted from clicks input |
|
new_settings is a tuple (by using packing) of formatted text, outputs from |
|
click method must be in same order of labels |
|
""" |
|
|
|
checkbox_items = new_setting[0] |
|
checkbox_items = [x for x in checkbox_items if x in list(x for x in self.available_components if self.component_map[x] is not None)] |
|
items = [y for y in list(zip(new_setting[1:], list(x for x in self.component_map.items() if x[1] is not None))) if y[1][0] in checkbox_items] |
|
|
|
try: |
|
return_dict = {} |
|
|
|
for e in items: |
|
if e[1][0] != "Sampling method" and not hasattr(e[1][1], "type"): |
|
return_dict.update({e[1][0]: e[0]}) |
|
elif e[1][0] == "Sampling method": |
|
return_dict.update({e[1][0]: modules.sd_samplers.samplers[e[0]].name if self.is_txt2img else modules.sd_samplers.samplers_for_img2img[e[0]].name}) |
|
elif e[1][1].type == "index": |
|
return_dict.update({e[1][0]: e[1][1].choices[e[0]]}) |
|
else: |
|
return_dict.update({e[1][0]: e[0]}) |
|
new_setting = return_dict |
|
|
|
except IndexError as e: |
|
print(f"IndexError : {e}\n\ |
|
Length: {len(new_setting)}\tvalue: {new_setting}\n\ |
|
Length: {len(self.component_map)}\t keys: {list(self.component_map.keys())}\n\ |
|
\tvalues: {list(self.component_map.values())}\n\ |
|
Length: {len(self.available_components)}\t keys: {self.available_components}") |
|
|
|
file = os.path.join(PresetManager.BASEDIR, path) |
|
PresetManager.all_presets.update({setting_name : new_setting}) |
|
|
|
with open(file, "w") as f: |
|
json.dump(PresetManager.all_presets, f, indent=4) |
|
|
|
return [gr.update(value=""), gr.update(choices = list(PresetManager.all_presets.keys())), gr.update(choices = list(PresetManager.all_presets.keys())), gr.update(choices = list(PresetManager.all_presets.keys())), gr.update(choices = list(PresetManager.all_presets.keys()))] |
|
return func |
|
|
|
def save_config(self, path, data=None, open_mode='w'): |
|
file = os.path.join(PresetManager.BASEDIR, path) |
|
try: |
|
with open(file, "w") as f: |
|
json.dump(data if data else PresetManager.all_presets, f, indent=4) |
|
except FileNotFoundError as e: |
|
print(f"{e}\n{file} not found, check if it exists or if you have moved it.") |
|
|
|
|
|
def get_config(self, path, open_mode='r'): |
|
file = os.path.join(PresetManager.BASEDIR, path) |
|
try: |
|
with open(file, open_mode) as f: |
|
as_dict = json.load(f) |
|
except FileNotFoundError as e: |
|
print(f"{e}\n{file} not found, check if it exists or if you have moved it.") |
|
return as_dict |
|
|
|
|
|
def fetch_valid_values_from_preset(self,stackable_flag, selection, *comps_vals): |
|
""" |
|
Fetches selected preset from dropdown choice and filters valid components from choosen preset |
|
non-valid components will still have None as the page didn't contain any |
|
""" |
|
if stackable_flag: |
|
|
|
return [ |
|
PresetManager.all_presets[selection][comp_name] |
|
if (comp_name in PresetManager.all_presets[selection] |
|
and ( |
|
True if not hasattr(self.component_map[comp_name], "choices") |
|
else |
|
True if PresetManager.all_presets[selection][comp_name] in self.component_map[comp_name].choices |
|
else False |
|
) |
|
) |
|
else |
|
comps_vals[i] |
|
if not hasattr(self.component_map[comp_name], "choices") |
|
else self.component_map[comp_name].choices[comps_vals[i]] |
|
if type(comps_vals[i]) == int |
|
else self.component_map[comp_name].choices[self.component_map[comp_name].choices.index(comps_vals[i])] |
|
for i, comp_name in enumerate(list(x for x in self.available_components if self.component_map[x] is not None and hasattr(self.component_map[x], "value")))] |
|
else: |
|
return [ |
|
PresetManager.all_presets[selection][comp_name] |
|
if (comp_name in PresetManager.all_presets[selection] |
|
and ( |
|
True if not hasattr(self.component_map[comp_name], "choices") |
|
else |
|
True if PresetManager.all_presets[selection][comp_name] in self.component_map[comp_name].choices |
|
else False |
|
) |
|
) |
|
else |
|
self.component_map[comp_name].value |
|
for i, comp_name in enumerate(list(x for x in self.available_components if self.component_map[x] is not None and hasattr(self.component_map[x], "value")))] |
|
|
|
|
|
def save_detailed_fetch_valid_values_from_preset(self, stackable_flag, selection, *comps_vals): |
|
""" |
|
Fetches selected preset from dropdown choice and filters valid components from choosen preset |
|
non-valid components will still have None as the page didn't contain any |
|
""" |
|
return [[ comp_name for comp_name in PresetManager.all_presets[selection] ], gr.update(value = selection)] + self.fetch_valid_values_from_preset(stackable_flag, selection, *comps_vals) |
|
|
|
def delete_preset(self, selection, filepath): |
|
"""Delete preset from local memory and write file with it removed |
|
filepath is not hardcoded so it can be used with other preset profiles if support gets added for loading additional presets from shares |
|
""" |
|
|
|
PresetManager.all_presets.pop(selection) |
|
|
|
PresetManager.txt2img_preset_dropdown.choice = PresetManager.all_presets.keys() |
|
PresetManager.img2img_preset_dropdown.choice = PresetManager.all_presets.keys() |
|
PresetManager.txt2img_save_detailed_name_dropdown.choice = PresetManager.all_presets.keys() |
|
PresetManager.img2img_save_detailed_name_dropdown.choice = PresetManager.all_presets.keys() |
|
file = os.path.join(PresetManager.BASEDIR, filepath) |
|
with open(file, 'w') as f: |
|
json.dump(PresetManager.all_presets, f, indent=4) |
|
return [gr.Dropdown.update(choices= list(PresetManager.all_presets.keys()), value=list(PresetManager.all_presets.keys())[0])] * 4 |
|
|
|
def local_request_restart(self): |
|
"Restart button" |
|
shared.state.interrupt() |
|
shared.state.need_restart = True |
|
|
|
|