Commit 99d728b5 authored by Tony Beeman's avatar Tony Beeman Committed by AUTOMATIC1111

Add Iterate Button and Improve PFF UI

parent af73cf50
import copy import copy
import math import math
import os import os
import random
import sys import sys
import traceback import traceback
import shlex import shlex
...@@ -81,32 +82,34 @@ def cmdargs(line): ...@@ -81,32 +82,34 @@ def cmdargs(line):
return res return res
def load_prompt_file(file):
if (file is None):
lines = []
else:
lines = [x.strip() for x in file.decode('utf8', errors='ignore').split("\n")]
return None, "\n".join(lines), gr.update(lines=7)
class Script(scripts.Script): class Script(scripts.Script):
def title(self): def title(self):
return "Prompts from file or textbox" return "Prompts from file or textbox"
def ui(self, is_img2img): def ui(self, is_img2img):
# This checkbox would look nicer as two tabs, but there are two problems: checkbox_iterate = gr.Checkbox(label="Iterate seed every line", value=False)
# 1) There is a bug in Gradio 3.3 that prevents visibility from working on Tabs
# 2) Even with Gradio 3.3.1, returning a control (like Tabs) that can't be used as input prompt_txt = gr.Textbox(label="List of prompt inputs", lines=1)
# causes a AttributeError: 'Tabs' object has no attribute 'preprocess' assert, file = gr.File(label="Upload prompt inputs", type='bytes')
# due to the way Script assumes all controls returned can be used as inputs.
# Therefore, there's no good way to use grouping components right now, file.change(fn=load_prompt_file, inputs=[file], outputs=[file, prompt_txt, prompt_txt])
# so we will use a checkbox! :)
checkbox_txt = gr.Checkbox(label="Show Textbox", value=False) # We start at one line. When the text changes, we jump to seven lines, or two lines if no \n.
file = gr.File(label="File with inputs", type='bytes') # We don't shrink back to 1, because that causes the control to ignore [enter], and it may
prompt_txt = gr.TextArea(label="Prompts") # be unclear to the user that shift-enter is needed.
checkbox_txt.change(fn=lambda x: [gr.File.update(visible = not x), gr.TextArea.update(visible = x)], inputs=[checkbox_txt], outputs=[file, prompt_txt]) prompt_txt.change(lambda tb: gr.update(lines=7) if ("\n" in tb) else gr.update(lines=2), inputs=[prompt_txt], outputs=[prompt_txt])
return [checkbox_txt, file, prompt_txt] return [checkbox_iterate, file, prompt_txt]
def on_show(self, checkbox_txt, file, prompt_txt): def run(self, p, checkbox_iterate, file, prompt_txt: str):
return [ gr.Checkbox.update(visible = True), gr.File.update(visible = not checkbox_txt), gr.TextArea.update(visible = checkbox_txt) ]
def run(self, p, checkbox_txt, data: bytes, prompt_txt: str):
if checkbox_txt:
lines = [x.strip() for x in prompt_txt.splitlines()] lines = [x.strip() for x in prompt_txt.splitlines()]
else:
lines = [x.strip() for x in data.decode('utf8', errors='ignore').split("\n")]
lines = [x for x in lines if len(x) > 0] lines = [x for x in lines if len(x) > 0]
p.do_not_save_grid = True p.do_not_save_grid = True
...@@ -134,6 +137,9 @@ class Script(scripts.Script): ...@@ -134,6 +137,9 @@ class Script(scripts.Script):
jobs.append(args) jobs.append(args)
print(f"Will process {len(lines)} lines in {job_count} jobs.") print(f"Will process {len(lines)} lines in {job_count} jobs.")
if (checkbox_iterate and p.seed == -1):
p.seed = int(random.randrange(4294967294))
state.job_count = job_count state.job_count = job_count
images = [] images = []
...@@ -147,4 +153,8 @@ class Script(scripts.Script): ...@@ -147,4 +153,8 @@ class Script(scripts.Script):
proc = process_images(copy_p) proc = process_images(copy_p)
images += proc.images images += proc.images
if (checkbox_iterate):
p.seed = p.seed + (p.batch_size * p.n_iter)
return Processed(p, images, p.seed, "") return Processed(p, images, p.seed, "")
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment