TrackAssetInspector.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. //#define PERF_PROFILE
  2. using System.Linq;
  3. using UnityEngine;
  4. using UnityEngine.Playables;
  5. using UnityEngine.Timeline;
  6. namespace UnityEditor.Timeline
  7. {
  8. [CustomEditor(typeof(TrackAsset), true, isFallback = true)]
  9. [CanEditMultipleObjects]
  10. class TrackAssetInspector : Editor
  11. {
  12. class TrackCurvesWrapper : ICurvesOwnerInspectorWrapper
  13. {
  14. public ICurvesOwner curvesOwner { get; }
  15. public SerializedObject serializedPlayableAsset { get; }
  16. public int lastCurveVersion { get; set; }
  17. public double lastEvalTime { get; set; }
  18. public TrackCurvesWrapper(TrackAsset track)
  19. {
  20. lastCurveVersion = -1;
  21. lastEvalTime = -1;
  22. if (track != null)
  23. {
  24. curvesOwner = track;
  25. serializedPlayableAsset = new SerializedObject(track);
  26. }
  27. }
  28. public double ToLocalTime(double time)
  29. {
  30. return time;
  31. }
  32. }
  33. TrackCurvesWrapper m_TrackCurvesWrapper;
  34. SerializedProperty m_Name;
  35. bool m_IsBuiltInType;
  36. Texture m_HeaderIcon;
  37. protected TimelineWindow timelineWindow
  38. {
  39. get
  40. {
  41. return TimelineWindow.instance;
  42. }
  43. }
  44. protected bool IsTrackLocked()
  45. {
  46. if (!TimelineUtility.IsCurrentSequenceValid() || IsCurrentSequenceReadOnly())
  47. return true;
  48. return targets.Any(track => ((TrackAsset)track).lockedInHierarchy);
  49. }
  50. public override void OnInspectorGUI()
  51. {
  52. using (new EditorGUI.DisabledScope(IsTrackLocked()))
  53. {
  54. DrawInspector();
  55. }
  56. }
  57. internal override bool IsEnabled()
  58. {
  59. return TimelineUtility.IsCurrentSequenceValid() && !IsCurrentSequenceReadOnly() && base.IsEnabled();
  60. }
  61. internal override void OnHeaderTitleGUI(Rect titleRect, string header)
  62. {
  63. serializedObject.Update();
  64. var textFieldRect = titleRect;
  65. using (new GUIMixedValueScope(m_Name.hasMultipleDifferentValues))
  66. {
  67. var seqWindow = TimelineWindow.instance;
  68. if (IsTrackLocked())
  69. {
  70. base.OnHeaderTitleGUI(titleRect, m_Name.stringValue);
  71. }
  72. else
  73. {
  74. EditorGUI.BeginChangeCheck();
  75. string newName = EditorGUI.DelayedTextField(textFieldRect, m_Name.stringValue, EditorStyles.textField);
  76. if (EditorGUI.EndChangeCheck() && !string.IsNullOrEmpty(newName))
  77. {
  78. for (int c = 0; c < targets.Length; c++)
  79. {
  80. ObjectNames.SetNameSmart(targets[c], newName);
  81. }
  82. if (seqWindow != null)
  83. seqWindow.Repaint();
  84. }
  85. serializedObject.ApplyModifiedProperties();
  86. }
  87. }
  88. }
  89. internal override void OnHeaderIconGUI(Rect iconRect)
  90. {
  91. if (TimelineWindow.instance == null)
  92. return;
  93. using (new EditorGUI.DisabledScope(IsTrackLocked()))
  94. {
  95. if (m_HeaderIcon != null)
  96. GUI.Label(iconRect, GUIContent.Temp(m_HeaderIcon));
  97. }
  98. }
  99. internal override Rect DrawHeaderHelpAndSettingsGUI(Rect r)
  100. {
  101. using (new EditorGUI.DisabledScope(IsTrackLocked()))
  102. {
  103. var helpSize = EditorStyles.iconButton.CalcSize(EditorGUI.GUIContents.helpIcon);
  104. const int kTopMargin = 5;
  105. // Show Editor Header Items.
  106. return EditorGUIUtility.DrawEditorHeaderItems(new Rect(r.xMax - helpSize.x, r.y + kTopMargin, helpSize.x, helpSize.y), targets);
  107. }
  108. }
  109. public virtual void OnEnable()
  110. {
  111. m_IsBuiltInType = target != null && target.GetType().Assembly == typeof(TrackAsset).Assembly;
  112. m_Name = serializedObject.FindProperty("m_Name");
  113. m_TrackCurvesWrapper = new TrackCurvesWrapper(target as TrackAsset);
  114. m_HeaderIcon = TrackResourceCache.s_DefaultIcon.image;
  115. // only worry about the first track. if types are different, a different inspector is used.
  116. var track = target as TrackAsset;
  117. if (track != null)
  118. {
  119. var drawer = CustomTimelineEditorCache.GetTrackEditor(track);
  120. UnityEngine.Object binding = null;
  121. var director = m_Context as PlayableDirector;
  122. if (director != null)
  123. binding = director.GetGenericBinding(track);
  124. var options = drawer.GetTrackOptions(track, binding);
  125. if (options.icon != null)
  126. m_HeaderIcon = options.icon;
  127. else
  128. m_HeaderIcon = TrackResourceCache.GetTrackIcon(track).image;
  129. }
  130. }
  131. void DrawInspector()
  132. {
  133. if (serializedObject == null)
  134. return;
  135. CurvesOwnerInspectorHelper.PreparePlayableAsset(m_TrackCurvesWrapper);
  136. serializedObject.Update();
  137. using (var changeScope = new EditorGUI.ChangeCheckScope())
  138. {
  139. DrawTrackProperties();
  140. if (changeScope.changed)
  141. {
  142. serializedObject.ApplyModifiedProperties();
  143. ApplyChanges();
  144. }
  145. }
  146. }
  147. protected virtual void DrawTrackProperties()
  148. {
  149. var property = serializedObject.GetIterator();
  150. var expanded = true;
  151. while (property.NextVisible(expanded))
  152. {
  153. // Don't draw script field for built-in types
  154. if (m_IsBuiltInType && "m_Script" == property.propertyPath)
  155. continue;
  156. EditorGUILayout.PropertyField(property, !expanded);
  157. expanded = false;
  158. }
  159. }
  160. protected virtual void ApplyChanges()
  161. {
  162. TimelineEditor.Refresh(RefreshReason.ContentsModified);
  163. }
  164. static bool IsCurrentSequenceReadOnly()
  165. {
  166. return TimelineWindow.instance.state.editSequence.isReadOnly;
  167. }
  168. }
  169. }