70 lines
2.4 KiB
C#
70 lines
2.4 KiB
C#
|
using System;
|
||
|
using System.Linq;
|
||
|
using UnityEngine;
|
||
|
using UnityEngine.Timeline;
|
||
|
|
||
|
namespace UnityEditor.Timeline
|
||
|
{
|
||
|
[CustomPropertyDrawer(typeof(TimeFieldAttribute), true)]
|
||
|
class TimeFieldDrawer : PropertyDrawer
|
||
|
{
|
||
|
static WindowState state
|
||
|
{
|
||
|
get { return TimelineWindow.instance != null ? TimelineWindow.instance.state : null; }
|
||
|
}
|
||
|
|
||
|
static float currentFrameRate
|
||
|
{
|
||
|
get { return state != null ? TimelineWindow.instance.state.referenceSequence.frameRate : 0.0f; }
|
||
|
}
|
||
|
|
||
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
||
|
{
|
||
|
if (property.propertyType != SerializedPropertyType.Float)
|
||
|
{
|
||
|
GUILayout.Label("TimeField only works on floating point types");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var timeFieldAttribute = attribute as TimeFieldAttribute;
|
||
|
if (timeFieldAttribute == null)
|
||
|
return;
|
||
|
|
||
|
var rect = EditorGUILayout.s_LastRect;
|
||
|
EditorGUI.BeginChangeCheck();
|
||
|
|
||
|
if (timeFieldAttribute.useEditMode == TimeFieldAttribute.UseEditMode.ApplyEditMode)
|
||
|
TimeFieldWithEditMode(rect, property, label);
|
||
|
else
|
||
|
TimeField(rect, property, label);
|
||
|
|
||
|
if (EditorGUI.EndChangeCheck())
|
||
|
{
|
||
|
if (state != null)
|
||
|
state.Refresh();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void TimeField(Rect rect, SerializedProperty property, GUIContent label)
|
||
|
{
|
||
|
var evt1 = InputEvent.None;
|
||
|
TimelineInspectorUtility.TimeField(rect, property, label, false, currentFrameRate, 0, float.MaxValue, ref evt1);
|
||
|
}
|
||
|
|
||
|
static void TimeFieldWithEditMode(Rect rect, SerializedProperty property, GUIContent label)
|
||
|
{
|
||
|
double minStartTime;
|
||
|
if (property.hasMultipleDifferentValues)
|
||
|
minStartTime = SelectionManager.SelectedItems().Min(i => i.start);
|
||
|
else
|
||
|
minStartTime = property.doubleValue;
|
||
|
|
||
|
var evt = InputEvent.None;
|
||
|
var newValue = TimelineInspectorUtility.TimeField(
|
||
|
rect, label, minStartTime, false, property.hasMultipleDifferentValues, currentFrameRate, 0.0, float.MaxValue, ref evt);
|
||
|
|
||
|
EditMode.inputHandler.ProcessMove(evt, newValue);
|
||
|
}
|
||
|
}
|
||
|
}
|