Commit cda2f0a1 authored by AUTOMATIC1111's avatar AUTOMATIC1111
Browse files

make on_before_component/on_after_component possible earlier

parent aeb76ef1
Loading
Loading
Loading
Loading
+25 −10
Original line number Diff line number Diff line
@@ -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