| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 | // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //#if UNITY_EDITORusing System;using System.Collections.Generic;using UnityEditor;using UnityEngine;namespace Animancer.Editor{    /// <summary>[Editor-Only] A custom GUI for <see cref="IParameter"/>.</summary>    /// https://kybernetik.com.au/animancer/api/Animancer.Editor/ParameterGUI_1    ///     [CustomGUI(typeof(IParameter))]    public class ParameterGUI<TParameter> : CustomGUI<TParameter>        where TParameter : IParameter    {        /************************************************************************************************************************/        private static readonly HashSet<string>            ExpandedNames = new();        /************************************************************************************************************************/        private static ICustomGUI _ValueGUI;        private static ICustomGUI _DelegateGUI;        /************************************************************************************************************************/        /// <inheritdoc/>        public override void DoGUI()        {            ParameterDictionary.IsDrawingInspector = true;            var isExpanded = DoFoldoutGUI(out var startArea);            DoValueGUI();            if (isExpanded)            {                EditorGUI.indentLevel++;                DoDetailsGUI();                EditorGUI.indentLevel--;            }            ParameterDictionary.IsDrawingInspector = false;            var endArea = GUILayoutUtility.GetLastRect();            var totalArea = startArea;            totalArea.yMax = endArea.yMax;            if (AnimancerGUI.TryUseClickEvent(totalArea, 1))                ShowContextMenu();        }        /************************************************************************************************************************/        /// <summary>Draws the <see cref="CustomGUI{T}.Value"/> and returns the area used.</summary>        private Rect DoValueGUI()        {            _ValueGUI ??= CustomGUIFactory.GetOrCreateForType(Value.ValueType);            _ValueGUI.Label = Label;            _ValueGUI.Value = Value.Value;            _ValueGUI.DoGUI();            Value.Value = _ValueGUI.Value;            return GUILayoutUtility.GetLastRect();        }        /************************************************************************************************************************/        /// <summary>Draws a foldout for the parameter details and returns true if expanded.</summary>        private bool DoFoldoutGUI(out Rect totalArea)        {            var area = AnimancerGUI.LayoutSingleLineRect();            totalArea = area;            GUILayout.Space(-AnimancerGUI.LineHeight - AnimancerGUI.StandardSpacing);            var indented = EditorGUI.IndentedRect(area);            area.xMax = indented.xMin;            EditorGUIUtility.AddCursorRect(area, MouseCursor.Arrow);            return AnimancerGUI.DoHashedFoldoutGUI(area, ExpandedNames, Label.text);        }        /************************************************************************************************************************/        /// <summary>Draws the details of the parameter.</summary>        private void DoDetailsGUI()        {            EditorGUILayout.LabelField("Type", Value.ValueType.GetNameCS(false));            _DelegateGUI ??= CustomGUIFactory.GetOrCreateForType(typeof(MulticastDelegate));            _DelegateGUI.SetLabel("On Value Changed");            _DelegateGUI.Value = Value.GetOnValueChanged();            _DelegateGUI.DoGUI();        }        /************************************************************************************************************************/        /// <summary>Shows a context menu for the parameter.</summary>        private void ShowContextMenu()        {            var menu = new GenericMenu();            menu.AddItem(new("Log Interactions"), Value.LogContext != null, () =>            {                Value.LogContext = Value.LogContext is null                    ? ""                    : null;            });            menu.AddItem(new("Inspector Control Only"), Value.InspectorControlOnly, () =>            {                Value.InspectorControlOnly = !Value.InspectorControlOnly;            });            AnimancerEditorUtilities.AddDocumentationLink(                menu,                "Parameters Documentation",                Strings.DocsURLs.Parameters);            menu.ShowAsContext();        }        /************************************************************************************************************************/    }}#endif
 |