From 6c29c3fb4d1dc107f7da0ed7261723d42e01f134 Mon Sep 17 00:00:00 2001 From: Vladimir Mandic Date: Thu, 3 Apr 2025 07:04:59 -0400 Subject: [PATCH] edit built-in styles Signed-off-by: Vladimir Mandic --- CHANGELOG.md | 7 ++--- modules/ui_extra_networks.py | 52 +++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e6f1fb3e..9d95d2717 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,8 @@ # Change Log for SD.Next -## Update for 2025-04-02 +## Update for 2025-04-03 -### Highlights for 2025-04-02 +### Highlights for 2025-04-03 Time for another major release with ~120 commits and [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) that spans several pages! @@ -20,7 +20,7 @@ Models...And support for new models: **CogView-4**, **SANA 1.5**, [ReadMe](https://github.com/vladmandic/automatic/blob/master/README.md) | [ChangeLog](https://github.com/vladmandic/automatic/blob/master/CHANGELOG.md) | [Docs](https://vladmandic.github.io/sdnext-docs/) | [WiKi](https://github.com/vladmandic/automatic/wiki) | [Discord](https://discord.com/invite/sd-next-federal-batch-inspectors-1101998836328697867) -### Details for 2025-04-02 +### Details for 2025-04-03 - **Video tab** - see [Video Wiki](https://github.com/vladmandic/sdnext/wiki/Video) for details! @@ -178,6 +178,7 @@ Models...And support for new models: **CogView-4**, **SANA 1.5**, - fix token counter error style with modernui - fix sampler metadata when using default sampler - fix paste incorrect float to int cast + - do not allow edit of built-in styles - improve lora compatibility with balanced offload ## Update for 2025-02-28 diff --git a/modules/ui_extra_networks.py b/modules/ui_extra_networks.py index f96974d28..a73f33a56 100644 --- a/modules/ui_extra_networks.py +++ b/modules/ui_extra_networks.py @@ -175,9 +175,9 @@ class ExtraNetworksPage: img = None try: img = Image.open(f) - except Exception: + except Exception as e: img = None - shared.log.warning(f'Extra network removing invalid image: {f}') + shared.log.warning(f'Network removing invalid: image={f} {e}') try: if img is None: img = None @@ -189,9 +189,9 @@ class ExtraNetworksPage: img.close() created += 1 except Exception as e: - shared.log.warning(f'Extra network error creating thumbnail: {f} {e}') + shared.log.warning(f'Network create thumbnail={f} {e}') if created > 0: - shared.log.info(f"Network thumbnails: {self.name} created={created}") + shared.log.info(f'Network thumbnails: {self.name} created={created}') self.missing_thumbs.clear() def create_items(self, tabname): @@ -221,7 +221,7 @@ class ExtraNetworksPage: return self.patch(self.html, tabname) self_name_id = self.name.replace(" ", "_") if skip: - return f"
Extra network page not ready
Click refresh to try again
" + return f"
Network page not ready
Click refresh to try again
" subdirs = {} allowed_folders = [os.path.abspath(x) for x in self.allowed_directories_for_previews() if os.path.exists(x)] for parentdir, dirs in {d: files_cache.walk(d, cached=True, recurse=files_cache.not_hidden) for d in allowed_folders}.items(): @@ -239,7 +239,7 @@ class ExtraNetworksPage: if not subdir: continue subdirs[subdir] = 1 - debug(f"Networks: page='{self.name}' subfolders={list(subdirs)}") + debug(f'Networks: page="{self.name}" subfolders={list(subdirs)}') subdirs = OrderedDict(sorted(subdirs.items())) if self.name == 'model' and shared.opts.extra_network_reference_enable: subdirs['Local'] = 1 @@ -289,7 +289,7 @@ class ExtraNetworksPage: self.html += ''.join(htmls) self.page_time = time.time() self.html = f"
{subdirs_html}
{self.html}
" - shared.log.debug(f"Networks: type='{self.name}' items={len(self.items)} subfolders={len(subdirs)} tab={tabname} folders={self.allowed_directories_for_previews()} list={self.list_time:.2f} thumb={self.preview_time:.2f} desc={self.desc_time:.2f} info={self.info_time:.2f} workers={shared.max_workers}") + shared.log.debug(f'Networks: type="{self.name}" items={len(self.items)} subfolders={len(subdirs)} tab={tabname} folders={self.allowed_directories_for_previews()} list={self.list_time:.2f} thumb={self.preview_time:.2f} desc={self.desc_time:.2f} info={self.info_time:.2f} workers={shared.max_workers}') if len(self.missing_thumbs) > 0: threading.Thread(target=self.create_thumb).start() return self.patch(self.html, tabname) @@ -677,13 +677,13 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): if ui.gallery is not None: images = list(ui.gallery.temp_files) # gallery cannot be used as input component so looking at most recently registered temp files if len(images) < 1: - shared.log.warning(f'Extra network no image: item={ui.last_item.name}') + shared.log.warning(f'Network no image: item="{ui.last_item.name}"') return 'html/card-no-preview.png' try: images.sort(key=lambda f: os.path.getmtime(f), reverse=True) image = Image.open(images[0]) except Exception as e: - shared.log.error(f'Extra network error opening image: item={ui.last_item.name} {e}') + shared.log.error(f'Network error opening image: item="{ui.last_item.name}" {e}') return 'html/card-no-preview.png' fn_delete_img(image) if image.width > 512 or image.height > 512: @@ -691,9 +691,9 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): image.thumbnail((512, 512), Image.Resampling.HAMMING) try: image.save(ui.last_item.local_preview, quality=50) - shared.log.debug(f'Extra network save image: item={ui.last_item.name} filename="{ui.last_item.local_preview}"') + shared.log.debug(f'Networks save image: item="{ui.last_item.name}" filename="{ui.last_item.local_preview}"') except Exception as e: - shared.log.error(f'Extra network save image: item={ui.last_item.name} filename="{ui.last_item.local_preview}" {e}') + shared.log.error(f'Network save image: item="{ui.last_item.name}" filename="{ui.last_item.local_preview}" {e}') return image def fn_delete_img(_image): @@ -702,7 +702,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): for file in [f'{fn}{mid}{ext}' for ext in preview_extensions for mid in ['.thumb.', '.preview.', '.']]: if os.path.exists(file): os.remove(file) - shared.log.debug(f'Extra network delete image: item={ui.last_item.name} filename="{file}"') + shared.log.debug(f'Network delete image: item="{ui.last_item.name}" filename="{file}"') return 'html/card-no-preview.png' def fn_save_desc(desc): @@ -714,7 +714,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): fn = os.path.splitext(ui.last_item.filename)[0] + '.txt' with open(fn, 'w', encoding='utf-8') as f: f.write(desc) - shared.log.debug(f'Extra network save desc: item={ui.last_item.name} filename="{fn}"') + shared.log.debug(f'Network save desc: item="{ui.last_item.name}" filename="{fn}"') return desc def fn_delete_desc(desc): @@ -722,7 +722,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): return desc fn = os.path.splitext(ui.last_item.filename)[0] + '.txt' if os.path.exists(fn): - shared.log.debug(f'Extra network delete desc: item={ui.last_item.name} filename="{fn}"') + shared.log.debug(f'Network delete desc: item="{ui.last_item.name}" filename="{fn}"') os.remove(fn) return '' return desc @@ -730,7 +730,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): def fn_save_info(info): fn = os.path.splitext(ui.last_item.filename)[0] + '.json' shared.writefile(info, fn, silent=True) - shared.log.debug(f'Extra network save info: item={ui.last_item.name} filename="{fn}"') + shared.log.debug(f'Network save info: item="{ui.last_item.name}" filename="{fn}"') return info def fn_delete_info(info): @@ -738,14 +738,14 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): return info fn = os.path.splitext(ui.last_item.filename)[0] + '.json' if os.path.exists(fn): - shared.log.debug(f'Extra network delete info: item={ui.last_item.name} filename="{fn}"') + shared.log.debug(f'Network delete info: item="{ui.last_item.name}" filename="{fn}"') os.remove(fn) return '' return info def fn_save_style(info, description, prompt, negative, extra, wildcards): if not isinstance(info, dict) or isinstance(info, list): - shared.log.warning(f'Extra network save style skip: item={ui.last_item.name} not a dict: {type(info)}') + shared.log.warning(f'Network save style skip: item="{ui.last_item.name}" not a dict: {type(info)}') return info if ui.last_item is None: return info @@ -753,7 +753,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): if hasattr(ui.last_item, 'type') and ui.last_item.type == 'Style': info.update(**{ 'description': description, 'prompt': prompt, 'negative': negative, 'extra': extra, 'wildcards': wildcards }) shared.writefile(info, fn, silent=True) - shared.log.debug(f'Extra network save style: item={ui.last_item.name} filename="{fn}"') + shared.log.debug(f'Network save style: item="{ui.last_item.name}" filename="{fn}"') return info def fn_delete_style(info): @@ -761,7 +761,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): return info fn = os.path.splitext(ui.last_item.filename)[0] + '.json' if os.path.exists(fn): - shared.log.debug(f'Extra network delete style: item={ui.last_item.name} filename="{fn}"') + shared.log.debug(f'Network delete style: item="{ui.last_item.name}" filename="{fn}"') os.remove(fn) return {} return info @@ -785,6 +785,10 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): if 'modelVersions' in fullinfo: # sanitize massive objects fullinfo['modelVersions'] = [] info = fullinfo + if isinstance(info, list): + item.filename = None + shared.log.warning('Network: show details not supported for compound item') + info = None """ if prompt is not None: item.prompt = prompt @@ -812,7 +816,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): model = '' style = '' note = '' - if not os.path.exists(item.filename): + if item.filename is not None and not os.path.exists(item.filename): note = f'
Target filename: {item.filename}' if page.title == 'Model': merge = len(list(meta.get('sd_merge_models', {}))) @@ -904,7 +908,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): page.refresh_time = 0 page.refresh() page.create_page(ui.tabname) - shared.log.debug(f"Networks: refresh page='{page.title}' items={len(page.items)} tab={ui.tabname}") + shared.log.debug(f'Networks: refresh page="{page.title}" items={len(page.items)} tab={ui.tabname}') pages.append(page.html) ui.search.update(title) return pages @@ -918,7 +922,7 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): page.card = card_full if page.view == 'gallery' else card_list page.html = '' page.create_page(ui.tabname) - shared.log.debug(f"Networks: refresh page='{page.title}' items={len(page.items)} tab={ui.tabname} view={page.view}") + shared.log.debug(f'Networks: refresh page="{page.title}" items={len(page.items)} tab={ui.tabname} view={page.view}') pages.append(page.html) ui.search.update(title) return pages @@ -973,9 +977,9 @@ def create_ui(container, button_parent, tabname, skip_indexing = False): } shared.writefile(item, fn, silent=True) if len(prompt) > 0: - shared.log.debug(f"Network quick save style: item={name} filename='{fn}' unparsed={shared.opts.extra_networks_unparsed}") + shared.log.debug(f'Network quick save style: item="{name}" filename="{fn}" unparsed={shared.opts.extra_networks_unparsed}') else: - shared.log.warning(f"Network quick save model: item={name} filename='{fn}' prompt is empty") + shared.log.warning(f'Network quick save model: item="{name}" filename="{fn}" prompt is empty') def ui_sort_cards(sort_order): if shared.opts.extra_networks_sort != sort_order: