123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
- #if UNITY_EDITOR
- using 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
|