File size: 5,598 Bytes
18a519f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
using System.Linq;
using UnityEngine;
using UnityEngine.Timeline;
using Object = UnityEngine.Object;

namespace UnityEditor.Timeline
{
    [CustomEditor(typeof(TimelineAsset)), CanEditMultipleObjects]
    class TimelineAssetInspector : Editor
    {
        const int k_MinWidth = 140;

        internal static class Styles
        {
            public static readonly GUIContent FrameRate = L10n.TextContent("Frame Rate", "The frame rate at which this sequence updates");
            public static readonly GUIContent DurationMode = L10n.TextContent("Duration Mode", "Specified how the duration of the sequence is calculated");
            public static readonly GUIContent Duration = L10n.TextContent("Duration", "The length of the sequence");
            public static readonly GUIContent HeaderTitleMultiselection = L10n.TextContent("Timeline Assets");
            public static readonly GUIContent IgnorePreviewWarning = L10n.TextContent("When ignoring preview, the Timeline window will modify the scene when this timeline is opened.");
            public static readonly GUIContent ScenePreviewLabel = L10n.TextContent("Scene Preview");
        }

        SerializedProperty m_FrameRateProperty;
        SerializedProperty m_DurationModeProperty;
        SerializedProperty m_FixedDurationProperty;
        SerializedProperty m_ScenePreviewProperty;

        void InitializeProperties()
        {
            var editorSettings = serializedObject.FindProperty("m_EditorSettings");
            m_FrameRateProperty = editorSettings.FindPropertyRelative("m_Framerate");
            m_DurationModeProperty = serializedObject.FindProperty("m_DurationMode");
            m_FixedDurationProperty = serializedObject.FindProperty("m_FixedDuration");
            m_ScenePreviewProperty = editorSettings.FindPropertyRelative("m_ScenePreview");
        }

        public void OnEnable()
        {
            InitializeProperties();
        }

        internal override bool IsEnabled()
        {
            return !FileUtil.HasReadOnly(targets) && base.IsEnabled();
        }

        protected override void OnHeaderGUI()
        {
            string headerTitle;
            if (targets.Length == 1)
                headerTitle = target.name;
            else
                headerTitle = targets.Length + " " + Styles.HeaderTitleMultiselection.text;

            DrawHeaderGUI(this, headerTitle, 0);
        }

        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            EditorGUI.BeginChangeCheck();
            EditorGUILayout.PropertyField(m_FrameRateProperty, Styles.FrameRate);
#if TIMELINE_FRAMEACCURATE
            if (EditorGUI.EndChangeCheck())
            {
                ResetFrameLockedPlayback(targets);
            }
#else
            EditorGUI.EndChangeCheck();
#endif

            var frameRate = m_FrameRateProperty.doubleValue;

            EditorGUI.BeginChangeCheck();

            EditorGUILayout.PropertyField(m_DurationModeProperty, Styles.DurationMode, GUILayout.MinWidth(k_MinWidth));

            var durationMode = (TimelineAsset.DurationMode)m_DurationModeProperty.enumValueIndex;
            var inputEvent = InputEvent.None;
            if (durationMode == TimelineAsset.DurationMode.FixedLength)
                TimelineInspectorUtility.TimeField(m_FixedDurationProperty, Styles.Duration, false, frameRate, double.Epsilon, TimelineClip.kMaxTimeValue * 2, ref inputEvent);
            else
            {
                var isMixed = targets.Length > 1;
                TimelineInspectorUtility.TimeField(Styles.Duration, ((TimelineAsset)target).duration, true, isMixed, frameRate, double.MinValue, double.MaxValue, ref inputEvent);
            }

            DrawIgnorePreviewProperty();

            var changed = EditorGUI.EndChangeCheck();
            serializedObject.ApplyModifiedProperties();
            if (changed)
                TimelineEditor.Refresh(RefreshReason.WindowNeedsRedraw);
        }

        void DrawIgnorePreviewProperty()
        {
            EditorGUI.BeginChangeCheck();
            {
                EditorGUILayout.PropertyField(m_ScenePreviewProperty, Styles.ScenePreviewLabel, GUILayout.MinWidth(k_MinWidth));
            }
            var changed = EditorGUI.EndChangeCheck();

            if (changed && TimelineWindow.instance && TimelineWindow.instance.state != null && ContainsMasterAsset(targets))
                ResetWindowState(TimelineWindow.instance.state);

            if (!m_ScenePreviewProperty.boolValue || m_ScenePreviewProperty.hasMultipleDifferentValues)
                EditorGUILayout.HelpBox(Styles.IgnorePreviewWarning.text, MessageType.Warning);
        }

        static void ResetWindowState(WindowState state)
        {
            state.Reset();
            state.Stop();
            state.masterSequence.viewModel.windowTime = 0.0;
            if (state.masterSequence.director != null) state.masterSequence.director.time = 0.0;
        }

        static bool ContainsMasterAsset(Object[] asset)
        {
            return asset != null && asset.Any(tl => tl == TimelineWindow.instance.state.masterSequence.asset);
        }

#if TIMELINE_FRAMEACCURATE
        static void ResetFrameLockedPlayback(Object[] asset)
        {
            if (TimelineWindow.instance != null
                && TimelineWindow.instance.state != null
                && TimelinePreferences.instance.playbackLockedToFrame
                && ContainsMasterAsset(asset))
            {
                TimelineEditor.RefreshPreviewPlay();
            }
        }

#endif
    }
}