TimelineWindow_TrackGui.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityEngine.Timeline;
  6. using UnityEngine.Playables;
  7. namespace UnityEditor.Timeline
  8. {
  9. partial class TimelineWindow
  10. {
  11. public TimelineTreeViewGUI treeView { get; private set; }
  12. void TracksGUI(Rect clientRect, WindowState state, TimelineModeGUIState trackState)
  13. {
  14. if (Event.current.type == EventType.Repaint && treeView != null)
  15. {
  16. state.spacePartitioner.Clear();
  17. }
  18. if (state.IsEditingASubTimeline() && !state.IsEditingAnEmptyTimeline())
  19. {
  20. var headerRect = clientRect;
  21. headerRect.width = state.sequencerHeaderWidth;
  22. Graphics.DrawBackgroundRect(state, headerRect);
  23. var clipRect = clientRect;
  24. clipRect.xMin = headerRect.xMax;
  25. Graphics.DrawBackgroundRect(state, clipRect, subSequenceMode: true);
  26. }
  27. else
  28. {
  29. Graphics.DrawBackgroundRect(state, clientRect);
  30. }
  31. if (!state.IsEditingAnEmptyTimeline())
  32. m_TimeArea.DrawMajorTicks(sequenceContentRect, state.referenceSequence.frameRate);
  33. GUILayout.BeginVertical();
  34. {
  35. GUILayout.Space(5.0f);
  36. GUILayout.BeginHorizontal();
  37. if (this.state.editSequence.asset == null)
  38. DrawNoSequenceGUI(state);
  39. else
  40. DrawTracksGUI(clientRect, trackState);
  41. GUILayout.EndHorizontal();
  42. }
  43. GUILayout.EndVertical();
  44. Graphics.DrawShadow(clientRect);
  45. }
  46. void DrawNoSequenceGUI(WindowState windowState)
  47. {
  48. bool showCreateButton = false;
  49. var currentlySelectedGo = UnityEditor.Selection.activeObject != null ? UnityEditor.Selection.activeObject as GameObject : null;
  50. var textContent = DirectorStyles.noTimelineAssetSelected;
  51. var existingDirector = currentlySelectedGo != null ? currentlySelectedGo.GetComponent<PlayableDirector>() : null;
  52. var existingAsset = existingDirector != null ? existingDirector.playableAsset : null;
  53. if (currentlySelectedGo != null && !TimelineUtility.IsPrefabOrAsset(currentlySelectedGo) && existingAsset == null)
  54. {
  55. showCreateButton = true;
  56. textContent = new GUIContent(String.Format(DirectorStyles.createTimelineOnSelection.text, currentlySelectedGo.name, "a Director component and a Timeline asset"));
  57. }
  58. GUILayout.FlexibleSpace();
  59. GUILayout.BeginVertical();
  60. GUILayout.FlexibleSpace();
  61. GUILayout.Label(textContent);
  62. if (showCreateButton)
  63. {
  64. GUILayout.BeginHorizontal();
  65. var textSize = GUI.skin.label.CalcSize(textContent);
  66. GUILayout.Space((textSize.x / 2.0f) - (WindowConstants.createButtonWidth / 2.0f));
  67. if (GUILayout.Button("Create", GUILayout.Width(WindowConstants.createButtonWidth)))
  68. {
  69. var message = DirectorStyles.createNewTimelineText.text + " '" + currentlySelectedGo.name + "'";
  70. string newSequencePath = EditorUtility.SaveFilePanelInProject(DirectorStyles.createNewTimelineText.text, currentlySelectedGo.name + "Timeline", "playable", message, ProjectWindowUtil.GetActiveFolderPath());
  71. if (!string.IsNullOrEmpty(newSequencePath))
  72. {
  73. var newAsset = CreateInstance<TimelineAsset>();
  74. AssetDatabase.CreateAsset(newAsset, newSequencePath);
  75. Undo.IncrementCurrentGroup();
  76. if (existingDirector == null)
  77. {
  78. existingDirector = Undo.AddComponent<PlayableDirector>(currentlySelectedGo);
  79. }
  80. existingDirector.playableAsset = newAsset;
  81. SetCurrentTimeline(existingDirector);
  82. var newTrack = TimelineHelpers.CreateTrack<AnimationTrack>();
  83. windowState.previewMode = false;
  84. TimelineUtility.SetSceneGameObject(windowState.editSequence.director, newTrack, currentlySelectedGo);
  85. }
  86. // If we reach this point, the state of the pannel has changed; skip the rest of this GUI phase
  87. // Fixes: case 955831 - [OSX] NullReferenceException when creating a timeline on a selected object
  88. GUIUtility.ExitGUI();
  89. }
  90. GUILayout.EndHorizontal();
  91. }
  92. GUILayout.FlexibleSpace();
  93. GUILayout.EndVertical();
  94. GUILayout.FlexibleSpace();
  95. }
  96. public enum OverlayDataTypes
  97. {
  98. None,
  99. BackgroundColor,
  100. BackgroundTexture,
  101. TextBox
  102. }
  103. public struct OverlayData
  104. {
  105. public OverlayDataTypes types { get; private set; }
  106. public Rect rect { get; internal set; }
  107. public string text { get; private set; }
  108. public Texture2D texture { get; private set; }
  109. public Color color { get; private set; }
  110. public GUIStyle backgroundTextStyle { get; private set; }
  111. public GUIStyle textStyle { get; private set; }
  112. public static OverlayData CreateColorOverlay(Rect rectangle, Color backgroundColor)
  113. {
  114. OverlayData data = new OverlayData();
  115. data.rect = rectangle;
  116. data.color = backgroundColor;
  117. data.types = OverlayDataTypes.BackgroundColor;
  118. return data;
  119. }
  120. public static OverlayData CreateTextureOverlay(Rect rectangle, Texture2D backTexture)
  121. {
  122. OverlayData data = new OverlayData();
  123. data.rect = rectangle;
  124. data.texture = backTexture;
  125. data.types = OverlayDataTypes.BackgroundTexture;
  126. return data;
  127. }
  128. public static OverlayData CreateTextBoxOverlay(Rect rectangle, string msg, GUIStyle textstyle, Color textcolor, Color bgTextColor, GUIStyle bgTextStyle)
  129. {
  130. OverlayData data = new OverlayData();
  131. data.rect = rectangle;
  132. data.text = msg;
  133. data.textStyle = textstyle;
  134. data.textStyle.normal.textColor = textcolor;
  135. data.backgroundTextStyle = bgTextStyle;
  136. data.backgroundTextStyle.normal.textColor = bgTextColor;
  137. data.types = OverlayDataTypes.TextBox;
  138. return data;
  139. }
  140. }
  141. internal List<OverlayData> OverlayDrawData = new List<OverlayData>();
  142. void DrawTracksGUI(Rect clientRect, TimelineModeGUIState trackState)
  143. {
  144. GUILayout.BeginVertical(GUILayout.Height(clientRect.height));
  145. if (treeView != null)
  146. {
  147. if (Event.current.type == EventType.Layout)
  148. {
  149. OverlayDrawData.Clear();
  150. }
  151. treeView.OnGUI(clientRect);
  152. if (Event.current.type == EventType.Repaint)
  153. {
  154. foreach (var overlayData in OverlayDrawData)
  155. {
  156. using (new GUIViewportScope(sequenceContentRect))
  157. DrawOverlay(overlayData);
  158. }
  159. }
  160. }
  161. GUILayout.EndVertical();
  162. }
  163. void DrawOverlay(OverlayData overlayData)
  164. {
  165. Rect overlayRect = GUIClip.Clip(overlayData.rect);
  166. if (overlayData.types == OverlayDataTypes.BackgroundColor)
  167. {
  168. EditorGUI.DrawRect(overlayRect, overlayData.color);
  169. }
  170. else if (overlayData.types == OverlayDataTypes.BackgroundTexture)
  171. {
  172. Graphics.DrawTextureRepeated(overlayRect, overlayData.texture);
  173. }
  174. else if (overlayData.types == OverlayDataTypes.TextBox)
  175. {
  176. using (new GUIColorOverride(overlayData.backgroundTextStyle.normal.textColor))
  177. GUI.Box(overlayRect, GUIContent.none, overlayData.backgroundTextStyle);
  178. Graphics.ShadowLabel(overlayRect, GUIContent.Temp(overlayData.text), overlayData.textStyle, overlayData.textStyle.normal.textColor, Color.black);
  179. }
  180. }
  181. void RefreshInlineCurves()
  182. {
  183. foreach (var trackGUI in allTracks.OfType<TimelineTrackGUI>())
  184. {
  185. if (trackGUI.inlineCurveEditor != null)
  186. trackGUI.inlineCurveEditor.Refresh();
  187. }
  188. }
  189. }
  190. }