Skip to main content

Pipeline Events

SaveFlowPipelineSignals bridges SaveFlow lifecycle events into Godot signals.

Use it when a scene wants save/load feedback without subclassing Sources.

Signals

pipeline_event(event: SaveFlowPipelineEvent)
before_save(event: SaveFlowPipelineEvent)
after_gather(event: SaveFlowPipelineEvent)
before_write(event: SaveFlowPipelineEvent)
after_write(event: SaveFlowPipelineEvent)
before_load(event: SaveFlowPipelineEvent)
after_read(event: SaveFlowPipelineEvent)
before_apply(event: SaveFlowPipelineEvent)
after_load(event: SaveFlowPipelineEvent)
before_save_scope(event: SaveFlowPipelineEvent)
after_save_scope(event: SaveFlowPipelineEvent)
before_load_scope(event: SaveFlowPipelineEvent)
after_load_scope(event: SaveFlowPipelineEvent)
before_gather_source(event: SaveFlowPipelineEvent)
after_gather_source(event: SaveFlowPipelineEvent)
before_apply_source(event: SaveFlowPipelineEvent)
after_apply_source(event: SaveFlowPipelineEvent)
pipeline_error(event: SaveFlowPipelineEvent)

Listen Modes

SaveFlowPipelineSignals.ListenMode.OWNER_ONLY
SaveFlowPipelineSignals.ListenMode.OWNER_AND_DESCENDANTS
SaveFlowPipelineSignals.ListenMode.ALL_PIPELINE_EVENTS

Use OWNER_ONLY for local Source/Scope feedback. Use OWNER_AND_DESCENDANTS for domain-level feedback. Use ALL_PIPELINE_EVENTS for global debug overlays.

Event Object

Each signal receives SaveFlowPipelineEvent.

Use:

event.describe() -> Dictionary

The described payload is the safest way to inspect event details in UI/debug code because event internals can grow over time.

Example:

func _on_after_write(event: SaveFlowPipelineEvent) -> void:
var info := event.describe()
print("Saved slot: ", info.get("slot_id", ""))

Pipeline signal nodes are not serialized by SaveFlowNodeSource. They are lifecycle helpers, not gameplay state.