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;
[Export]
public Variant Payload
{
get { return _payload; }
set
{
if (!_payload.Equals(value))
{
_lastPayload = _payload;
_payload = value;
ValueChangeHandler();
}
}
}
private Variant _payload;
private Variant _lastPayload;
///
/// 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(_payload);
}
}
///
/// Called when the Payload value changed.
///
public void ValueChangeHandler()
{
if(_showLog)
GD.Print($"Event payload changed from {_lastPayload} to {_payload} on event resource: " + ResourcePath.GetFile().TrimSuffix(".tres"));
foreach (var eventListener in _eventListeners)
{
eventListener.EventPayloadChanged(_payload, _lastPayload);
}
}
}