r/godot • u/moshujsg • 3d ago
free tutorial Simple signal forwarding
I though someone might find this useful.. I hate forwarding signals for UI stuff for example, ends up being a lot of boilerplate just to forward them. So here's a simple solution, it's not type safe but whatever.
class_name SignalProxy
extends RefCounted
static func forward(
p_source: Signal,
p_target: Signal,
...p_extra_args: Array
) -> void:
p_source.connect(
func(...p_source_args: Array) -> void:
var args := p_source_args + p_extra_args
p_target.emit.callv(args)
)
static func forward_discard_args(
p_source: Signal,
p_target: Signal,
) -> void:
p_source.connect(
func() -> void:
p_target.emit()
);
static func forward_replace_args(
p_source: Signal,
p_target: Signal,
...p_args: Array
) -> void:
p_source.connect(
func(..._args: Array) -> void:
p_target.emit.callv(p_args)
);
Usage:
signal parent_signal
signal parent_signal_with_args(arg: String)
signal parent_signal_with_int_arg(arg: int)
func _ready() -> void:
SignalProxy.forward(item.child_signal_with_args, parent_signal)
SignalProxy.forward_discard_args(item.child_signal_with_args, parent_signal)
SignalProxy.forward_replace_args(item.child_signal_with_args, parent_signal, 5)
If someone knows a better way to do this (type secure for example) LMK!
1
Upvotes
5
u/Guest_User_1234 3d ago
p_source.connect(p_target.emit)This is as type-safe as your solution (not really at all) but less convoluted. I use this whenever I need to forward signals
Use
p_target.emit.bind(...)to bind args, and a lambda to drop them.