Callback.gd 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. extends Object
  2. class_name Callback
  3. #
  4. static func ClearCallbacks(objectSignal : Signal):
  5. for connection in objectSignal.get_connections():
  6. RemoveCallback(objectSignal, connection["callable"])
  7. static func RemoveCallback(objectSignal : Signal, callback : Callable):
  8. if objectSignal.is_connected(callback):
  9. objectSignal.disconnect(callback)
  10. static func AddCallback(objectSignal : Signal, callback : Callable, args : Array):
  11. var bundledCallback : Callable = callback.bind(args) if callback == Callback.ShootCallback else callback.bindv(args)
  12. objectSignal.connect(bundledCallback)
  13. static func PlugCallback(objectSignal : Signal, callback : Callable, args : Array = []):
  14. RemoveCallback(objectSignal, callback)
  15. AddCallback(objectSignal, callback, args)
  16. static func ShootCallback(args : Array):
  17. if args.size() > 0 and args[0] is Callable:
  18. TriggerCallback(args.pop_front(), args)
  19. static func TriggerCallback(callback : Callable, args : Array = []):
  20. if callback and callback is Callable and not callback.is_null() and callback.is_valid():
  21. for argId in args.size():
  22. if not is_instance_valid(args[argId]) and typeof(args[argId]) == TYPE_NIL:
  23. args[argId] = null
  24. callback.callv(args)
  25. #
  26. static func OneShotCallback(objectSignal : Signal, callback : Callable, args : Array = []):
  27. PlugCallback(objectSignal, Callback.ShootCallback, [callback] + args)
  28. static func ClearOneShot(objectSignal : Signal):
  29. RemoveCallback(objectSignal, Callback.ShootCallback)
  30. #
  31. static func SelfDestructCallback(parent : Node, timer : Timer, callback : Callable, args : Array = []):
  32. if parent:
  33. parent.remove_child(timer)
  34. timer.queue_free()
  35. TriggerCallback(callback, args)
  36. #
  37. static func SelfDestructTimer(parent : Node, delay : float, callback : Callable = Callable(), args : Array = [], timerName = "") -> Timer:
  38. if delay <= 0.0:
  39. TriggerCallback(callback)
  40. elif parent:
  41. var timer : Timer = null if timerName.is_empty() else parent.get_node_or_null(timerName)
  42. if not timer:
  43. timer = Timer.new()
  44. timer.set_one_shot(true)
  45. timer.set_autostart(true)
  46. AddCallback(timer.timeout, Callback.SelfDestructCallback, [parent, timer, callback, args])
  47. if not timerName.is_empty():
  48. timer.name = timerName
  49. parent.add_child(timer)
  50. timer.start(delay)
  51. return timer
  52. return null
  53. #
  54. static func ResetTimer(timer : Timer, delay : float, callback : Callable):
  55. ClearTimer(timer)
  56. StartTimer(timer, delay, callback)
  57. static func ClearTimer(timer : Timer):
  58. if timer:
  59. for sig in timer.get_signal_list():
  60. for connection in timer.get_signal_connection_list(sig["name"]):
  61. Callback.RemoveCallback(timer.get(sig["name"]), connection["callable"])
  62. timer.stop()
  63. static func StartTimer(timer : Timer, delay : float, callback : Callable, oneShot : bool = false):
  64. if delay == 0.0:
  65. TriggerCallback(callback)
  66. elif timer:
  67. timer.start(delay)
  68. timer.set_autostart(true)
  69. if oneShot:
  70. OneShotCallback(timer.timeout, callback)
  71. else:
  72. PlugCallback(timer.timeout, callback)
  73. static func LoopTimer(timer : Timer, delay : float):
  74. assert(delay > 0, "Delay should never be null, infinite loop can happen on looped timers")
  75. assert(timer and not timer.timeout.get_connections().is_empty(), "Impossible to loop over an invalid timer or a missing timeout callback")
  76. if timer and delay > 0:
  77. timer.start(delay)
  78. static func Empty():
  79. pass