// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
#if UNITY_EDITOR && UNITY_IMGUI
using UnityEditor;
using UnityEngine;
namespace Animancer.Editor
{
/// [Editor-Only] A custom Inspector for s.
/// https://kybernetik.com.au/animancer/api/Animancer.Editor/AnimancerEventInvokerEditor
///
[CustomEditor(typeof(AnimancerEvent.Invoker), true), CanEditMultipleObjects]
public class AnimancerEventInvokerEditor : UnityEditor.Editor
{
/************************************************************************************************************************/
private readonly Field[]
Fields = new Field[100];
private struct Field
{
public FastObjectField component;
public FastObjectField state;
}
/************************************************************************************************************************/
///
public override void OnInspectorGUI()
{
if (target is Behaviour behaviour &&
!behaviour.enabled)
{
EditorGUILayout.HelpBox(
"This component is disabled so it won't invoke any events.",
MessageType.Warning);
}
int index = 0;
var isLayoutEvent = Event.current.type == EventType.Layout;
var enumerator = AnimancerEvent.Invoker.EnumerateInvocationQueue();
while (enumerator.MoveNext())
{
if (index < Fields.Length)
{
var invocation = enumerator.Current;
if (invocation.State == null)
{
GUILayout.Label("State is Null");
return;
}
ref var field = ref Fields[index];
var area = AnimancerGUI.LayoutSingleLineRect();
var labelArea = AnimancerGUI.StealFromLeft(ref area, EditorGUIUtility.labelWidth);
labelArea = EditorGUI.IndentedRect(labelArea);
if (isLayoutEvent)
{
field.component.SetValue(invocation.State.Graph?.Component);
field.state.SetValue(invocation.State, invocation.State.GetPath());
}
field.component.Draw(labelArea);
field.state.Draw(area);
EditorGUI.indentLevel++;
EditorGUILayout.LabelField("Event Name", invocation.Name);
EditorGUILayout.LabelField("Normalized Time", invocation.Event.normalizedTime.ToString());
NamedEventDictionaryDrawer.DoEventGUI("Direct Callback", invocation.Event.callback);
NamedEventDictionaryDrawer.DoEventGUI("Bound Callback", invocation.GetBoundCallback());
EditorGUI.indentLevel--;
}
index++;
}
if (index > Fields.Length)
GUILayout.Label($"And {index - Fields.Length} more events.");
Repaint();
}
/************************************************************************************************************************/
}
}
#endif