From 4cda244c437e66e6aa9b697e8323325d190d3358 Mon Sep 17 00:00:00 2001 From: oasin Date: Mon, 13 Jan 2025 17:29:39 +0800 Subject: [PATCH] feat: support generating `CancellationToken` that cancels on any signal --- .../addons/R3.Godot/GodotSignalMapper.cs | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/R3.Godot/addons/R3.Godot/GodotSignalMapper.cs b/src/R3.Godot/addons/R3.Godot/GodotSignalMapper.cs index 22f56611..f35152f7 100644 --- a/src/R3.Godot/addons/R3.Godot/GodotSignalMapper.cs +++ b/src/R3.Godot/addons/R3.Godot/GodotSignalMapper.cs @@ -6,72 +6,72 @@ namespace R3; public static class GodotObjectExtensions { - /// Returns a that cancels when emits . - public static CancellationToken CancelOnExitTree(this Node node) + /// Returns a that cancels when emits the specified signal, this cancellation is one-shot unless is false. + public static CancellationToken CancelOnSignal(this GodotObject obj, StringName signalName, bool oneShot = true) { CancellationTokenSource cts = new(); - node.Connect(Node.SignalName.TreeExited, Callable.From(cts.Cancel), (uint) GodotObject.ConnectFlags.OneShot); + obj.Connect(signalName, Callable.From(cts.Cancel), oneShot ? (uint) GodotObject.ConnectFlags.OneShot : 0); return cts.Token; } /// Returns an observable that: publishes a when emits the specified signal (except for ); finishes when emits . public static Observable SignalAsObservable(this Node node, StringName signalName) { - return node.SignalAsObservable(signalName, node.CancelOnExitTree()); + return node.SignalAsObservable(signalName, node.CancelOnSignal(Node.SignalName.TreeExited)); } /// Returns an observable that: publishes data of type when emits the specified signal (except for ); finishes when emits . public static Observable SignalAsObservable<[MustBeVariant] T>(this Node node, StringName signalName) { - return node.SignalAsObservable(signalName, node.CancelOnExitTree()); + return node.SignalAsObservable(signalName, node.CancelOnSignal(Node.SignalName.TreeExited)); } /// Returns an observable that: publishes a tuple (, ) when emits the specified signal (except for ); finishes when emits . public static Observable<(T0, T1)> SignalAsObservable<[MustBeVariant] T0, [MustBeVariant] T1>(this Node node, StringName signalName) { - return node.SignalAsObservable(signalName, node.CancelOnExitTree()); + return node.SignalAsObservable(signalName, node.CancelOnSignal(Node.SignalName.TreeExited)); } /// Returns an observable that: publishes a tuple (, , ) when emits the specified signal (except for ); finishes when emits . public static Observable<(T0, T1, T2)> SignalAsObservable<[MustBeVariant] T0, [MustBeVariant] T1, [MustBeVariant] T2>(this Node node, StringName signalName) { - return node.SignalAsObservable(signalName, node.CancelOnExitTree()); + return node.SignalAsObservable(signalName, node.CancelOnSignal(Node.SignalName.TreeExited)); } /// Returns an observable that: publishes a tuple (, , , ) when emits the specified signal (except for ); finishes when emits . public static Observable<(T0, T1, T2, T3)> SignalAsObservable<[MustBeVariant] T0, [MustBeVariant] T1, [MustBeVariant] T2, [MustBeVariant] T3>(this Node node, StringName signalName) { - return node.SignalAsObservable(signalName, node.CancelOnExitTree()); + return node.SignalAsObservable(signalName, node.CancelOnSignal(Node.SignalName.TreeExited)); } /// Returns an observable that: publishes a tuple (, , , , ) when emits the specified signal (except for ); finishes when emits . public static Observable<(T0, T1, T2, T3, T4)> SignalAsObservable<[MustBeVariant] T0, [MustBeVariant] T1, [MustBeVariant] T2, [MustBeVariant] T3, [MustBeVariant] T4>(this Node node, StringName signalName) { - return node.SignalAsObservable(signalName, node.CancelOnExitTree()); + return node.SignalAsObservable(signalName, node.CancelOnSignal(Node.SignalName.TreeExited)); } /// Returns an observable that: publishes a tuple (, , , , , ) when emits the specified signal (except for ); finishes when emits . public static Observable<(T0, T1, T2, T3, T4, T5)> SignalAsObservable<[MustBeVariant] T0, [MustBeVariant] T1, [MustBeVariant] T2, [MustBeVariant] T3, [MustBeVariant] T4, [MustBeVariant] T5>(this Node node, StringName signalName) { - return node.SignalAsObservable(signalName, node.CancelOnExitTree()); + return node.SignalAsObservable(signalName, node.CancelOnSignal(Node.SignalName.TreeExited)); } /// Returns an observable that: publishes a tuple (, , , , , , ) when emits the specified signal (except for ); finishes when emits . public static Observable<(T0, T1, T2, T3, T4, T5, T6)> SignalAsObservable<[MustBeVariant] T0, [MustBeVariant] T1, [MustBeVariant] T2, [MustBeVariant] T3, [MustBeVariant] T4, [MustBeVariant] T5, [MustBeVariant] T6>(this Node node, StringName signalName) { - return node.SignalAsObservable(signalName, node.CancelOnExitTree()); + return node.SignalAsObservable(signalName, node.CancelOnSignal(Node.SignalName.TreeExited)); } /// Returns an observable that: publishes a tuple (, , , , , , , ) when emits the specified signal (except for ); finishes when emits . public static Observable<(T0, T1, T2, T3, T4, T5, T6, T7)> SignalAsObservable<[MustBeVariant] T0, [MustBeVariant] T1, [MustBeVariant] T2, [MustBeVariant] T3, [MustBeVariant] T4, [MustBeVariant] T5, [MustBeVariant] T6, [MustBeVariant] T7>(this Node node, StringName signalName) { - return node.SignalAsObservable(signalName, node.CancelOnExitTree()); + return node.SignalAsObservable(signalName, node.CancelOnSignal(Node.SignalName.TreeExited)); } /// Returns an observable that: publishes a tuple (, , , , , , , , ) when emits the specified signal (except for ); finishes when emits . public static Observable<(T0, T1, T2, T3, T4, T5, T6, T7, T8)> SignalAsObservable<[MustBeVariant] T0, [MustBeVariant] T1, [MustBeVariant] T2, [MustBeVariant] T3, [MustBeVariant] T4, [MustBeVariant] T5, [MustBeVariant] T6, [MustBeVariant] T7, [MustBeVariant] T8>(this Node node, StringName signalName) { - return node.SignalAsObservable(signalName, node.CancelOnExitTree()); + return node.SignalAsObservable(signalName, node.CancelOnSignal(Node.SignalName.TreeExited)); } /// Returns an observable that: publishes a when emits the specified signal; finishes when cancels, or when all subscriptions are disposed, if only is default (= ).