File tree Expand file tree Collapse file tree 2 files changed +29
-1
lines changed
itest/rust/src/object_tests Expand file tree Collapse file tree 2 files changed +29
-1
lines changed Original file line number Diff line number Diff line change @@ -444,6 +444,23 @@ impl<T: GodotClass> Gd<T> {
444
444
} )
445
445
}
446
446
447
+ /// Runs the given Closure deferred.
448
+ ///
449
+ /// This can be a type-safe alternative to [`classes::Object::call_deferred`], but does not handle dynamic dispatch, unless explicitly used.
450
+ /// This constructor only allows the callable to be invoked from the same thread as creating it.The closure receives a reference to this object back.
451
+ #[ cfg( since_api = "4.2" ) ]
452
+ pub fn apply_deferred < F > ( & mut self , mut rust_function : F )
453
+ where
454
+ F : FnMut ( Gd < T > ) + ' static ,
455
+ {
456
+ let this = self . clone ( ) ;
457
+ let callable = Callable :: from_local_fn ( "apply_deferred" , move |_| {
458
+ rust_function ( this. clone ( ) ) ;
459
+ Ok ( Variant :: nil ( ) )
460
+ } ) ;
461
+ callable. call_deferred ( & [ ] ) ;
462
+ }
463
+
447
464
/// Returns `Ok(cast_obj)` on success, `Err(self)` on error.
448
465
// Visibility: used by DynGd.
449
466
pub ( crate ) fn owned_cast < U > ( self ) -> Result < Gd < U > , Self >
Original file line number Diff line number Diff line change @@ -67,9 +67,20 @@ impl INode for DeferredTestNode {
67
67
fn calls_method_names_deferred ( ctx : & crate :: framework:: TestContext ) -> TaskHandle {
68
68
let mut test_node = DeferredTestNode :: new_alloc ( ) ;
69
69
ctx. scene_tree . clone ( ) . add_child ( & test_node) ;
70
-
70
+
71
71
test_node. call_deferred ( "accept" , & [ ] ) ;
72
72
73
73
let handle = test_node. bind ( ) . as_expectation_task ( ) ;
74
74
handle
75
75
}
76
+
77
+ #[ itest( async ) ]
78
+ fn calls_closure_deferred ( ctx : & crate :: framework:: TestContext ) -> TaskHandle {
79
+ let mut test_node = DeferredTestNode :: new_alloc ( ) ;
80
+ ctx. scene_tree . clone ( ) . add_child ( & test_node) ;
81
+
82
+ test_node. apply_deferred ( |mut this| this. bind_mut ( ) . accept ( ) ) ;
83
+
84
+ let handle = test_node. bind ( ) . as_expectation_task ( ) ;
85
+ handle
86
+ }
You can’t perform that action at this time.
0 commit comments