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 double currentFrameRate { get { return state != null ? TimelineWindow.instance.state.referenceSequence.frameRate : 0.0; } } 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); } } }