| 
									
										
										
										
											2022-10-24 17:23:51 +03:00
										 |  |  | import sys | 
					
						
							|  |  |  | import traceback | 
					
						
							|  |  |  | from collections import namedtuple | 
					
						
							|  |  |  | import inspect | 
					
						
							| 
									
										
										
										
											2022-10-22 12:23:45 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-24 17:23:51 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | def report_exception(c, job): | 
					
						
							|  |  |  |     print(f"Error executing callback {job} for {c.script}", file=sys.stderr) | 
					
						
							|  |  |  |     print(traceback.format_exc(), file=sys.stderr) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 13:12:44 +03:00
										 |  |  | class ImageSaveParams: | 
					
						
							|  |  |  |     def __init__(self, image, p, filename, pnginfo): | 
					
						
							|  |  |  |         self.image = image | 
					
						
							|  |  |  |         """the PIL image itself""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.p = p | 
					
						
							|  |  |  |         """p object with processing parameters; either StableDiffusionProcessing or an object with same fields""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.filename = filename | 
					
						
							|  |  |  |         """name of file that the image would be saved to""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.pnginfo = pnginfo | 
					
						
							|  |  |  |         """dictionary with parameters for image's PNG info data; infotext will have the key 'parameters'""" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-24 17:23:51 +03:00
										 |  |  | ScriptCallback = namedtuple("ScriptCallback", ["script", "callback"]) | 
					
						
							| 
									
										
										
										
											2022-10-22 12:23:45 +03:00
										 |  |  | callbacks_model_loaded = [] | 
					
						
							|  |  |  | callbacks_ui_tabs = [] | 
					
						
							| 
									
										
										
										
											2022-10-22 19:18:56 +03:00
										 |  |  | callbacks_ui_settings = [] | 
					
						
							| 
									
										
										
										
											2022-10-26 13:12:44 +03:00
										 |  |  | callbacks_before_image_saved = [] | 
					
						
							| 
									
										
										
										
											2022-10-24 01:17:09 -05:00
										 |  |  | callbacks_image_saved = [] | 
					
						
							| 
									
										
										
										
											2022-10-22 12:23:45 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 13:12:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-22 12:23:45 +03:00
										 |  |  | def clear_callbacks(): | 
					
						
							|  |  |  |     callbacks_model_loaded.clear() | 
					
						
							|  |  |  |     callbacks_ui_tabs.clear() | 
					
						
							| 
									
										
										
										
											2022-10-26 13:12:44 +03:00
										 |  |  |     callbacks_ui_settings.clear() | 
					
						
							|  |  |  |     callbacks_before_image_saved.clear() | 
					
						
							| 
									
										
										
										
											2022-10-24 01:17:09 -05:00
										 |  |  |     callbacks_image_saved.clear() | 
					
						
							| 
									
										
										
										
											2022-10-22 12:23:45 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def model_loaded_callback(sd_model): | 
					
						
							| 
									
										
										
										
											2022-10-24 17:23:51 +03:00
										 |  |  |     for c in callbacks_model_loaded: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             c.callback(sd_model) | 
					
						
							|  |  |  |         except Exception: | 
					
						
							|  |  |  |             report_exception(c, 'model_loaded_callback') | 
					
						
							| 
									
										
										
										
											2022-10-22 12:23:45 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def ui_tabs_callback(): | 
					
						
							|  |  |  |     res = [] | 
					
						
							| 
									
										
										
										
											2022-10-24 10:10:33 +08:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2022-10-24 17:23:51 +03:00
										 |  |  |     for c in callbacks_ui_tabs: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             res += c.callback() or [] | 
					
						
							|  |  |  |         except Exception: | 
					
						
							|  |  |  |             report_exception(c, 'ui_tabs_callback') | 
					
						
							| 
									
										
										
										
											2022-10-22 12:23:45 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return res | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-22 19:18:56 +03:00
										 |  |  | def ui_settings_callback(): | 
					
						
							| 
									
										
										
										
											2022-10-24 17:23:51 +03:00
										 |  |  |     for c in callbacks_ui_settings: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             c.callback() | 
					
						
							|  |  |  |         except Exception: | 
					
						
							|  |  |  |             report_exception(c, 'ui_settings_callback') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 13:12:44 +03:00
										 |  |  | def before_image_saved_callback(params: ImageSaveParams): | 
					
						
							| 
									
										
										
										
											2022-10-25 12:16:17 +03:00
										 |  |  |     for c in callbacks_image_saved: | 
					
						
							|  |  |  |         try: | 
					
						
							| 
									
										
										
										
											2022-10-26 13:12:44 +03:00
										 |  |  |             c.callback(params) | 
					
						
							|  |  |  |         except Exception: | 
					
						
							|  |  |  |             report_exception(c, 'before_image_saved_callback') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def image_saved_callback(params: ImageSaveParams): | 
					
						
							|  |  |  |     for c in callbacks_image_saved: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             c.callback(params) | 
					
						
							| 
									
										
										
										
											2022-10-25 12:16:17 +03:00
										 |  |  |         except Exception: | 
					
						
							|  |  |  |             report_exception(c, 'image_saved_callback') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-24 17:23:51 +03:00
										 |  |  | def add_callback(callbacks, fun): | 
					
						
							|  |  |  |     stack = [x for x in inspect.stack() if x.filename != __file__] | 
					
						
							|  |  |  |     filename = stack[0].filename if len(stack) > 0 else 'unknown file' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     callbacks.append(ScriptCallback(filename, fun)) | 
					
						
							| 
									
										
										
										
											2022-10-22 19:18:56 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-22 12:23:45 +03:00
										 |  |  | def on_model_loaded(callback): | 
					
						
							|  |  |  |     """register a function to be called when the stable diffusion model is created; the model is
 | 
					
						
							|  |  |  |     passed as an argument"""
 | 
					
						
							| 
									
										
										
										
											2022-10-24 17:23:51 +03:00
										 |  |  |     add_callback(callbacks_model_loaded, callback) | 
					
						
							| 
									
										
										
										
											2022-10-22 12:23:45 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def on_ui_tabs(callback): | 
					
						
							|  |  |  |     """register a function to be called when the UI is creating new tabs.
 | 
					
						
							|  |  |  |     The function must either return a None, which means no new tabs to be added, or a list, where | 
					
						
							|  |  |  |     each element is a tuple: | 
					
						
							|  |  |  |         (gradio_component, title, elem_id) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     gradio_component is a gradio component to be used for contents of the tab (usually gr.Blocks) | 
					
						
							|  |  |  |     title is tab text displayed to user in the UI | 
					
						
							|  |  |  |     elem_id is HTML id for the tab | 
					
						
							|  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2022-10-24 17:23:51 +03:00
										 |  |  |     add_callback(callbacks_ui_tabs, callback) | 
					
						
							| 
									
										
										
										
											2022-10-22 12:23:45 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-22 19:18:56 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | def on_ui_settings(callback): | 
					
						
							| 
									
										
										
										
											2022-10-22 19:19:17 +03:00
										 |  |  |     """register a function to be called before UI settings are populated; add your settings
 | 
					
						
							| 
									
										
										
										
											2022-10-22 19:18:56 +03:00
										 |  |  |     by using shared.opts.add_option(shared.OptionInfo(...)) """
 | 
					
						
							| 
									
										
										
										
											2022-10-25 12:16:17 +03:00
										 |  |  |     add_callback(callbacks_ui_settings, callback) | 
					
						
							| 
									
										
										
										
											2022-10-24 01:17:09 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 13:12:44 +03:00
										 |  |  | def on_before_image_saved(callback): | 
					
						
							|  |  |  |     """register a function to be called before an image is saved to a file.
 | 
					
						
							|  |  |  |     The callback is called with one argument: | 
					
						
							|  |  |  |         - params: ImageSaveParams - parameters the image is to be saved with. You can change fields in this object. | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     add_callback(callbacks_before_image_saved, callback) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-26 09:56:25 +03:00
										 |  |  | def on_image_saved(callback): | 
					
						
							| 
									
										
										
										
											2022-10-26 13:12:44 +03:00
										 |  |  |     """register a function to be called after an image is saved to a file.
 | 
					
						
							|  |  |  |     The callback is called with one argument: | 
					
						
							|  |  |  |         - params: ImageSaveParams - parameters the image was saved with. Changing fields in this object does nothing. | 
					
						
							| 
									
										
										
										
											2022-10-25 12:16:17 +03:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     add_callback(callbacks_image_saved, callback) |