canto/Assets/Scripts/Editor/PropertyDrawers/DurationPropertyDrawer.cs
2025-07-20 18:46:40 -04:00

73 lines
2.2 KiB
C#

using System;
using KitsuneCafe.System;
using UnityEditor;
using UnityEngine.UIElements;
using TimeUnit = KitsuneCafe.System.TimeUnit;
[CustomPropertyDrawer(typeof(Duration))]
public class DurationPropertyDrawer : PropertyDrawer
{
public override VisualElement CreatePropertyGUI(SerializedProperty property)
{
return new DurationField(property);
}
public class DurationField : VisualElement
{
public readonly SerializedProperty Property;
private readonly SerializedObject serializedObject;
private readonly SerializedProperty value;
private readonly SerializedProperty unit;
private readonly DoubleField durationField;
public DurationField(SerializedProperty property, string label = null)
{
label ??= ObjectNames.NicifyVariableName(property.name);
style.flexDirection = FlexDirection.Row;
Property = property;
serializedObject = property.serializedObject;
value = property.FindPropertyRelative("value");
unit = property.FindPropertyRelative("unit");
durationField = new DoubleField(
label
)
{
value = Duration.ToDisplayValue(value.longValue, (TimeUnit)unit.intValue)
};
durationField.style.flexGrow = 1;
var unitField = new EnumField
{
bindingPath = "unit"
};
unitField.style.flexGrow = 0;
Add(durationField);
Add(unitField);
AddToClassList(BaseField<double>.ussClassName);
durationField.AddToClassList(BaseField<double>.alignedFieldUssClassName);
durationField.RegisterValueChangedCallback(OnValueChanged);
}
private void OnValueChanged(ChangeEvent<double> evt)
{
value.longValue = Duration.FromDisplayValue(evt.newValue, (TimeUnit)unit.intValue);
serializedObject.ApplyModifiedProperties();
serializedObject.Update();
}
public new void RemoveFromHierarchy()
{
base.RemoveFromHierarchy();
durationField.UnregisterCallback<ChangeEvent<double>>(OnValueChanged);
}
}
}