| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 | // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //#if UNITY_EDITORusing Animancer.TransitionLibraries;using System;using System.Collections.Generic;using UnityEditor;using UnityEngine;using static Animancer.Editor.AnimancerGUI;using static Animancer.Editor.TransitionLibraries.TransitionLibrarySelection;namespace Animancer.Editor.TransitionLibraries{    /// <summary>[Editor-Only]    /// A <see cref="TransitionLibraryWindowPage"/> for editing transition aliases.    /// </summary>    /// https://kybernetik.com.au/animancer/api/Animancer.Editor.TransitionLibraries/TransitionLibraryAliasesPage    [Serializable]    public class TransitionLibraryAliasesPage : TransitionLibraryWindowPage    {        /************************************************************************************************************************/        [SerializeField]        private Vector2 _ScrollPosition;        [NonSerialized]        private bool _HasSorted;        /************************************************************************************************************************/        /// <inheritdoc/>        public override string DisplayName            => "Transition Aliases";        /// <inheritdoc/>        public override string HelpTooltip            => "Aliases are custom names which can be used to refer to transitions instead of direct references.";        /// <inheritdoc/>        public override int Index            => 1;        /************************************************************************************************************************/        private static readonly List<Rect>            TransitionAreas = new();        /************************************************************************************************************************/        /// <inheritdoc/>        public override void OnGUI(Rect area)        {            var definition = Window.Data;            if (!_HasSorted)            {                _HasSorted = true;                definition.SortAliases();            }            var currentEvent = Event.current;            var isRepaint = currentEvent.type == EventType.Repaint;            if (isRepaint)                TransitionAreas.Clear();            area.yMin += StandardSpacing;            area.xMin += StandardSpacing;            area.xMax -= StandardSpacing;            var transitions = definition.Transitions;            var aliases = definition.Aliases;            var viewArea = new Rect(                0,                0,                area.width,                CalculateHeight(1 + transitions.Length + aliases.Length) + StandardSpacing);            if (viewArea.height > area.height)                viewArea.width -= GUI.skin.verticalScrollbar.fixedWidth;            _ScrollPosition = GUI.BeginScrollView(area, _ScrollPosition, viewArea);            viewArea.height = LineHeight;            DoAliasAllGUI(viewArea);            NextVerticalArea(ref viewArea);            var aliasIndex = 0;            for (int i = 0; i < transitions.Length; i++)            {                var totalTransitionArea = viewArea;                if (isRepaint)                    TransitionAreas.Add(viewArea);                DoTransitionGUI(viewArea, transitions[i], i);                NextVerticalArea(ref viewArea);                while (aliasIndex < aliases.Length)                {                    var alias = aliases[aliasIndex];                    if (alias.Index != i)                    {                        if (alias.Index < i && currentEvent.type != EventType.Used)                        {                            Debug.LogError("Aliases aren't properly sorted.");                            definition.SortAliases();                            GUIUtility.ExitGUI();                        }                        break;                    }                    DoAliasGUI(viewArea, alias, aliasIndex++);                    NextVerticalArea(ref viewArea);                }                // Highlights.                totalTransitionArea.yMax = viewArea.yMin - StandardSpacing;                var selected = Window.Selection.FromIndex == i || Window.Selection.ToIndex == i;                var hover = totalTransitionArea.Contains(currentEvent.mousePosition);                Window.Highlighter.DrawHighlightGUI(totalTransitionArea, selected, hover);            }            GUI.EndScrollView();        }        /************************************************************************************************************************/        /// <summary>Draws <see cref="TransitionLibraryDefinition.AliasAllTransitions"/>.</summary>        private void DoAliasAllGUI(Rect area)        {            var definition = Window.Data;            using (var label = PooledGUIContent.Acquire(                "Alias All Transitions",                TransitionLibraryDefinition.AliasAllTransitionsTooltip))                definition.AliasAllTransitions = EditorGUI.Toggle(area, label, definition.AliasAllTransitions);            if (TryUseClickEvent(area, 0))                definition.AliasAllTransitions = !definition.AliasAllTransitions;        }        /************************************************************************************************************************/        /// <summary>Draws a `transition`.</summary>        private void DoTransitionGUI(Rect area, TransitionAssetBase transition, int index)        {            var addArea = StealFromLeft(ref area, LineHeight * 5, StandardSpacing);            TransitionModifierTableGUI.HandleTransitionLabelInput(                ref area,                Window,                transition,                index,                SelectionType.ToTransition,                CalculateTargetTransitionIndex);            var typeArea = StealFromRight(ref area, area.width * 0.5f, StandardSpacing);            var label = transition.GetCachedName();            GUI.Label(area, label);            var wrappedTransition = transition.GetTransition();            var type = wrappedTransition != null                ? wrappedTransition.GetType().GetNameCS(false)                : "Null";            GUI.Label(typeArea, type);            if (GUI.Button(addArea, "Add"))            {                var alias = new NamedIndex(null, index);                Window.RecordUndo().AddAlias(alias);            }        }        /************************************************************************************************************************/        /// <summary>Calculates the transition index for a drag and drop operation.</summary>        private static int CalculateTargetTransitionIndex(            Rect area,            int index,            Event currentEvent)        {            var y = currentEvent.mousePosition.y;            for (int i = 0; i < TransitionAreas.Count; i++)                if (y <= TransitionAreas[i].yMax)                    return i;            return TransitionAreas.Count;        }        /************************************************************************************************************************/        /// <summary>Draws an `alias`.</summary>        private void DoAliasGUI(Rect area, NamedIndex alias, int index)        {            var removeArea = StealFromLeft(ref area, LineHeight * 5, StandardSpacing);            EditorGUI.BeginChangeCheck();            var name = StringAssetDrawer.DrawGUI(area, GUIContent.none, alias.Name, Window.SourceObject, out _);            if (EditorGUI.EndChangeCheck())            {                Window.RecordUndo().Aliases[index] = alias.With(name as StringAsset);            }            if (GUI.Button(removeArea, "Remove"))            {                Window.RecordUndo().RemoveAlias(index);            }        }        /************************************************************************************************************************/    }}#endif
 |