From e5d3ae2bf4e9d39c35e6edc96d6449fd42528e55 Mon Sep 17 00:00:00 2001
From: AUTOMATIC1111 <16777216c@gmail.com>
Date: Sat, 15 Jul 2023 20:39:04 +0300
Subject: user metadata system for custom networks
---
modules/ui_extra_networks_user_metadata.py | 169 +++++++++++++++++++++++++++++
1 file changed, 169 insertions(+)
create mode 100644 modules/ui_extra_networks_user_metadata.py
(limited to 'modules/ui_extra_networks_user_metadata.py')
diff --git a/modules/ui_extra_networks_user_metadata.py b/modules/ui_extra_networks_user_metadata.py
new file mode 100644
index 00000000..8d20d026
--- /dev/null
+++ b/modules/ui_extra_networks_user_metadata.py
@@ -0,0 +1,169 @@
+import datetime
+import html
+import json
+import os.path
+
+import gradio as gr
+
+from modules import generation_parameters_copypaste, images, sysinfo, errors
+
+
+class UserMetadataEditor:
+
+ def __init__(self, ui, tabname, page):
+ self.ui = ui
+ self.tabname = tabname
+ self.page = page
+ self.id_part = f"{self.tabname}_{self.page.id_page}_edit_user_metadata"
+
+ self.box = None
+
+ self.edit_name_input = None
+ self.button_edit = None
+
+ self.edit_name = None
+ self.edit_description = None
+ self.html_filedata = None
+ self.html_preview = None
+
+ self.button_cancel = None
+ self.button_replace_preview = None
+ self.button_save = None
+
+ def get_user_metadata(self, name):
+ item = self.page.items.get(name, {})
+
+ user_metadata = item.get('user_metadata', None)
+ if user_metadata is None:
+ user_metadata = {}
+ item['user_metadata'] = user_metadata
+
+ return user_metadata
+
+ def create_default_editor_elems(self):
+ with gr.Row():
+ with gr.Column(scale=2):
+ self.edit_name = gr.HTML(elem_classes="extra-network-name")
+ self.edit_description = gr.Textbox(label="Description", lines=4)
+ self.html_filedata = gr.HTML()
+
+ with gr.Column(scale=1, min_width=0):
+ self.html_preview = gr.HTML()
+
+ def create_default_buttons(self):
+
+ with gr.Row():
+ self.button_cancel = gr.Button('Cancel')
+ self.button_replace_preview = gr.Button('Replace preview', variant='primary')
+ self.button_save = gr.Button('Save', variant='primary')
+
+ self.button_cancel.click(fn=None, _js="closePopup")
+
+ def get_card_html(self, name):
+ item = self.page.items.get(name, {})
+
+ preview_url = item.get("preview", None)
+
+ if not preview_url:
+ filename, _ = os.path.splitext(item["filename"])
+ preview_url = self.page.find_preview(filename)
+ item["preview"] = preview_url
+
+ if preview_url:
+ preview = f'''
+
+
})
+
+ '''
+ else:
+ preview = ""
+
+ return preview
+
+ def get_metadata_table(self, name):
+ item = self.page.items.get(name, {})
+ try:
+ filename = item["filename"]
+
+ stats = os.stat(filename)
+ params = [
+ ('File size: ', sysinfo.pretty_bytes(stats.st_size)),
+ ('Created: ', datetime.datetime.fromtimestamp(stats.st_ctime).strftime('%Y-%m-%d %H:%M')),
+ ('Last modified: ', datetime.datetime.fromtimestamp(stats.st_mtime).strftime('%Y-%m-%d %H:%M')),
+ ]
+
+ return params
+ except Exception as e:
+ errors.display(e, f"reading info for {name}")
+ return []
+
+ def put_values_into_components(self, name):
+ user_metadata = self.get_user_metadata(name)
+
+ params = self.get_metadata_table(name)
+ table = ''
+
+ return html.escape(name), user_metadata.get('description', ''), table, self.get_card_html(name)
+
+ def write_user_metadata(self, name, metadata):
+ item = self.page.items.get(name, {})
+ filename = item.get("filename", None)
+ basename, ext = os.path.splitext(filename)
+
+ with open(basename + '.json', "w", encoding="utf8") as file:
+ json.dump(metadata, file)
+
+ def save_user_metadata(self, name, desc):
+ user_metadata = self.get_user_metadata(name)
+ user_metadata["description"] = desc
+
+ self.write_user_metadata(name, user_metadata)
+
+ def create_editor(self):
+ self.create_default_editor_elems()
+
+ self.create_default_buttons()
+
+ self.button_edit\
+ .click(fn=self.put_values_into_components, inputs=[self.edit_name_input], outputs=[self.edit_name, self.edit_description, self.html_filedata, self.html_preview])\
+ .then(fn=lambda: gr.update(visible=True), inputs=[], outputs=[self.box])
+
+ self.button_save.click(fn=self.save_user_metadata, inputs=[self.edit_name_input, self.edit_description], outputs=[]).then(fn=None, _js="closePopup")
+
+ def create_ui(self):
+ with gr.Box(visible=False, elem_id=self.id_part, elem_classes="edit-user-metadata") as box:
+ self.box = box
+
+ self.edit_name_input = gr.Textbox("Edit user metadata card id", visible=False, elem_id=f"{self.id_part}_name")
+ self.button_edit = gr.Button("Edit user metadata", visible=False, elem_id=f"{self.id_part}_button")
+
+ self.create_editor()
+
+ def save_preview(self, index, gallery, name):
+ if len(gallery) == 0:
+ print("There is no image in gallery to save as a preview.")
+ return [self.get_card_html(name)] + [page.create_html(self.ui.tabname) for page in self.ui.stored_extra_pages]
+
+ item = self.page.items.get(name, {})
+
+ index = int(index)
+ index = 0 if index < 0 else index
+ index = len(gallery) - 1 if index >= len(gallery) else index
+
+ img_info = gallery[index if index >= 0 else 0]
+ image = generation_parameters_copypaste.image_from_url_text(img_info)
+ geninfo, items = images.read_info_from_image(image)
+
+ images.save_image_with_geninfo(image, geninfo, item["local_preview"])
+
+ return [self.get_card_html(name)] + [page.create_html(self.tabname) for page in self.ui.stored_extra_pages]
+
+ def setup_ui(self, gallery):
+ self.button_replace_preview.click(
+ fn=self.save_preview,
+ _js="function(x, y, z){return [selected_gallery_index(), y, z]}",
+ inputs=[self.edit_name_input, gallery, self.edit_name_input],
+ outputs=[self.html_preview, *self.ui.pages]
+ )
+
+
--
cgit v1.2.1
From 11f339733de860b0b51adebe15dc945df7189edf Mon Sep 17 00:00:00 2001
From: AUTOMATIC1111 <16777216c@gmail.com>
Date: Sun, 16 Jul 2023 00:56:53 +0300
Subject: add lora user metadata editor dialog inspired by MrKuenning's mockup
from #7458
---
modules/ui_extra_networks_user_metadata.py | 23 ++++++++++++++++-------
1 file changed, 16 insertions(+), 7 deletions(-)
(limited to 'modules/ui_extra_networks_user_metadata.py')
diff --git a/modules/ui_extra_networks_user_metadata.py b/modules/ui_extra_networks_user_metadata.py
index 8d20d026..0dbd7419 100644
--- a/modules/ui_extra_networks_user_metadata.py
+++ b/modules/ui_extra_networks_user_metadata.py
@@ -52,7 +52,7 @@ class UserMetadataEditor:
def create_default_buttons(self):
- with gr.Row():
+ with gr.Row(elem_classes="edit-user-metadata-buttons"):
self.button_cancel = gr.Button('Cancel')
self.button_replace_preview = gr.Button('Replace preview', variant='primary')
self.button_save = gr.Button('Save', variant='primary')
@@ -88,8 +88,7 @@ class UserMetadataEditor:
stats = os.stat(filename)
params = [
('File size: ', sysinfo.pretty_bytes(stats.st_size)),
- ('Created: ', datetime.datetime.fromtimestamp(stats.st_ctime).strftime('%Y-%m-%d %H:%M')),
- ('Last modified: ', datetime.datetime.fromtimestamp(stats.st_mtime).strftime('%Y-%m-%d %H:%M')),
+ ('Modified: ', datetime.datetime.fromtimestamp(stats.st_mtime).strftime('%Y-%m-%d %H:%M')),
]
return params
@@ -100,7 +99,12 @@ class UserMetadataEditor:
def put_values_into_components(self, name):
user_metadata = self.get_user_metadata(name)
- params = self.get_metadata_table(name)
+ try:
+ params = self.get_metadata_table(name)
+ except Exception as e:
+ errors.display(e, f"reading metadata info for {name}")
+ params = []
+
table = ''
return html.escape(name), user_metadata.get('description', ''), table, self.get_card_html(name)
@@ -128,7 +132,9 @@ class UserMetadataEditor:
.click(fn=self.put_values_into_components, inputs=[self.edit_name_input], outputs=[self.edit_name, self.edit_description, self.html_filedata, self.html_preview])\
.then(fn=lambda: gr.update(visible=True), inputs=[], outputs=[self.box])
- self.button_save.click(fn=self.save_user_metadata, inputs=[self.edit_name_input, self.edit_description], outputs=[]).then(fn=None, _js="closePopup")
+ self.button_save\
+ .click(fn=self.save_user_metadata, inputs=[self.edit_name_input, self.edit_description], outputs=[])\
+ .then(fn=None, _js="extraNetworksReloadAll")
def create_ui(self):
with gr.Box(visible=False, elem_id=self.id_part, elem_classes="edit-user-metadata") as box:
@@ -142,7 +148,7 @@ class UserMetadataEditor:
def save_preview(self, index, gallery, name):
if len(gallery) == 0:
print("There is no image in gallery to save as a preview.")
- return [self.get_card_html(name)] + [page.create_html(self.ui.tabname) for page in self.ui.stored_extra_pages]
+ return [self.get_card_html(name)] + self.regenerate_ui_pages()
item = self.page.items.get(name, {})
@@ -156,7 +162,10 @@ class UserMetadataEditor:
images.save_image_with_geninfo(image, geninfo, item["local_preview"])
- return [self.get_card_html(name)] + [page.create_html(self.tabname) for page in self.ui.stored_extra_pages]
+ return [self.get_card_html(name)] + self.regenerate_ui_pages()
+
+ def regenerate_ui_pages(self):
+ return [page.create_html(self.tabname) for page in self.ui.stored_extra_pages]
def setup_ui(self, gallery):
self.button_replace_preview.click(
--
cgit v1.2.1
From a1d6ada69ac686a628e79b61b8f86d01592a7209 Mon Sep 17 00:00:00 2001
From: AUTOMATIC1111 <16777216c@gmail.com>
Date: Sun, 16 Jul 2023 08:38:23 +0300
Subject: allow refreshing single card after editing user metadata instead of
all cards
---
modules/ui_extra_networks_user_metadata.py | 38 ++++++++++++++++++++----------
1 file changed, 25 insertions(+), 13 deletions(-)
(limited to 'modules/ui_extra_networks_user_metadata.py')
diff --git a/modules/ui_extra_networks_user_metadata.py b/modules/ui_extra_networks_user_metadata.py
index 0dbd7419..01ff4e4b 100644
--- a/modules/ui_extra_networks_user_metadata.py
+++ b/modules/ui_extra_networks_user_metadata.py
@@ -23,8 +23,10 @@ class UserMetadataEditor:
self.edit_name = None
self.edit_description = None
+ self.edit_notes = None
self.html_filedata = None
self.html_preview = None
+ self.html_status = None
self.button_cancel = None
self.button_replace_preview = None
@@ -57,6 +59,8 @@ class UserMetadataEditor:
self.button_replace_preview = gr.Button('Replace preview', variant='primary')
self.button_save = gr.Button('Save', variant='primary')
+ self.html_status = gr.HTML(elem_classes="edit-user-metadata-status")
+
self.button_cancel.click(fn=None, _js="closePopup")
def get_card_html(self, name):
@@ -107,7 +111,7 @@ class UserMetadataEditor:
table = ''
- return html.escape(name), user_metadata.get('description', ''), table, self.get_card_html(name)
+ return html.escape(name), user_metadata.get('description', ''), table, self.get_card_html(name), user_metadata.get('notes', ''),
def write_user_metadata(self, name, metadata):
item = self.page.items.get(name, {})
@@ -117,24 +121,30 @@ class UserMetadataEditor:
with open(basename + '.json', "w", encoding="utf8") as file:
json.dump(metadata, file)
- def save_user_metadata(self, name, desc):
+ def save_user_metadata(self, name, desc, notes):
user_metadata = self.get_user_metadata(name)
user_metadata["description"] = desc
+ user_metadata["notes"] = notes
self.write_user_metadata(name, user_metadata)
+ def setup_save_handler(self, button, func, components):
+ button\
+ .click(fn=func, inputs=[self.edit_name_input, *components], outputs=[])\
+ .then(fn=None, _js="function(name){closePopup(); extraNetworksRefreshSingleCard(" + json.dumps(self.page.name) + "," + json.dumps(self.tabname) + ", name);}", inputs=[self.edit_name_input], outputs=[])
+
def create_editor(self):
self.create_default_editor_elems()
+ self.edit_notes = gr.TextArea(label='Notes', lines=4)
+
self.create_default_buttons()
self.button_edit\
- .click(fn=self.put_values_into_components, inputs=[self.edit_name_input], outputs=[self.edit_name, self.edit_description, self.html_filedata, self.html_preview])\
+ .click(fn=self.put_values_into_components, inputs=[self.edit_name_input], outputs=[self.edit_name, self.edit_description, self.html_filedata, self.html_preview, self.edit_notes])\
.then(fn=lambda: gr.update(visible=True), inputs=[], outputs=[self.box])
- self.button_save\
- .click(fn=self.save_user_metadata, inputs=[self.edit_name_input, self.edit_description], outputs=[])\
- .then(fn=None, _js="extraNetworksReloadAll")
+ self.setup_save_handler(self.button_save, self.save_user_metadata, [self.edit_description, self.edit_notes])
def create_ui(self):
with gr.Box(visible=False, elem_id=self.id_part, elem_classes="edit-user-metadata") as box:
@@ -147,8 +157,7 @@ class UserMetadataEditor:
def save_preview(self, index, gallery, name):
if len(gallery) == 0:
- print("There is no image in gallery to save as a preview.")
- return [self.get_card_html(name)] + self.regenerate_ui_pages()
+ return self.get_card_html(name), "There is no image in gallery to save as a preview."
item = self.page.items.get(name, {})
@@ -162,17 +171,20 @@ class UserMetadataEditor:
images.save_image_with_geninfo(image, geninfo, item["local_preview"])
- return [self.get_card_html(name)] + self.regenerate_ui_pages()
-
- def regenerate_ui_pages(self):
- return [page.create_html(self.tabname) for page in self.ui.stored_extra_pages]
+ return self.get_card_html(name), ''
def setup_ui(self, gallery):
self.button_replace_preview.click(
fn=self.save_preview,
_js="function(x, y, z){return [selected_gallery_index(), y, z]}",
inputs=[self.edit_name_input, gallery, self.edit_name_input],
- outputs=[self.html_preview, *self.ui.pages]
+ outputs=[self.html_preview, self.html_status]
+ ).then(
+ fn=None,
+ _js="function(name){extraNetworksRefreshSingleCard(" + json.dumps(self.page.name) + "," + json.dumps(self.tabname) + ", name);}",
+ inputs=[self.edit_name_input],
+ outputs=[]
)
+
--
cgit v1.2.1
From 699108bfbb05c2a7d2ee4a2c7abcfaa0a244d8ea Mon Sep 17 00:00:00 2001
From: AUTOMATIC1111 <16777216c@gmail.com>
Date: Mon, 17 Jul 2023 18:56:14 +0300
Subject: hide cards for networks of incompatible stable diffusion version in
Lora extra networks interface
---
modules/ui_extra_networks_user_metadata.py | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
(limited to 'modules/ui_extra_networks_user_metadata.py')
diff --git a/modules/ui_extra_networks_user_metadata.py b/modules/ui_extra_networks_user_metadata.py
index 01ff4e4b..63d4b503 100644
--- a/modules/ui_extra_networks_user_metadata.py
+++ b/modules/ui_extra_networks_user_metadata.py
@@ -42,6 +42,9 @@ class UserMetadataEditor:
return user_metadata
+ def create_extra_default_items_in_left_column(self):
+ pass
+
def create_default_editor_elems(self):
with gr.Row():
with gr.Column(scale=2):
@@ -49,6 +52,8 @@ class UserMetadataEditor:
self.edit_description = gr.Textbox(label="Description", lines=4)
self.html_filedata = gr.HTML()
+ self.create_extra_default_items_in_left_column()
+
with gr.Column(scale=1, min_width=0):
self.html_preview = gr.HTML()
@@ -111,7 +116,7 @@ class UserMetadataEditor:
table = ''
- return html.escape(name), user_metadata.get('description', ''), table, self.get_card_html(name), user_metadata.get('notes', ''),
+ return html.escape(name), user_metadata.get('description', ''), table, self.get_card_html(name), user_metadata.get('notes', '')
def write_user_metadata(self, name, metadata):
item = self.page.items.get(name, {})
--
cgit v1.2.1