瀏覽代碼

make on_before_component/on_after_component possible earlier

AUTOMATIC1111 2 年之前
父節點
當前提交
cda2f0a162
共有 1 個文件被更改,包括 25 次插入10 次删除
  1. 25 10
      modules/scripts.py

+ 25 - 10
modules/scripts.py

@@ -239,6 +239,8 @@ class Script:
         """
         Calls callback before a component is created. The callback function is called with a single argument of type OnComponent.
 
+        May be called in show() or ui() - but it may be too late in latter as some components may already be created.
+
         This function is an alternative to before_component in that it also cllows to run before a component is created, but
         it doesn't require to be called for every created component - just for the one you need.
         """
@@ -445,6 +447,28 @@ class ScriptRunner:
                 self.scripts.append(script)
                 self.selectable_scripts.append(script)
 
+        self.apply_on_before_component_callbacks()
+
+    def apply_on_before_component_callbacks(self):
+        for script in self.scripts:
+            on_before = script.on_before_component_elem_id or []
+            on_after = script.on_after_component_elem_id or []
+
+            for elem_id, callback in on_before:
+                if elem_id not in self.on_before_component_elem_id:
+                    self.on_before_component_elem_id[elem_id] = []
+
+                self.on_before_component_elem_id[elem_id].append((callback, script))
+
+            for elem_id, callback in on_after:
+                if elem_id not in self.on_after_component_elem_id:
+                    self.on_after_component_elem_id[elem_id] = []
+
+                self.on_after_component_elem_id[elem_id].append((callback, script))
+
+            on_before.clear()
+            on_after.clear()
+
     def create_script_ui(self, script):
         import modules.api.models as api_models
 
@@ -555,16 +579,7 @@ class ScriptRunner:
         self.infotext_fields.append((dropdown, lambda x: gr.update(value=x.get('Script', 'None'))))
         self.infotext_fields.extend([(script.group, onload_script_visibility) for script in self.selectable_scripts])
 
-        for script in self.scripts:
-            for elem_id, callback in script.on_before_component_elem_id or []:
-                items = self.on_before_component_elem_id.get(elem_id, [])
-                items.append((callback, script))
-                self.on_before_component_elem_id[elem_id] = items
-
-            for elem_id, callback in script.on_after_component_elem_id or []:
-                items = self.on_after_component_elem_id.get(elem_id, [])
-                items.append((callback, script))
-                self.on_after_component_elem_id[elem_id] = items
+        self.apply_on_before_component_callbacks()
 
         return self.inputs