Callback.gd 3.1 KB

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