aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAUTOMATIC <16777216c@gmail.com>2022-09-20 06:53:37 +0000
committerAUTOMATIC <16777216c@gmail.com>2022-09-20 06:53:37 +0000
commit54a097a8186222ba193d1abaaec6b3c65670313d (patch)
tree30e215492b39db93fe1d6ed85be21f66ab955936
parentab38392119e9c37c7a9c3f921e0c237deb42b205 (diff)
parentd7f36dac21857dbcedb0303a5c80c35deae26592 (diff)
downloadstable-diffusion-webui-gfx803-54a097a8186222ba193d1abaaec6b3c65670313d.tar.gz
stable-diffusion-webui-gfx803-54a097a8186222ba193d1abaaec6b3c65670313d.tar.bz2
stable-diffusion-webui-gfx803-54a097a8186222ba193d1abaaec6b3c65670313d.zip
Merge remote-tracking branch 'origin/master'
-rw-r--r--javascript/notification.js34
-rw-r--r--modules/images.py18
-rw-r--r--modules/ui.py8
3 files changed, 55 insertions, 5 deletions
diff --git a/javascript/notification.js b/javascript/notification.js
new file mode 100644
index 00000000..4711c279
--- /dev/null
+++ b/javascript/notification.js
@@ -0,0 +1,34 @@
+// Monitors the gallery and sends a browser notification when the leading image is new.
+
+let lastHeadImg = null;
+
+onUiUpdate(function(){
+ const galleryPreviews = gradioApp().querySelectorAll('img.h-full.w-full.overflow-hidden');
+
+ if (galleryPreviews == null) return;
+
+ const headImg = galleryPreviews[0]?.src;
+
+ if (headImg == null || headImg == lastHeadImg) return;
+
+ lastHeadImg = headImg;
+
+ if (document.hasFocus()) return;
+
+ // Multiple copies of the images are in the DOM when one is selected. Dedup with a Set to get the real number generated.
+ const imgs = new Set(Array.from(galleryPreviews).map(img => img.src));
+
+ const notification = new Notification(
+ 'Stable Diffusion',
+ {
+ body: `Generated ${imgs.size > 1 ? imgs.size - 1 : 1} image${imgs.size > 1 ? 's' : ''}`,
+ icon: headImg,
+ image: headImg,
+ }
+ );
+
+ notification.onclick = function(_){
+ parent.focus();
+ this.close();
+ };
+});
diff --git a/modules/images.py b/modules/images.py
index 530a8440..d1707263 100644
--- a/modules/images.py
+++ b/modules/images.py
@@ -245,34 +245,42 @@ def resize_image(resize_mode, im, width, height):
invalid_filename_chars = '<>:"/\\|?*\n'
+invalid_filename_prefix = ' '
+invalid_filename_postfix = ' .'
re_nonletters = re.compile(r'[\s'+string.punctuation+']+')
+max_filename_part_length = 128
+max_prompt_words = 8
def sanitize_filename_part(text, replace_spaces=True):
if replace_spaces:
text = text.replace(' ', '_')
- return text.translate({ord(x): '_' for x in invalid_filename_chars})[:128]
+ text = text.translate({ord(x): '_' for x in invalid_filename_chars})
+ text = text.lstrip(invalid_filename_prefix)[:max_filename_part_length]
+ text = text.rstrip(invalid_filename_postfix)
+ return text
def apply_filename_pattern(x, p, seed, prompt):
if seed is not None:
x = x.replace("[seed]", str(seed))
+
if prompt is not None:
- x = x.replace("[prompt]", sanitize_filename_part(prompt)[:128])
- x = x.replace("[prompt_spaces]", sanitize_filename_part(prompt, replace_spaces=False)[:128])
+ x = x.replace("[prompt]", sanitize_filename_part(prompt))
+ x = x.replace("[prompt_spaces]", sanitize_filename_part(prompt, replace_spaces=False))
if "[prompt_words]" in x:
words = [x for x in re_nonletters.split(prompt or "") if len(x) > 0]
if len(words) == 0:
words = ["empty"]
+ x = x.replace("[prompt_words]", sanitize_filename_part(" ".join(words[0:max_prompt_words]), replace_spaces=False))
- x = x.replace("[prompt_words]", " ".join(words[0:8]).strip())
if p is not None:
x = x.replace("[steps]", str(p.steps))
x = x.replace("[cfg]", str(p.cfg_scale))
x = x.replace("[width]", str(p.width))
x = x.replace("[height]", str(p.height))
- x = x.replace("[sampler]", sd_samplers.samplers[p.sampler_index].name)
+ x = x.replace("[sampler]", sanitize_filename_part(sd_samplers.samplers[p.sampler_index].name, replace_spaces=False))
x = x.replace("[model_hash]", shared.sd_model.sd_model_hash)
x = x.replace("[date]", datetime.date.today().isoformat())
diff --git a/modules/ui.py b/modules/ui.py
index 2c5422c7..ec6f247e 100644
--- a/modules/ui.py
+++ b/modules/ui.py
@@ -875,6 +875,14 @@ def create_ui(txt2img, img2img, run_extras, run_pnginfo):
outputs=[result]
)
+ request_notifications = gr.Button(value='Request browser notifications')
+ request_notifications.click(
+ fn=lambda: None,
+ inputs=[],
+ outputs=[],
+ _js='() => Notification.requestPermission()'
+ )
+
interfaces = [
(txt2img_interface, "txt2img", "txt2img"),
(img2img_interface, "img2img", "img2img"),