using System.Collections.Generic; using Godot; namespace Babushka.scripts.CSharp.Low_Code.Events; /// /// Represents an event in the project space. /// Can be called by and subscribed to by . /// [GlobalClass] [Tool] public partial class EventResource : Resource { /// /// Log into console when this event resource is adding or removing listeners, and when it's raised. /// [Export] private bool _showLog; /// /// Raise-Button Call with Editor Export for easier debugging. /// Beware: This will only work with custom event listeners that register at edit-time. /// Standard register and deregister during playtime. /// [ExportToolButton("Raise")] Callable _raiseAction => Callable.From(Raise); private List _eventListeners = new (); /// /// Adds an EventListener to the calling list for this event. /// /// public void RegisterListener(EventListener listener) { if(_showLog) GD.Print("Registering listener " + listener); _eventListeners.Add(listener); } /// /// Removes an Eventlistener from the calling list for this event. /// /// public void UnregisterListener(EventListener listener) { if(_showLog) GD.Print("Unregistering listener " + listener); _eventListeners.Remove(listener); } /// /// Raises this event on all current listeners. /// public void Raise() { if(_showLog) GD.Print("Raising event: " + ResourcePath.GetFile().TrimSuffix(".tres")); foreach (var eventListener in _eventListeners) { eventListener.EventInvoked(); } } }