From f56e3eb3b007b819e55646416ea38cb8035d9683 Mon Sep 17 00:00:00 2001 From: Manuel Schmid Date: Sat, 23 Dec 2023 19:30:49 +0100 Subject: [PATCH] add preset selection uses meta parsing to set presets in user session (UI elements only) --- modules/config.py | 95 ++++++++++++++++++++++++++++-------------- modules/meta_parser.py | 11 +++++ webui.py | 35 ++++++++++++++++ 3 files changed, 109 insertions(+), 32 deletions(-) diff --git a/modules/config.py b/modules/config.py index 9cc61788..1097874f 100644 --- a/modules/config.py +++ b/modules/config.py @@ -79,21 +79,51 @@ def try_load_deprecated_user_path_config(): try_load_deprecated_user_path_config() +def list_presets(): + preset_folder = 'presets' + presets = ['None'] + if not os.path.exists(preset_folder): + print('No presets found.') + return presets; + + return presets + [f[:f.index(".json")] for f in os.listdir(preset_folder) if f.endswith('.json')] + +available_presets = list_presets() + + +def try_get_preset_content(preset): + if isinstance(preset, str): + preset_path = os.path.abspath(f'./presets/{preset}.json') + try: + if os.path.exists(preset_path): + with open(preset_path, "r", encoding="utf-8") as json_file: + json_content = json.load(json_file) + print(f'Loaded preset: {preset_path}') + return json_content + else: + raise FileNotFoundError + except Exception as e: + print(f'Load preset [{preset_path}] failed') + print(e) + +def try_load_preset_global(preset): + global config_dict + + if isinstance(preset, str): + preset_path = os.path.abspath(f'./presets/{preset}.json') + try: + if os.path.exists(preset_path): + with open(preset_path, "r", encoding="utf-8") as json_file: + config_dict.update(json.load(json_file)) + print(f'Loaded preset: {preset_path}') + else: + raise FileNotFoundError + except Exception as e: + print(f'Load preset [{preset_path}] failed') + print(e) + preset = args_manager.args.preset - -if isinstance(preset, str): - preset_path = os.path.abspath(f'./presets/{preset}.json') - try: - if os.path.exists(preset_path): - with open(preset_path, "r", encoding="utf-8") as json_file: - config_dict.update(json.load(json_file)) - print(f'Loaded preset: {preset_path}') - else: - raise FileNotFoundError - except Exception as e: - print(f'Load preset [{preset_path}] failed') - print(e) - +try_load_preset_global(preset) def get_dir_or_set_default(key, default_value): global config_dict, visited_keys, always_save_keys @@ -315,24 +345,25 @@ example_inpaint_prompts = [[x] for x in example_inpaint_prompts] config_dict["default_loras"] = default_loras = default_loras[:5] + [['None', 1.0] for _ in range(5 - len(default_loras))] -possible_preset_keys = [ - "default_model", - "default_refiner", - "default_refiner_switch", - "default_loras", - "default_cfg_scale", - "default_sample_sharpness", - "default_sampler", - "default_scheduler", - "default_performance", - "default_prompt", - "default_prompt_negative", - "default_styles", - "default_aspect_ratio", - "checkpoint_downloads", - "embeddings_downloads", - "lora_downloads", -] +# mapping config to meta parameter +possible_preset_keys = { + "default_model": "Base Model", + "default_refiner": "Refiner Model", + "default_refiner_switch": "Refiner Switch", + "default_loras": "TODO", + "default_cfg_scale": "Guidance Scale", + "default_sample_sharpness": "Sharpness", + "default_sampler": "Sampler", + "default_scheduler": "Scheduler", + "default_performance": "Performance", + "default_prompt": "Prompt", + "default_prompt_negative": "Negative Prompt", + "default_styles": "Styles", + "default_aspect_ratio": "Resolution", + "checkpoint_downloads": None, + "embeddings_downloads": None, + "lora_downloads": None, +} REWRITE_PRESET = False diff --git a/modules/meta_parser.py b/modules/meta_parser.py index 78d73978..f79323c8 100644 --- a/modules/meta_parser.py +++ b/modules/meta_parser.py @@ -142,3 +142,14 @@ def load_parameter_button_click(raw_prompt_txt): results.append(gr.update()) return results + +def parse_meta_from_preset(preset_content): + assert isinstance(preset_content, dict) + preset_prepared = {} + + for k, v in preset_content.items(): + if k in modules.config.possible_preset_keys: + if modules.config.possible_preset_keys[k] is not None: + preset_prepared[modules.config.possible_preset_keys[k]] = v + + return load_parameter_button_click(json.dumps(preset_prepared)) \ No newline at end of file diff --git a/webui.py b/webui.py index a5138abf..57ca89ac 100644 --- a/webui.py +++ b/webui.py @@ -220,6 +220,10 @@ with shared.gradio_root: with gr.Column(scale=1, visible=modules.config.default_advanced_checkbox) as advanced_column: with gr.Tab(label='Setting'): + preset_selection = gr.Radio(label='Preset', + choices=modules.config.available_presets, + value=args_manager.args.preset if args_manager.args.preset else "None", + interactive=True) performance_selection = gr.Radio(label='Performance', choices=modules.flags.performance_selections, value=modules.config.default_performance) @@ -456,6 +460,37 @@ with shared.gradio_root: model_refresh.click(model_refresh_clicked, [], [base_model, refiner_model] + lora_ctrls, queue=False, show_progress=False) + def preset_selection_change(preset): + preset_content = modules.config.try_get_preset_content(preset) + if preset_content is not None: + return modules.meta_parser.parse_meta_from_preset(preset_content) + + preset_selection.change(preset_selection_change, inputs=preset_selection, outputs=[ + advanced_checkbox, + image_number, + prompt, + negative_prompt, + style_selections, + performance_selection, + aspect_ratios_selection, + overwrite_width, + overwrite_height, + sharpness, + guidance_scale, + adm_scaler_positive, + adm_scaler_negative, + adm_scaler_end, + base_model, + refiner_model, + refiner_switch, + sampler_name, + scheduler_name, + seed_random, + image_seed, + generate_button, + load_parameter_button + ] + lora_ctrls, queue=False, show_progress=False) + performance_selection.change(lambda x: [gr.update(interactive=x != 'Extreme Speed')] * 11 + [gr.update(visible=x != 'Extreme Speed')] * 1, inputs=performance_selection,