forked from Nekojimi/JackIt
34 lines
931 B
GDScript
34 lines
931 B
GDScript
extends RefCounted
|
|
class_name MultiAwait
|
|
|
|
var waiting_count: int = 0
|
|
var finished: bool = false
|
|
|
|
signal done(timed_out: bool)
|
|
|
|
func _init(signals: Array[Signal], timeout: float) -> void:
|
|
for sig in signals:
|
|
var err: int = sig.connect(receive_signal, CONNECT_ONE_SHOT)
|
|
if err == Error.OK:
|
|
waiting_count += 1
|
|
check_done()
|
|
var scene_tree: SceneTree = Engine.get_main_loop() as SceneTree
|
|
if scene_tree != null:
|
|
scene_tree.create_timer(timeout).timeout.connect(finish.bind(true))
|
|
print("MultiAwait: waiting for %d signals or %f seconds" % [waiting_count,timeout])
|
|
|
|
func receive_signal() -> void:
|
|
waiting_count -= 1
|
|
print("MultiAwait: got signal, %d signals left" % [waiting_count])
|
|
check_done()
|
|
|
|
func check_done() -> void:
|
|
if waiting_count <= 0:
|
|
finish(false)
|
|
|
|
func finish(timed_out: bool) -> void:
|
|
if !finished:
|
|
print("MultiAwait: done, timed_out: %s" % [timed_out])
|
|
done.emit(timed_out)
|
|
finished = true
|