// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik // #if UNITY_EDITOR && UNITY_IMGUI using UnityEditor; using UnityEngine; namespace Animancer.Editor { /// /// https://kybernetik.com.au/animancer/api/Animancer.Editor/DirectionalClipTransitionDrawer [CustomPropertyDrawer(typeof(DirectionalClipTransition), true)] public class DirectionalClipTransitionDrawer : TransitionDrawer { /************************************************************************************************************************/ /// Creates a new . public DirectionalClipTransitionDrawer() : base(DirectionalClipTransition.AnimationSetField) { } /************************************************************************************************************************/ /// protected override void DoChildPropertyGUI( ref Rect area, SerializedProperty rootProperty, SerializedProperty property, GUIContent label) { var width = area.width; var path = property.propertyPath; if (path.EndsWith($".{ClipTransition.ClipFieldName}")) { if (property.objectReferenceValue != null) { var removeArea = AnimancerGUI.StealFromRight( ref area, AnimancerGUI.LineHeight, AnimancerGUI.StandardSpacing); var removeContent = AnimancerIcons.ClearIcon( $"A {nameof(DirectionalClipTransition)}" + $" will get its Clip from the Animation Set at runtime" + $" so the Clip might as well be null until then."); if (GUI.Button(removeArea, removeContent, AnimancerGUI.NoPaddingButtonStyle)) property.objectReferenceValue = null; } if (Context.Transition is DirectionalClipTransition directionalClipTransition && directionalClipTransition.AnimationSet != null) { var dropdownArea = AnimancerGUI.StealFromRight( ref area, area.height, AnimancerGUI.StandardSpacing); if (GUI.Button(dropdownArea, GUIContent.none, EditorStyles.popup)) PickAnimation(property, directionalClipTransition); } } base.DoChildPropertyGUI(ref area, rootProperty, property, label); area.width = width; } /************************************************************************************************************************/ /// Shows a context menu to choose an from the `source`. private void PickAnimation(SerializedProperty property, object source) { var menu = new GenericMenu(); using (SetPool.Instance.Acquire(out var clips)) { clips.GatherFromSource(source); if (clips.Count == 0) return; property = property.Copy(); foreach (var clip in clips) { menu.AddPropertyModifierFunction(property, clip.name, true, modify => { modify.objectReferenceValue = clip; }); } } menu.ShowAsContext(); } /************************************************************************************************************************/ } } #endif