100 lines
3.4 KiB
C#
100 lines
3.4 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text.RegularExpressions;
|
|
using DG.DemiEditor;
|
|
using DG.Tweening;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
namespace Dott.Editor
|
|
{
|
|
[CustomPropertyDrawer(typeof(DOTweenAnimation))]
|
|
public class DOTweenAnimationPropertyDrawer : DOTweenComponentPropertyDrawer<DOTweenAnimation>
|
|
{
|
|
private readonly Dictionary<DOTweenAnimation, IDOTweenAnimation> adapters = new();
|
|
|
|
protected override string GetId(DOTweenAnimation component)
|
|
{
|
|
if (!adapters.ContainsKey(component))
|
|
{
|
|
adapters[component] = DottAnimation.FromComponent(component);
|
|
}
|
|
|
|
return adapters[component].Label;
|
|
}
|
|
}
|
|
|
|
[CustomPropertyDrawer(typeof(IDOTweenAnimation), true)]
|
|
public class DOTweenCallbackPropertyDrawer : DOTweenComponentPropertyDrawer<IDOTweenAnimation>
|
|
{
|
|
protected override string GetId(IDOTweenAnimation component) => component.Label;
|
|
}
|
|
|
|
public abstract class DOTweenComponentPropertyDrawer<T> : PropertyDrawer
|
|
{
|
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
|
{
|
|
var selected = property.objectReferenceValue as Component;
|
|
if (selected == null)
|
|
{
|
|
DrawDefault(position, property, label);
|
|
return;
|
|
}
|
|
|
|
var type = selected.GetType();
|
|
var components = selected.GetComponents(type);
|
|
|
|
EditorGUI.BeginProperty(position, label, property);
|
|
|
|
var controlRect = EditorGUI.PrefixLabel(position, label);
|
|
var halfWidth = controlRect.width / 2;
|
|
const int halfSpacing = 1;
|
|
|
|
var popupRect = controlRect.SetWidth(halfWidth - halfSpacing);
|
|
var index = DrawIdPopup(popupRect, components, selected);
|
|
if (index >= 0)
|
|
{
|
|
property.objectReferenceValue = components[index];
|
|
}
|
|
|
|
var selectedRect = controlRect;
|
|
selectedRect.xMin += halfWidth + halfSpacing;
|
|
EditorGUI.PropertyField(selectedRect, property, GUIContent.none);
|
|
|
|
EditorGUI.EndProperty();
|
|
|
|
if (GUI.changed)
|
|
{
|
|
property.serializedObject.ApplyModifiedProperties();
|
|
}
|
|
}
|
|
|
|
private int DrawIdPopup(Rect popupRect, Component[] options, Component selected)
|
|
{
|
|
var prefix = options.Length > 1;
|
|
var ids = options.Select((component, i) => prefix ? $"{i}: {GetPopupOption(component)}" : GetPopupOption(component)).ToArray();
|
|
var index = options.IndexOf(selected);
|
|
index = EditorGUI.Popup(popupRect, index, ids);
|
|
return index;
|
|
}
|
|
|
|
private string GetPopupOption(Component component)
|
|
{
|
|
if (component is not T typedComponent) { return string.Empty; }
|
|
|
|
var id = GetId(typedComponent);
|
|
id = Regex.Replace(id, "/", " ");
|
|
id = Regex.Replace(id, "<[^>]+>", string.Empty);
|
|
return id;
|
|
}
|
|
|
|
protected abstract string GetId(T component);
|
|
|
|
private static void DrawDefault(Rect position, SerializedProperty property, GUIContent label)
|
|
{
|
|
EditorGUI.BeginProperty(position, label, property);
|
|
EditorGUI.PropertyField(position, property, label);
|
|
EditorGUI.EndProperty();
|
|
}
|
|
}
|
|
} |