mirror of
https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
synced 2025-08-03 19:02:27 +00:00
add UI for reordering callbacks
This commit is contained in:
@@ -138,7 +138,6 @@ class Script:
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
def before_process(self, p, *args):
|
||||
"""
|
||||
This function is called very early during processing begins for AlwaysVisible scripts.
|
||||
@@ -562,6 +561,25 @@ class ScriptRunner:
|
||||
self.paste_field_names = []
|
||||
self.inputs = [None]
|
||||
|
||||
self.callback_map = {}
|
||||
self.callback_names = [
|
||||
'before_process',
|
||||
'process',
|
||||
'before_process_batch',
|
||||
'after_extra_networks_activate',
|
||||
'process_batch',
|
||||
'postprocess',
|
||||
'postprocess_batch',
|
||||
'postprocess_batch_list',
|
||||
'post_sample',
|
||||
'on_mask_blend',
|
||||
'postprocess_image',
|
||||
'postprocess_maskoverlay',
|
||||
'postprocess_image_after_composite',
|
||||
'before_component',
|
||||
'after_component',
|
||||
]
|
||||
|
||||
self.on_before_component_elem_id = {}
|
||||
"""dict of callbacks to be called before an element is created; key=elem_id, value=list of callbacks"""
|
||||
|
||||
@@ -600,6 +618,8 @@ class ScriptRunner:
|
||||
self.scripts.append(script)
|
||||
self.selectable_scripts.append(script)
|
||||
|
||||
self.callback_map.clear()
|
||||
|
||||
self.apply_on_before_component_callbacks()
|
||||
|
||||
def apply_on_before_component_callbacks(self):
|
||||
@@ -769,8 +789,42 @@ class ScriptRunner:
|
||||
|
||||
return processed
|
||||
|
||||
def list_scripts_for_method(self, method_name):
|
||||
if method_name in ('before_component', 'after_component'):
|
||||
return self.scripts
|
||||
else:
|
||||
return self.alwayson_scripts
|
||||
|
||||
def create_ordered_callbacks_list(self, method_name, *, enable_user_sort=True):
|
||||
script_list = self.list_scripts_for_method(method_name)
|
||||
category = f'script_{method_name}'
|
||||
callbacks = []
|
||||
|
||||
for script in script_list:
|
||||
if getattr(script.__class__, method_name, None) == getattr(Script, method_name, None):
|
||||
continue
|
||||
|
||||
script_callbacks.add_callback(callbacks, script, category=category, name=script.__class__.__name__, filename=script.filename)
|
||||
|
||||
return script_callbacks.sort_callbacks(category, callbacks, enable_user_sort=enable_user_sort)
|
||||
|
||||
def ordered_callbacks(self, method_name, *, enable_user_sort=True):
|
||||
script_list = self.list_scripts_for_method(method_name)
|
||||
category = f'script_{method_name}'
|
||||
|
||||
scrpts_len, callbacks = self.callback_map.get(category, (-1, None))
|
||||
|
||||
if callbacks is None or scrpts_len != len(script_list):
|
||||
callbacks = self.create_ordered_callbacks_list(method_name, enable_user_sort=enable_user_sort)
|
||||
self.callback_map[category] = len(script_list), callbacks
|
||||
|
||||
return callbacks
|
||||
|
||||
def ordered_scripts(self, method_name):
|
||||
return [x.callback for x in self.ordered_callbacks(method_name)]
|
||||
|
||||
def before_process(self, p):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('before_process'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.before_process(p, *script_args)
|
||||
@@ -778,7 +832,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running before_process: {script.filename}", exc_info=True)
|
||||
|
||||
def process(self, p):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('process'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.process(p, *script_args)
|
||||
@@ -786,7 +840,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running process: {script.filename}", exc_info=True)
|
||||
|
||||
def before_process_batch(self, p, **kwargs):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('before_process_batch'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.before_process_batch(p, *script_args, **kwargs)
|
||||
@@ -794,7 +848,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running before_process_batch: {script.filename}", exc_info=True)
|
||||
|
||||
def after_extra_networks_activate(self, p, **kwargs):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('after_extra_networks_activate'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.after_extra_networks_activate(p, *script_args, **kwargs)
|
||||
@@ -802,7 +856,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running after_extra_networks_activate: {script.filename}", exc_info=True)
|
||||
|
||||
def process_batch(self, p, **kwargs):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('process_batch'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.process_batch(p, *script_args, **kwargs)
|
||||
@@ -810,7 +864,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running process_batch: {script.filename}", exc_info=True)
|
||||
|
||||
def postprocess(self, p, processed):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('postprocess'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.postprocess(p, processed, *script_args)
|
||||
@@ -818,7 +872,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running postprocess: {script.filename}", exc_info=True)
|
||||
|
||||
def postprocess_batch(self, p, images, **kwargs):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('postprocess_batch'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.postprocess_batch(p, *script_args, images=images, **kwargs)
|
||||
@@ -826,7 +880,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running postprocess_batch: {script.filename}", exc_info=True)
|
||||
|
||||
def postprocess_batch_list(self, p, pp: PostprocessBatchListArgs, **kwargs):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('postprocess_batch_list'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.postprocess_batch_list(p, pp, *script_args, **kwargs)
|
||||
@@ -834,7 +888,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running postprocess_batch_list: {script.filename}", exc_info=True)
|
||||
|
||||
def post_sample(self, p, ps: PostSampleArgs):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('post_sample'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.post_sample(p, ps, *script_args)
|
||||
@@ -842,7 +896,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running post_sample: {script.filename}", exc_info=True)
|
||||
|
||||
def on_mask_blend(self, p, mba: MaskBlendArgs):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('on_mask_blend'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.on_mask_blend(p, mba, *script_args)
|
||||
@@ -850,7 +904,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running post_sample: {script.filename}", exc_info=True)
|
||||
|
||||
def postprocess_image(self, p, pp: PostprocessImageArgs):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('postprocess_image'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.postprocess_image(p, pp, *script_args)
|
||||
@@ -858,7 +912,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running postprocess_image: {script.filename}", exc_info=True)
|
||||
|
||||
def postprocess_maskoverlay(self, p, ppmo: PostProcessMaskOverlayArgs):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('postprocess_maskoverlay'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.postprocess_maskoverlay(p, ppmo, *script_args)
|
||||
@@ -866,7 +920,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running postprocess_image: {script.filename}", exc_info=True)
|
||||
|
||||
def postprocess_image_after_composite(self, p, pp: PostprocessImageArgs):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('postprocess_image_after_composite'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.postprocess_image_after_composite(p, pp, *script_args)
|
||||
@@ -880,7 +934,7 @@ class ScriptRunner:
|
||||
except Exception:
|
||||
errors.report(f"Error running on_before_component: {script.filename}", exc_info=True)
|
||||
|
||||
for script in self.scripts:
|
||||
for script in self.ordered_scripts('before_component'):
|
||||
try:
|
||||
script.before_component(component, **kwargs)
|
||||
except Exception:
|
||||
@@ -893,7 +947,7 @@ class ScriptRunner:
|
||||
except Exception:
|
||||
errors.report(f"Error running on_after_component: {script.filename}", exc_info=True)
|
||||
|
||||
for script in self.scripts:
|
||||
for script in self.ordered_scripts('after_component'):
|
||||
try:
|
||||
script.after_component(component, **kwargs)
|
||||
except Exception:
|
||||
@@ -921,7 +975,7 @@ class ScriptRunner:
|
||||
self.scripts[si].args_to = args_to
|
||||
|
||||
def before_hr(self, p):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('before_hr'):
|
||||
try:
|
||||
script_args = p.script_args[script.args_from:script.args_to]
|
||||
script.before_hr(p, *script_args)
|
||||
@@ -929,7 +983,7 @@ class ScriptRunner:
|
||||
errors.report(f"Error running before_hr: {script.filename}", exc_info=True)
|
||||
|
||||
def setup_scrips(self, p, *, is_ui=True):
|
||||
for script in self.alwayson_scripts:
|
||||
for script in self.ordered_scripts('setup'):
|
||||
if not is_ui and script.setup_for_ui_only:
|
||||
continue
|
||||
|
||||
|
Reference in New Issue
Block a user