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