mirror of
https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
synced 2025-08-05 03:32:37 +00:00
added poor man's inpainting script
This commit is contained in:
@@ -18,6 +18,9 @@ class Script:
|
||||
def ui(self, is_img2img):
|
||||
pass
|
||||
|
||||
def show(self, is_img2img):
|
||||
return True
|
||||
|
||||
def run(self, *args):
|
||||
raise NotImplementedError()
|
||||
|
||||
@@ -25,7 +28,7 @@ class Script:
|
||||
return ""
|
||||
|
||||
|
||||
scripts = []
|
||||
scripts_data = []
|
||||
|
||||
|
||||
def load_scripts(basedir):
|
||||
@@ -49,10 +52,8 @@ def load_scripts(basedir):
|
||||
|
||||
for key, script_class in module.__dict__.items():
|
||||
if type(script_class) == type and issubclass(script_class, Script):
|
||||
obj = script_class()
|
||||
obj.filename = path
|
||||
scripts_data.append((script_class, path))
|
||||
|
||||
scripts.append(obj)
|
||||
except Exception:
|
||||
print(f"Error loading script: {filename}", file=sys.stderr)
|
||||
print(traceback.format_exc(), file=sys.stderr)
|
||||
@@ -69,52 +70,75 @@ def wrap_call(func, filename, funcname, *args, default=None, **kwargs):
|
||||
return default
|
||||
|
||||
|
||||
def setup_ui(is_img2img):
|
||||
titles = [wrap_call(script.title, script.filename, "title") or f"{script.filename} [error]" for script in scripts]
|
||||
class ScriptRunner:
|
||||
def __init__(self):
|
||||
self.scripts = []
|
||||
|
||||
dropdown = gr.Dropdown(label="Script", choices=["None"] + titles, value="None", type="index")
|
||||
def setup_ui(self, is_img2img):
|
||||
for script_class, path in scripts_data:
|
||||
script = script_class()
|
||||
script.filename = path
|
||||
|
||||
inputs = [dropdown]
|
||||
if not script.show(is_img2img):
|
||||
continue
|
||||
|
||||
for script in scripts:
|
||||
script.args_from = len(inputs)
|
||||
controls = script.ui(is_img2img)
|
||||
self.scripts.append(script)
|
||||
|
||||
for control in controls:
|
||||
control.visible = False
|
||||
titles = [wrap_call(script.title, script.filename, "title") or f"{script.filename} [error]" for script in self.scripts]
|
||||
|
||||
inputs += controls
|
||||
script.args_to = len(inputs)
|
||||
dropdown = gr.Dropdown(label="Script", choices=["None"] + titles, value="None", type="index")
|
||||
inputs = [dropdown]
|
||||
|
||||
def select_script(index):
|
||||
if index > 0:
|
||||
script = scripts[index-1]
|
||||
args_from = script.args_from
|
||||
args_to = script.args_to
|
||||
else:
|
||||
args_from = 0
|
||||
args_to = 0
|
||||
for script in self.scripts:
|
||||
script.args_from = len(inputs)
|
||||
|
||||
return [ui.gr_show(True if i == 0 else args_from <= i < args_to) for i in range(len(inputs))]
|
||||
controls = wrap_call(script.ui, script.filename, "ui", is_img2img)
|
||||
|
||||
dropdown.change(
|
||||
fn=select_script,
|
||||
inputs=[dropdown],
|
||||
outputs=inputs
|
||||
)
|
||||
if controls is None:
|
||||
continue
|
||||
|
||||
return inputs
|
||||
for control in controls:
|
||||
control.visible = False
|
||||
|
||||
inputs += controls
|
||||
script.args_to = len(inputs)
|
||||
|
||||
def select_script(script_index):
|
||||
if 0 < script_index <= len(self.scripts):
|
||||
script = self.scripts[script_index-1]
|
||||
args_from = script.args_from
|
||||
args_to = script.args_to
|
||||
else:
|
||||
args_from = 0
|
||||
args_to = 0
|
||||
|
||||
return [ui.gr_show(True if i == 0 else args_from <= i < args_to) for i in range(len(inputs))]
|
||||
|
||||
dropdown.change(
|
||||
fn=select_script,
|
||||
inputs=[dropdown],
|
||||
outputs=inputs
|
||||
)
|
||||
|
||||
return inputs
|
||||
|
||||
|
||||
def run(p: StableDiffusionProcessing, *args):
|
||||
script_index = args[0] - 1
|
||||
def run(self, p: StableDiffusionProcessing, *args):
|
||||
script_index = args[0]
|
||||
|
||||
if script_index < 0 or script_index >= len(scripts):
|
||||
return None
|
||||
if script_index == 0:
|
||||
return None
|
||||
|
||||
script = scripts[script_index]
|
||||
script = self.scripts[script_index-1]
|
||||
|
||||
script_args = args[script.args_from:script.args_to]
|
||||
processed = script.run(p, *script_args)
|
||||
if script is None:
|
||||
return None
|
||||
|
||||
return processed
|
||||
script_args = args[script.args_from:script.args_to]
|
||||
processed = script.run(p, *script_args)
|
||||
|
||||
return processed
|
||||
|
||||
|
||||
scripts_txt2img = ScriptRunner()
|
||||
scripts_img2img = ScriptRunner()
|
||||
|
Reference in New Issue
Block a user