mirror of
https://github.com/Zyin055/Config-Presets.git
synced 2026-05-01 03:31:24 +00:00
Merge branch 'save-and-delete-functionality'
This commit is contained in:
@@ -1,10 +1,15 @@
|
|||||||
//add tooltip by piggybacking off of javascript/hints.js
|
//add tooltip by piggybacking off of javascript/hints.js
|
||||||
//titles["Edit..."] = "[Config Presets] open config.json"
|
//titles["Add/Remove..."] = "[Config Presets] Add or remove a preset"
|
||||||
|
|
||||||
//or do it our more precise way
|
//or do it our more precise way
|
||||||
onUiUpdate(function() {
|
onUiUpdate(function() {
|
||||||
//set tooltips
|
//set tooltips
|
||||||
gradioApp().querySelectorAll("#config_presets_open_config_file_button").forEach(el => el.setAttribute("title", "[Config Presets] open config.json, requires Gradio restart after editing"))
|
gradioApp().querySelectorAll("#config_presets_open_config_file_button").forEach(el => el.setAttribute("title", "Open the config.json file for manual editing if you want to make changes that way, requires Gradio restart after editing"))
|
||||||
|
gradioApp().querySelectorAll("#config_preset_save_textbox").forEach(el => el.setAttribute("title", "The label that will be displayed in the dropdown to the left"))
|
||||||
|
gradioApp().querySelectorAll("#config_preset_save_button").forEach(el => el.setAttribute("title", "Saves current settings with the new preset name. Overwrites existing preset. This will save: Steps, Sampler, Width/Height, Highres fix, Firstpass width/height, Denoising strength, Batch size, CFG Scale."))
|
||||||
|
gradioApp().querySelectorAll("#config_preset_add_button").forEach(el => el.setAttribute("title", "[Config Presets] Create or delete a preset"))
|
||||||
|
gradioApp().querySelectorAll("#config_preset_cancel_save_button").forEach(el => el.setAttribute("title", "Go back"))
|
||||||
|
gradioApp().querySelectorAll("#config_preset_trash_button").forEach(el => el.setAttribute("title", "Permanently delete selected preset"))
|
||||||
})
|
})
|
||||||
|
|
||||||
//change() event called by config_preset_dropdown in config_presets.py
|
//change() event called by config_preset_dropdown in config_presets.py
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import modules.scripts as scripts
|
import modules.scripts as scripts
|
||||||
|
import modules.sd_samplers
|
||||||
import gradio as gr
|
import gradio as gr
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
@@ -6,7 +7,8 @@ import platform
|
|||||||
import subprocess as sp
|
import subprocess as sp
|
||||||
|
|
||||||
|
|
||||||
basedir = scripts.basedir() #C:\Stable Diffusion\extensions\Config-Presets needs to be set in global space to get the extra 'extensions\Config-Presets' path
|
BASEDIR = scripts.basedir() #C:\Stable Diffusion\extensions\Config-Presets needs to be set in global space to get the extra 'extensions\Config-Presets' path
|
||||||
|
CONFIG_FILE_NAME = "config.json"
|
||||||
|
|
||||||
|
|
||||||
class Script(scripts.Script):
|
class Script(scripts.Script):
|
||||||
@@ -14,26 +16,28 @@ class Script(scripts.Script):
|
|||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
#self.basedir = scripts.basedir() #C:\Stable Diffusion #use at global instead to get the extra 'extensions\Config-Presets' path.
|
# These are the settings from the UI that are saved for each preset
|
||||||
|
# First value is the component label, second value is the internal name which is kept for legacy version support
|
||||||
|
self.component_labels = { # mirrors the config_preset_dropdown.change(output) events and config_preset_dropdown_change()
|
||||||
|
"Sampling Steps": {"internal_name": "steps", "not_used_in_img2img": False},
|
||||||
|
"Sampling method": {"internal_name": "sampler_index", "not_used_in_img2img": False},
|
||||||
|
"Width": {"internal_name": "width", "not_used_in_img2img": False},
|
||||||
|
"Height": {"internal_name": "height", "not_used_in_img2img": False},
|
||||||
|
"Highres. fix": {"internal_name": "enable_hr", "not_used_in_img2img": True},
|
||||||
|
"Firstpass width": {"internal_name": "firstphase_width", "not_used_in_img2img": True},
|
||||||
|
"Firstpass height": {"internal_name": "firstphase_height", "not_used_in_img2img": True},
|
||||||
|
"Denoising strength": {"internal_name": "denoising_strength", "not_used_in_img2img": False},
|
||||||
|
"Batch count": {"internal_name": "batch_count", "not_used_in_img2img": False},
|
||||||
|
"Batch size": {"internal_name": "batch_size", "not_used_in_img2img": False},
|
||||||
|
"CFG Scale": {"internal_name": "cfg_scale", "not_used_in_img2img": False},
|
||||||
|
}
|
||||||
|
|
||||||
component_labels = [
|
# Mapping between component labels and the actual components in ui.py
|
||||||
"Sampling Steps",
|
self.component_map = {k: None for k in self.component_labels} # gets filled up in the after_component() method
|
||||||
"Sampling method",
|
|
||||||
"Width",
|
|
||||||
"Height",
|
|
||||||
"Highres. fix",
|
|
||||||
"Firstpass width",
|
|
||||||
"Firstpass height",
|
|
||||||
"Denoising strength",
|
|
||||||
"Batch count",
|
|
||||||
"Batch size",
|
|
||||||
"CFG Scale",
|
|
||||||
]
|
|
||||||
self.component_map = {k: None for k in component_labels} # gets filled up in after_component()
|
|
||||||
|
|
||||||
# Load config from file
|
# Load config file
|
||||||
try:
|
try:
|
||||||
with open(f"{basedir}/config.json") as file:
|
with open(f"{BASEDIR}/{CONFIG_FILE_NAME}") as file:
|
||||||
self.config_presets = json.load(file)
|
self.config_presets = json.load(file)
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
# Config file not found
|
# Config file not found
|
||||||
@@ -41,7 +45,7 @@ class Script(scripts.Script):
|
|||||||
self.config_presets = {
|
self.config_presets = {
|
||||||
"Default": {
|
"Default": {
|
||||||
},
|
},
|
||||||
"Low quality ------ 512x512, steps: 10, batch size: 8, DPM++ 2M Karras" : {
|
"Low quality ------ 512x512, steps: 10, batch size: 8, DPM++ 2M Karras": {
|
||||||
"steps": 10,
|
"steps": 10,
|
||||||
"sampler_index": "DPM++ 2M Karras",
|
"sampler_index": "DPM++ 2M Karras",
|
||||||
"width": 512,
|
"width": 512,
|
||||||
@@ -50,7 +54,7 @@ class Script(scripts.Script):
|
|||||||
"batch_size": 8,
|
"batch_size": 8,
|
||||||
"cfg_scale": 7
|
"cfg_scale": 7
|
||||||
},
|
},
|
||||||
"Medium quality - 512x512, steps: 20, batch size: 8, DPM++ 2S a Karras" : {
|
"Medium quality - 512x512, steps: 20, batch size: 8, DPM++ 2S a Karras": {
|
||||||
"steps": 20,
|
"steps": 20,
|
||||||
"sampler_index": "DPM++ 2S a Karras",
|
"sampler_index": "DPM++ 2S a Karras",
|
||||||
"width": 512,
|
"width": 512,
|
||||||
@@ -59,7 +63,7 @@ class Script(scripts.Script):
|
|||||||
"batch_size": 8,
|
"batch_size": 8,
|
||||||
"cfg_scale": 7
|
"cfg_scale": 7
|
||||||
},
|
},
|
||||||
"High quality ------ 512x512, steps: 40, batch size: 8, DPM++ 2S a Karras" : {
|
"High quality ------ 512x512, steps: 40, batch size: 8, DPM++ 2S a Karras": {
|
||||||
"steps": 40,
|
"steps": 40,
|
||||||
"sampler_index": "DPM++ 2S a Karras",
|
"sampler_index": "DPM++ 2S a Karras",
|
||||||
"width": 512,
|
"width": 512,
|
||||||
@@ -68,7 +72,7 @@ class Script(scripts.Script):
|
|||||||
"batch_size": 8,
|
"batch_size": 8,
|
||||||
"cfg_scale": 7
|
"cfg_scale": 7
|
||||||
},
|
},
|
||||||
"High res -------- 1024x1024, steps: 30, batch size: 1, DPM++ 2M Karras, [Highres fix: 512x512, Denoising: 0.4]" : {
|
"High res -------- 1024x1024, steps: 30, batch size: 1, DPM++ 2M Karras, [Highres fix: 512x512, Denoising: 0.4]": {
|
||||||
"steps": 30,
|
"steps": 30,
|
||||||
"sampler_index": "DPM++ 2M Karras",
|
"sampler_index": "DPM++ 2M Karras",
|
||||||
"width": 1024,
|
"width": 1024,
|
||||||
@@ -81,7 +85,7 @@ class Script(scripts.Script):
|
|||||||
"batch_size": 1,
|
"batch_size": 1,
|
||||||
"cfg_scale": 7
|
"cfg_scale": 7
|
||||||
},
|
},
|
||||||
"Wallpaper ----- 1920x1088, steps: 30, batch size: 1, DPM++ 2M Karras, [Highres fix: 768x448, Denoising: 0.3]" : {
|
"Wallpaper ----- 1920x1088, steps: 30, batch size: 1, DPM++ 2M Karras, [Highres fix: 768x448, Denoising: 0.3]": {
|
||||||
"steps": 30,
|
"steps": 30,
|
||||||
"sampler_index": "DPM++ 2M Karras",
|
"sampler_index": "DPM++ 2M Karras",
|
||||||
"width": 1920,
|
"width": 1920,
|
||||||
@@ -95,10 +99,10 @@ class Script(scripts.Script):
|
|||||||
"cfg_scale": 7
|
"cfg_scale": 7
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
json_object = json.dumps(self.config_presets, indent=4)
|
|
||||||
with open(f"{basedir}/config.json", "w") as outfile:
|
self.write_config_presets_to_file()
|
||||||
outfile.write(json_object)
|
print(f"Config Presets: Config file not found, created default config at {BASEDIR}/{CONFIG_FILE_NAME}")
|
||||||
print(f"Config Presets: Config file not found, created default config at {basedir}/config.json")
|
|
||||||
|
|
||||||
def title(self):
|
def title(self):
|
||||||
return "Config Presets"
|
return "Config Presets"
|
||||||
@@ -109,7 +113,6 @@ class Script(scripts.Script):
|
|||||||
|
|
||||||
def after_component(self, component, **kwargs):
|
def after_component(self, component, **kwargs):
|
||||||
|
|
||||||
|
|
||||||
if component.label in self.component_map:
|
if component.label in self.component_map:
|
||||||
self.component_map[component.label] = component
|
self.component_map[component.label] = component
|
||||||
#print(f"DEBUG: found component: {component} {component.label}")
|
#print(f"DEBUG: found component: {component} {component.label}")
|
||||||
@@ -122,120 +125,261 @@ class Script(scripts.Script):
|
|||||||
preset_values.append(k)
|
preset_values.append(k)
|
||||||
#print(f"Config Presets: added \"{k}\"")
|
#print(f"Config Presets: added \"{k}\"")
|
||||||
|
|
||||||
with gr.Column(scale=9):
|
|
||||||
def config_preset_dropdown_change(dropdown_value):
|
|
||||||
config_preset = self.config_presets[dropdown_value]
|
|
||||||
print(f"Config Presets: changed to {dropdown_value}")
|
|
||||||
|
|
||||||
if self.component_map["Highres. fix"]:
|
with gr.Column(min_width=600): # pushes our stuff onto a new row at 1080p screen resolution
|
||||||
# if we are txt2img highres fix has a component
|
with gr.Row():
|
||||||
return (config_preset["steps"] if "steps" in config_preset else self.component_map["Sampling Steps"].value,
|
with gr.Column(scale=8, min_width=100) as dropdown_column:
|
||||||
config_preset["sampler_index"] if "sampler_index" in config_preset else self.component_map["Sampling method"].value,
|
def config_preset_dropdown_change(dropdown_value):
|
||||||
config_preset["width"] if "width" in config_preset else self.component_map["Width"].value,
|
config_preset = self.config_presets[dropdown_value]
|
||||||
config_preset["height"] if "height" in config_preset else self.component_map["Height"].value,
|
print(f"Config Presets: changed to {dropdown_value}")
|
||||||
config_preset["enable_hr"] if "enable_hr" in config_preset else self.component_map["Highres. fix"].value,
|
|
||||||
config_preset["firstphase_width"] if "firstphase_width" in config_preset else self.component_map["Firstpass width"].value,
|
if self.is_txt2img:
|
||||||
config_preset["firstphase_height"] if "firstphase_height" in config_preset else self.component_map["Firstpass height"].value,
|
# if we are txt2img highres fix has a component
|
||||||
config_preset["denoising_strength"] if "denoising_strength" in config_preset else self.component_map["Denoising strength"].value,
|
return (config_preset["steps"] if "steps" in config_preset else self.component_map["Sampling Steps"].value,
|
||||||
config_preset["batch_count"] if "batch_count" in config_preset else self.component_map["Batch count"].value,
|
config_preset["sampler_index"] if "sampler_index" in config_preset else self.component_map["Sampling method"].value,
|
||||||
config_preset["batch_size"] if "batch_size" in config_preset else self.component_map["Batch size"].value,
|
config_preset["width"] if "width" in config_preset else self.component_map["Width"].value,
|
||||||
config_preset["cfg_scale"] if "cfg_scale" in config_preset else self.component_map["CFG Scale"].value,
|
config_preset["height"] if "height" in config_preset else self.component_map["Height"].value,
|
||||||
)
|
config_preset["enable_hr"] if "enable_hr" in config_preset else self.component_map["Highres. fix"].value,
|
||||||
|
config_preset["firstphase_width"] if "firstphase_width" in config_preset else self.component_map["Firstpass width"].value,
|
||||||
else:
|
config_preset["firstphase_height"] if "firstphase_height" in config_preset else self.component_map["Firstpass height"].value,
|
||||||
# if we are img2img highres fix component is empty
|
config_preset["denoising_strength"] if "denoising_strength" in config_preset else self.component_map["Denoising strength"].value,
|
||||||
return (config_preset["steps"] if "steps" in config_preset else self.component_map["Sampling Steps"].value,
|
config_preset["batch_count"] if "batch_count" in config_preset else self.component_map["Batch count"].value,
|
||||||
config_preset["sampler_index"] if "sampler_index" in config_preset else self.component_map["Sampling method"].value,
|
config_preset["batch_size"] if "batch_size" in config_preset else self.component_map["Batch size"].value,
|
||||||
config_preset["width"] if "width" in config_preset else self.component_map["Width"].value,
|
config_preset["cfg_scale"] if "cfg_scale" in config_preset else self.component_map["CFG Scale"].value,
|
||||||
config_preset["height"] if "height" in config_preset else self.component_map["Height"].value,
|
)
|
||||||
#config_preset["enable_hr"] if "enable_hr" in config_preset else self.component_map["Highres. fix"].value,
|
|
||||||
#config_preset["firstphase_width"] if "firstphase_width" in config_preset else self.component_map["Firstpass width"].value,
|
else:
|
||||||
#config_preset["firstphase_height"] if "firstphase_height" in config_preset else self.component_map["Firstpass height"].value,
|
# if we are img2img highres fix component is empty
|
||||||
config_preset["denoising_strength"] if "denoising_strength" in config_preset else self.component_map["Denoising strength"].value,
|
return (config_preset["steps"] if "steps" in config_preset else self.component_map["Sampling Steps"].value,
|
||||||
config_preset["batch_count"] if "batch_count" in config_preset else self.component_map["Batch count"].value,
|
config_preset["sampler_index"] if "sampler_index" in config_preset else self.component_map["Sampling method"].value,
|
||||||
config_preset["batch_size"] if "batch_size" in config_preset else self.component_map["Batch size"].value,
|
config_preset["width"] if "width" in config_preset else self.component_map["Width"].value,
|
||||||
config_preset["cfg_scale"] if "cfg_scale" in config_preset else self.component_map["CFG Scale"].value,
|
config_preset["height"] if "height" in config_preset else self.component_map["Height"].value,
|
||||||
)
|
#config_preset["enable_hr"] if "enable_hr" in config_preset else self.component_map["Highres. fix"].value,
|
||||||
|
#config_preset["firstphase_width"] if "firstphase_width" in config_preset else self.component_map["Firstpass width"].value,
|
||||||
|
#config_preset["firstphase_height"] if "firstphase_height" in config_preset else self.component_map["Firstpass height"].value,
|
||||||
|
config_preset["denoising_strength"] if "denoising_strength" in config_preset else self.component_map["Denoising strength"].value,
|
||||||
|
config_preset["batch_count"] if "batch_count" in config_preset else self.component_map["Batch count"].value,
|
||||||
|
config_preset["batch_size"] if "batch_size" in config_preset else self.component_map["Batch size"].value,
|
||||||
|
config_preset["cfg_scale"] if "cfg_scale" in config_preset else self.component_map["CFG Scale"].value,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
config_preset_dropdown = gr.Dropdown(
|
config_preset_dropdown = gr.Dropdown(
|
||||||
label="Config Presets",
|
label="Config Presets",
|
||||||
choices=preset_values,
|
choices=preset_values,
|
||||||
elem_id="config_preset_dropdown",
|
elem_id="config_preset_dropdown",
|
||||||
)
|
|
||||||
config_preset_dropdown.style(container=False) #set to True to give it a white box to sit in
|
|
||||||
if self.component_map["Highres. fix"]:
|
|
||||||
config_preset_dropdown.change(
|
|
||||||
fn=config_preset_dropdown_change,
|
|
||||||
show_progress=False,
|
|
||||||
inputs=[config_preset_dropdown],
|
|
||||||
#outputs=[ui_steps, ui_sampler_index, ui_width, ui_height, ui_enable_hr, ui_denoising_strength, ui_batch_count, ui_batch_size, ui_cfg_scale],
|
|
||||||
outputs=[self.component_map["Sampling Steps"],
|
|
||||||
self.component_map["Sampling method"],
|
|
||||||
self.component_map["Width"],
|
|
||||||
self.component_map["Height"],
|
|
||||||
self.component_map["Highres. fix"],
|
|
||||||
self.component_map["Firstpass width"],
|
|
||||||
self.component_map["Firstpass height"],
|
|
||||||
self.component_map["Denoising strength"],
|
|
||||||
self.component_map["Batch count"],
|
|
||||||
self.component_map["Batch size"],
|
|
||||||
self.component_map["CFG Scale"]]
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
config_preset_dropdown.change(
|
|
||||||
fn=config_preset_dropdown_change,
|
|
||||||
show_progress=False,
|
|
||||||
inputs=[config_preset_dropdown],
|
|
||||||
#outputs = list([self.component_map[e] for e in AVAILABLE_COMPONENTS if e != "Seeds" and e != "Highres. fix"]) # **** LIST COMPS FAIL W/ GRADIO'S IN/OUTPUTS
|
|
||||||
outputs=[self.component_map["Sampling Steps"],
|
|
||||||
self.component_map["Sampling method"],
|
|
||||||
self.component_map["Width"],
|
|
||||||
self.component_map["Height"],
|
|
||||||
#self.component_map["Highres. fix"], no highres fix in img2img
|
|
||||||
#self.component_map["Firstpass width"],
|
|
||||||
#self.component_map["Firstpass height"],
|
|
||||||
self.component_map["Denoising strength"],
|
|
||||||
self.component_map["Batch count"],
|
|
||||||
self.component_map["Batch size"],
|
|
||||||
self.component_map["CFG Scale"]]
|
|
||||||
)
|
)
|
||||||
|
config_preset_dropdown.style(container=False) #set to True to give it a white box to sit in
|
||||||
config_preset_dropdown.change(
|
|
||||||
fn=None,
|
|
||||||
inputs=[],
|
|
||||||
outputs=[],
|
|
||||||
_js="function() { config_preset_dropdown_change() }", # JS is used to update the Highres fix row to show/hide it
|
|
||||||
)
|
|
||||||
|
|
||||||
with gr.Column(scale=1, min_width=30):
|
if self.is_txt2img:
|
||||||
def open_file(f):
|
config_preset_dropdown.change(
|
||||||
path = os.path.normpath(f)
|
fn=config_preset_dropdown_change,
|
||||||
|
show_progress=False,
|
||||||
|
inputs=[config_preset_dropdown],
|
||||||
|
outputs=[self.component_map["Sampling Steps"],
|
||||||
|
self.component_map["Sampling method"],
|
||||||
|
self.component_map["Width"],
|
||||||
|
self.component_map["Height"],
|
||||||
|
self.component_map["Highres. fix"],
|
||||||
|
self.component_map["Firstpass width"],
|
||||||
|
self.component_map["Firstpass height"],
|
||||||
|
self.component_map["Denoising strength"],
|
||||||
|
self.component_map["Batch count"],
|
||||||
|
self.component_map["Batch size"],
|
||||||
|
self.component_map["CFG Scale"]]
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
config_preset_dropdown.change(
|
||||||
|
fn=config_preset_dropdown_change,
|
||||||
|
show_progress=False,
|
||||||
|
inputs=[config_preset_dropdown],
|
||||||
|
#outputs = list([self.component_map[e] for e in AVAILABLE_COMPONENTS if e != "Seeds" and e != "Highres. fix"]) # **** LIST COMPS FAIL W/ GRADIO'S IN/OUTPUTS
|
||||||
|
outputs=[self.component_map["Sampling Steps"],
|
||||||
|
self.component_map["Sampling method"],
|
||||||
|
self.component_map["Width"],
|
||||||
|
self.component_map["Height"],
|
||||||
|
#self.component_map["Highres. fix"], no highres fix in img2img
|
||||||
|
#self.component_map["Firstpass width"],
|
||||||
|
#self.component_map["Firstpass height"],
|
||||||
|
self.component_map["Denoising strength"],
|
||||||
|
self.component_map["Batch count"],
|
||||||
|
self.component_map["Batch size"],
|
||||||
|
self.component_map["CFG Scale"]]
|
||||||
|
)
|
||||||
|
|
||||||
if not os.path.exists(path):
|
config_preset_dropdown.change(
|
||||||
print(f'Config Presets: The file at "{path}" does not exist.')
|
fn=None,
|
||||||
return
|
inputs=[],
|
||||||
|
outputs=[],
|
||||||
|
_js="function() { config_preset_dropdown_change() }", # JS is used to update the Highres fix row to show/hide it
|
||||||
|
)
|
||||||
|
with gr.Column(scale=15, min_width=100, visible=False) as collapsable_column:
|
||||||
|
with gr.Row():
|
||||||
|
with gr.Column(scale=1, min_width=10):
|
||||||
|
|
||||||
# copied from ui.py:538
|
def delete_selected_preset(config_preset_name):
|
||||||
if platform.system() == "Windows":
|
if config_preset_name in self.config_presets.keys():
|
||||||
os.startfile(path)
|
del self.config_presets[config_preset_name]
|
||||||
elif platform.system() == "Darwin":
|
print(f'Config Presets: deleted "{config_preset_name}"')
|
||||||
sp.Popen(["open", path])
|
|
||||||
else:
|
self.write_config_presets_to_file()
|
||||||
sp.Popen(["xdg-open", path])
|
|
||||||
|
preset_keys = list(self.config_presets.keys())
|
||||||
|
return gr.Dropdown.update(value=preset_keys[len(preset_keys)-1], choices=preset_keys)
|
||||||
|
return gr.Dropdown.update() # do nothing if no value is selected
|
||||||
|
|
||||||
|
trash_button = gr.Button(
|
||||||
|
value="\U0001F5D1",
|
||||||
|
elem_id="config_preset_trash_button",
|
||||||
|
)
|
||||||
|
trash_button.click(
|
||||||
|
fn=delete_selected_preset,
|
||||||
|
inputs=[config_preset_dropdown],
|
||||||
|
outputs=[config_preset_dropdown],
|
||||||
|
)
|
||||||
|
with gr.Column(scale=10, min_width=100):
|
||||||
|
save_textbox = gr.Textbox(
|
||||||
|
label="New preset name",
|
||||||
|
placeholder="Ex: Low quality",
|
||||||
|
#value="My Preset",
|
||||||
|
max_lines=1,
|
||||||
|
elem_id="config_preset_save_textbox",
|
||||||
|
)
|
||||||
|
with gr.Column(scale=2, min_width=50):
|
||||||
|
save_button = gr.Button(
|
||||||
|
value="Create",
|
||||||
|
variant="primary",
|
||||||
|
elem_id="config_preset_save_button",
|
||||||
|
)
|
||||||
|
save_button.click(
|
||||||
|
fn=self.save_config(),
|
||||||
|
inputs=list([save_textbox] + [self.component_map[comp_name] for comp_name in self.component_labels if self.component_map[comp_name] is not None]),
|
||||||
|
outputs=[config_preset_dropdown, save_textbox],
|
||||||
|
)
|
||||||
|
|
||||||
|
with gr.Column(scale=2, min_width=50):
|
||||||
|
def open_file(f):
|
||||||
|
path = os.path.normpath(f)
|
||||||
|
|
||||||
|
if not os.path.exists(path):
|
||||||
|
print(f'Config Presets: The file at "{path}" does not exist.')
|
||||||
|
return
|
||||||
|
|
||||||
|
# copied from ui.py:538
|
||||||
|
if platform.system() == "Windows":
|
||||||
|
os.startfile(path)
|
||||||
|
elif platform.system() == "Darwin":
|
||||||
|
sp.Popen(["open", path])
|
||||||
|
else:
|
||||||
|
sp.Popen(["xdg-open", path])
|
||||||
|
|
||||||
|
open_config_file_button = gr.Button(
|
||||||
|
value="Open...",
|
||||||
|
elem_id="config_presets_open_config_file_button",
|
||||||
|
)
|
||||||
|
open_config_file_button.click(
|
||||||
|
fn=lambda: open_file(f"{BASEDIR}/{CONFIG_FILE_NAME}"),
|
||||||
|
inputs=[],
|
||||||
|
outputs=[],
|
||||||
|
)
|
||||||
|
|
||||||
|
with gr.Column(scale=2, min_width=50):
|
||||||
|
cancel_button = gr.Button(
|
||||||
|
value="Cancel",
|
||||||
|
elem_id="config_preset_cancel_save_button",
|
||||||
|
)
|
||||||
|
|
||||||
|
with gr.Column(scale=1, min_width=120, visible=True) as add_remove_button_column:
|
||||||
|
add_remove_button = gr.Button(
|
||||||
|
value="Add/Remove...",
|
||||||
|
elem_id="config_preset_add_button",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_remove_button_click():
|
||||||
|
return gr.update(visible=True), gr.update(visible=False)
|
||||||
|
|
||||||
|
def save_button_click(save_text):
|
||||||
|
if save_text == "":
|
||||||
|
return gr.update(), gr.update()
|
||||||
|
return gr.update(visible=True), gr.update(visible=False)
|
||||||
|
|
||||||
|
def cancel_button_click():
|
||||||
|
return gr.update(visible=True), gr.update(visible=False)
|
||||||
|
|
||||||
|
add_remove_button.click(
|
||||||
|
fn=add_remove_button_click,
|
||||||
|
inputs=[],
|
||||||
|
outputs=[collapsable_column, add_remove_button_column],
|
||||||
|
)
|
||||||
|
save_button.click(
|
||||||
|
fn=save_button_click,
|
||||||
|
inputs=[save_textbox],
|
||||||
|
outputs=[add_remove_button_column, collapsable_column],
|
||||||
|
)
|
||||||
|
cancel_button.click(
|
||||||
|
fn=cancel_button_click,
|
||||||
|
inputs=[],
|
||||||
|
outputs=[add_remove_button_column, collapsable_column],
|
||||||
|
)
|
||||||
|
|
||||||
open_config_file_button = gr.Button( # tooltip is set in javascript/config_presets.js
|
|
||||||
value="Edit...",
|
|
||||||
elem_id="config_presets_open_config_file_button"
|
|
||||||
)
|
|
||||||
open_config_file_button.click(
|
|
||||||
fn=lambda: open_file(f"{basedir}/config.json"),
|
|
||||||
inputs=[],
|
|
||||||
outputs=[],
|
|
||||||
)
|
|
||||||
|
|
||||||
def ui(self, is_img2img):
|
def ui(self, is_img2img):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def run(self, p, *args):
|
def run(self, p, *args):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Save the current values on the UI to a new entry in the config file
|
||||||
|
# Gerschel came up with the idea for this code trick
|
||||||
|
def save_config(self):
|
||||||
|
# closure keeps path in memory, it's a hack to get around how click or change expects values to be formatted
|
||||||
|
def func(new_setting_name, *new_setting):
|
||||||
|
#print(f"save_config() func() new_setting_name={new_setting_name} *new_setting={new_setting}")
|
||||||
|
#print(f"new_setting_name={new_setting_name}")
|
||||||
|
|
||||||
|
if new_setting_name == "":
|
||||||
|
return gr.Dropdown.update(), "" # do nothing if no label entered in textbox
|
||||||
|
|
||||||
|
new_setting_map = {}
|
||||||
|
|
||||||
|
j = 0
|
||||||
|
for i, k in enumerate(self.component_labels):
|
||||||
|
#print(f"i={i}, j={j} k={k}") # i=1,2,3... k="Sampling Steps", "Sampling methods", ...
|
||||||
|
|
||||||
|
if self.is_img2img and self.component_labels[k]["not_used_in_img2img"] == True:
|
||||||
|
#if we're in the img2img tab, skip Highres. fix, Firstpass width, Firstpass height
|
||||||
|
#print(f"{k} is not in the img2img tab, skipping")
|
||||||
|
continue
|
||||||
|
|
||||||
|
if self.component_map[k] is not None:
|
||||||
|
internal_name = self.component_labels[k]["internal_name"]
|
||||||
|
new_value = new_setting[j]
|
||||||
|
#print(f"internal_name={internal_name}, new_value={new_value}")
|
||||||
|
if k != "Sampling method":
|
||||||
|
new_setting_map[internal_name] = new_value
|
||||||
|
else:
|
||||||
|
if self.is_txt2img:
|
||||||
|
new_setting_map[internal_name] = modules.sd_samplers.samplers[new_value].name
|
||||||
|
else:
|
||||||
|
new_setting_map[internal_name] = modules.sd_samplers.samplers_for_img2img[new_value].name
|
||||||
|
|
||||||
|
j += 1
|
||||||
|
|
||||||
|
self.config_presets.update({new_setting_name: new_setting_map})
|
||||||
|
|
||||||
|
self.write_config_presets_to_file()
|
||||||
|
|
||||||
|
#print(f"new dropdown values: {list(self.config_presets.keys())}")
|
||||||
|
# update the dropdown with the new config preset, clear the 'new preset name' textbox
|
||||||
|
return gr.Dropdown.update(value=new_setting_name, choices=list(self.config_presets.keys())), ""
|
||||||
|
|
||||||
|
return func
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def write_config_presets_to_file(self):
|
||||||
|
json_object = json.dumps(self.config_presets, indent=4)
|
||||||
|
with open(f"{BASEDIR}/{CONFIG_FILE_NAME}", "w") as outfile:
|
||||||
|
outfile.write(json_object)
|
||||||
|
|
||||||
Reference in New Issue
Block a user