From 5a9b72ec579ad4ca3964efa0f50751abb00db418 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 31 Jul 2025 19:39:20 -0400 Subject: [PATCH] add quicksettings reset button Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 2 + TODO.md | 7 ++- extensions-builtin/sdnext-modernui | 2 +- html/locale_en.json | 1 + javascript/sdnext.css | 15 ++++- modules/ui_settings.py | 19 +++++- pipelines/chroma/convert_chroma.py | 95 ++++++++++++++++++++++++++++++ 7 files changed, 134 insertions(+), 7 deletions(-) create mode 100644 pipelines/chroma/convert_chroma.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d1662c5c..6148d906b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ - new embedded docs/wiki search! **Docs** search: fully-local and works in real-time on all document pages **Wiki** search: uses github api to search online wiki pages + - quicksettings reset button to restore all quicksettings to default values + because things do sometimes get wrong... - modernui checkbox/radio styling - **Offloading** - changed **default** values for offloading based on detected gpu memory diff --git a/TODO.md b/TODO.md index c50ae0e51..332681cb1 100644 --- a/TODO.md +++ b/TODO.md @@ -31,13 +31,14 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma ## ModernUI -- Extensions tab: Full CSS +- Extensions tab: + - full CSS redesign - Models tab: - - Current - Validate: broken table - Update: broken table - CivitAI: redesign downloader -- History +- History tab: + - empty? ### Under Consideration diff --git a/extensions-builtin/sdnext-modernui b/extensions-builtin/sdnext-modernui index 9ee81f7cb..d6c42efe5 160000 --- a/extensions-builtin/sdnext-modernui +++ b/extensions-builtin/sdnext-modernui @@ -1 +1 @@ -Subproject commit 9ee81f7cb6bfb882ecd93228b861ff9d06fb7ec8 +Subproject commit d6c42efe59e2c6f661d4a76ce363f2427627360f diff --git a/html/locale_en.json b/html/locale_en.json index 57d8848d8..b222c2ed5 100644 --- a/html/locale_en.json +++ b/html/locale_en.json @@ -13,6 +13,7 @@ {"id":"","label":"※","localized":"","hint":"Load model as refiner model when selected, otherwise load as base model"}, {"id":"","label":"🔎︎","localized":"","hint":"Scan CivitAI for missing metadata and previews"}, {"id":"","label":"☲","localized":"","hint":"Change view type"}, + {"id":"","label":"⊗","localized":"","hint":"Reset values"}, {"id":"","label":"📐","localized":"","hint":"Measure"}, {"id":"","label":"🔍","localized":"","hint":"Search"}, {"id":"","label":"🖌️","localized":"","hint":"LaMa remove selected object from image"}, diff --git a/javascript/sdnext.css b/javascript/sdnext.css index 3398fa6d8..af5b39464 100644 --- a/javascript/sdnext.css +++ b/javascript/sdnext.css @@ -680,8 +680,19 @@ div#extras_scale_to_tab div.form { #quicksettings>button { align-self: end; - margin-bottom: 6px; - padding: 0 1em 0 0; + height: 1.3em; + margin: 0em 0.7em 0.3em -0.5em; + line-height: 1em; + background-color: var(--background-fill-primary); +} + +#quicksettings>button:hover { + background-color: var(--button-cancel-border-color-hover); +} + +button#quicksettings_reset { + position: absolute; + right: 0; } #settings { diff --git a/modules/ui_settings.py b/modules/ui_settings.py index b53f7bb0e..b4595665f 100644 --- a/modules/ui_settings.py +++ b/modules/ui_settings.py @@ -1,6 +1,7 @@ import os import gradio as gr -from modules import timer, shared, paths, theme, sd_models, modelloader, ui_common, ui_loadsave, ui_history, generation_parameters_copypaste, call_queue, script_callbacks +from modules import timer, shared, paths, theme, sd_models, modelloader, generation_parameters_copypaste, call_queue, script_callbacks +from modules import ui_common, ui_loadsave, ui_history, ui_components, ui_symbols text_settings = None # holds json of entire shared.opts @@ -275,6 +276,15 @@ def create_ui(): shutdown_submit.click(fn=lambda: shared.restart_server(restart=False), _js="restartReload") +def reset_quicksettings(components): + components = components.split(',') + updates = [] + for key in components: + shared.log.warning(f'Reset: setting={key}') + updates.append(gr.update(value=shared.opts.get_default(key))) + return updates + + def create_quicksettings(interfaces): shared.tab_names = [] for _interface, label, _ifid in interfaces: @@ -282,9 +292,16 @@ def create_quicksettings(interfaces): with gr.Blocks(theme=theme.gradio_theme, analytics_enabled=False, title="SD.Next") as ui_app: with gr.Row(elem_id="quicksettings", variant="compact"): + quicksetting_components = [] + quicksetting_keys = [] for k, _item in sorted(quicksettings_list, key=lambda x: quicksettings_names.get(x[1], x[0])): component = create_setting_component(k, is_quicksettings=True) + quicksetting_components.append(component) + quicksetting_keys.append(k) shared.settings_components[k] = component + quicksetting_keys = gr.State(value=','.join(quicksetting_keys), elem_id="quicksettings_keys") + btn_reset = ui_components.ToolButton(value=ui_symbols.clear, visible=True, elem_id="quicksettings_reset") + btn_reset.click(fn=reset_quicksettings, inputs=[quicksetting_keys], outputs=quicksetting_components) generation_parameters_copypaste.connect_paste_params_buttons() diff --git a/pipelines/chroma/convert_chroma.py b/pipelines/chroma/convert_chroma.py new file mode 100644 index 000000000..769cf7629 --- /dev/null +++ b/pipelines/chroma/convert_chroma.py @@ -0,0 +1,95 @@ +from rich import print as rprint +rprint('starting chroma conversion') + +import os +import torch +import transformers +import diffusers +import huggingface_hub as hf +from rich.traceback import install as install_traceback + + +convert = True +test = False +upload = True +input_files = [ + 'chroma-unlocked-v48.safetensors', + 'chroma-unlocked-v48-detail-calibrated.safetensors', + 'chroma-unlocked-v46-flash.safetensors', +] +input_folder = '/mnt/models/UNET' +output_folder = '/mnt/models/Diffusers' +cache_dir = '/mnt/models/huggingface' +hf_token = '' +dtype = torch.bfloat16 +device = torch.device('cuda') + + +install_traceback(show_locals=False) +rprint(f'torch={torch.__version__} diffusers={diffusers.__version__} transformers={transformers.__version__}') +for input_file in input_files: + input_basename = os.path.splitext(input_file)[0] + input_model = os.path.join(input_folder, input_file) + output_model = os.path.join(output_folder, input_basename) + + if convert: + rprint(f'load transformer: {input_model}') + transformer = diffusers.ChromaTransformer2DModel.from_single_file( + input_model, + torch_dtype=dtype, + cache_dir=cache_dir, + ).to(device) + + rprint(f'load text-encoder') + text_encoder = transformers.T5EncoderModel.from_pretrained( + "black-forest-labs/FLUX.1-schnell", + subfolder="text_encoder_2", + torch_dtype=dtype, + cache_dir=cache_dir, + ).to(device) + + rprint(f'load tokenizer') + tokenizer = transformers.T5Tokenizer.from_pretrained( + "black-forest-labs/FLUX.1-schnell", + subfolder="tokenizer_2", + cache_dir=cache_dir, + ) + + rprint(f'load pipeline') + pipe = diffusers.ChromaPipeline.from_pretrained( + "black-forest-labs/FLUX.1-dev", + transformer=transformer, + text_encoder=text_encoder, + tokenizer=tokenizer, + torch_dtype=dtype, + cache_dir=cache_dir, + ).to(device) + + + rprint(f'save pipeline: {output_model}') + pipe.save_pretrained( + output_model, + ) + + if test: + rprint('test load') + pipe = diffusers.ChromaPipeline.from_pretrained( + output_model, + torch_dtype=dtype, + cache_dir=cache_dir, + ) + + if upload: + rprint('hf login') + hf.logout() + hf.login(token=hf_token, add_to_git_credential=False, write_permission=True) + rprint('upload model') + pipe.push_to_hub( + input_basename, + private=False, + token=hf_token, + ) + + pipe = None + +rprint(f'done')