TimelineMarkerHeaderGUI.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. using System;
  2. using System.Linq;
  3. using UnityEngine;
  4. using UnityEngine.Timeline;
  5. using Object = UnityEngine.Object;
  6. namespace UnityEditor.Timeline
  7. {
  8. class TimelineMarkerHeaderGUI : IRowGUI, ILayerable
  9. {
  10. int m_TrackHash;
  11. TimelineAsset timeline { get; }
  12. WindowState state { get; }
  13. MarkersLayer m_Layer;
  14. LayerZOrder m_ZOrder = new LayerZOrder(Layer.MarkerHeaderTrack, 0);
  15. struct DrawData
  16. {
  17. public Rect headerRect;
  18. public Rect contentRect;
  19. public GUIStyle trackSwatchStyle;
  20. public GUIStyle trackHeaderFont;
  21. public Color colorTrackFont;
  22. public bool showLockButton;
  23. public bool showMuteButton;
  24. }
  25. public TimelineMarkerHeaderGUI(TimelineAsset asset, WindowState state)
  26. {
  27. m_TrackHash = -1;
  28. timeline = asset;
  29. this.state = state;
  30. }
  31. public TrackAsset asset { get { return timeline.markerTrack; } }
  32. public Rect boundingRect { get; private set; }
  33. public bool locked { get { return !state.showMarkerHeader; } }
  34. public bool showMarkers
  35. {
  36. get { return state.showMarkerHeader; }
  37. }
  38. public bool muted
  39. {
  40. get { return timeline.markerTrack != null && timeline.markerTrack.muted; }
  41. }
  42. Rect IRowGUI.ToWindowSpace(Rect rect)
  43. {
  44. //header gui is already in global coordinates
  45. return rect;
  46. }
  47. public void Draw(Rect markerHeaderRect, Rect markerContentRect, WindowState state)
  48. {
  49. boundingRect = markerContentRect;
  50. var data = new DrawData()
  51. {
  52. headerRect = markerHeaderRect,
  53. contentRect = markerContentRect,
  54. trackSwatchStyle = new GUIStyle(),
  55. trackHeaderFont = DirectorStyles.Instance.trackHeaderFont,
  56. colorTrackFont = DirectorStyles.Instance.customSkin.colorTrackFont,
  57. showLockButton = locked,
  58. showMuteButton = muted
  59. };
  60. if (state.showMarkerHeader)
  61. {
  62. DrawMarkerDrawer(data, state);
  63. if (Event.current.type == EventType.Repaint)
  64. state.spacePartitioner.AddBounds(this, boundingRect);
  65. }
  66. if (asset != null && Hash() != m_TrackHash)
  67. Rebuild();
  68. var rect = state.showMarkerHeader ? markerContentRect : state.timeAreaRect;
  69. using (new GUIViewportScope(rect))
  70. {
  71. if (m_Layer != null)
  72. m_Layer.Draw(rect, state);
  73. HandleDragAndDrop();
  74. }
  75. }
  76. public void Rebuild()
  77. {
  78. if (asset == null)
  79. return;
  80. m_Layer = new MarkersLayer(Layer.MarkersOnHeader, this);
  81. m_TrackHash = Hash();
  82. }
  83. void HandleDragAndDrop()
  84. {
  85. if (TimelineWindow.instance.state.editSequence.isReadOnly)
  86. return;
  87. if (Event.current == null || Event.current.type != EventType.DragUpdated &&
  88. Event.current.type != EventType.DragPerform && Event.current.type != EventType.DragExited)
  89. return;
  90. timeline.CreateMarkerTrack(); // Ensure Marker track is created.
  91. var objectsBeingDropped = DragAndDrop.objectReferences.OfType<Object>();
  92. var candidateTime = TimelineHelpers.GetCandidateTime(TimelineWindow.instance.state, Event.current.mousePosition);
  93. var perform = Event.current.type == EventType.DragPerform;
  94. var director = state.editSequence != null ? state.editSequence.director : null;
  95. DragAndDrop.visualMode = TimelineDragging.HandleClipPaneObjectDragAndDrop(objectsBeingDropped, timeline.markerTrack, perform,
  96. timeline, null, director, candidateTime, TimelineDragging.ResolveType);
  97. if (perform && DragAndDrop.visualMode == DragAndDropVisualMode.Copy)
  98. {
  99. DragAndDrop.AcceptDrag();
  100. }
  101. }
  102. int Hash()
  103. {
  104. return timeline.markerTrack == null ? 0 : timeline.markerTrack.Hash();
  105. }
  106. static void DrawMarkerDrawer(DrawData data, WindowState state)
  107. {
  108. DrawMarkerDrawerHeaderBackground(data);
  109. DrawMarkerDrawerHeader(data, state);
  110. DrawMarkerDrawerContentBackground(data);
  111. }
  112. static void DrawMarkerDrawerHeaderBackground(DrawData data)
  113. {
  114. var backgroundColor = DirectorStyles.Instance.customSkin.markerHeaderDrawerBackgroundColor;
  115. var bgRect = data.headerRect;
  116. bgRect.x += data.trackSwatchStyle.fixedWidth;
  117. bgRect.width -= data.trackSwatchStyle.fixedWidth;
  118. EditorGUI.DrawRect(bgRect, backgroundColor);
  119. }
  120. static void DrawMarkerDrawerHeader(DrawData data, WindowState state)
  121. {
  122. var textStyle = data.trackHeaderFont;
  123. textStyle.normal.textColor = data.colorTrackFont;
  124. var labelRect = data.headerRect;
  125. labelRect.x += DirectorStyles.kBaseIndent;
  126. EditorGUI.LabelField(labelRect, DirectorStyles.timelineMarkerTrackHeader);
  127. const float buttonSize = WindowConstants.trackHeaderButtonSize;
  128. const float padding = WindowConstants.trackHeaderButtonPadding;
  129. var x = data.headerRect.xMax - buttonSize - padding - 2f;
  130. var y = data.headerRect.y + (data.headerRect.height - buttonSize) / 2.0f;
  131. var buttonRect = new Rect(x, y, buttonSize, buttonSize);
  132. DrawTrackDropDownMenu(buttonRect, state);
  133. buttonRect.x -= 16.0f;
  134. if (data.showMuteButton)
  135. {
  136. DrawMuteButton(buttonRect, state);
  137. buttonRect.x -= 16.0f;
  138. }
  139. if (data.showLockButton)
  140. {
  141. DrawLockButton(buttonRect, state);
  142. }
  143. }
  144. static void DrawMarkerDrawerContentBackground(DrawData data)
  145. {
  146. var trackBackgroundColor = DirectorStyles.Instance.customSkin.markerDrawerBackgroundColor;
  147. EditorGUI.DrawRect(data.contentRect, trackBackgroundColor);
  148. }
  149. static void DrawLockButton(Rect rect, WindowState state)
  150. {
  151. if (GUI.Button(rect, GUIContent.none, TimelineWindow.styles.locked))
  152. TimelineAction.Invoke<ToggleShowMarkersOnTimeline>(state);
  153. }
  154. static void DrawTrackDropDownMenu(Rect rect, WindowState state)
  155. {
  156. rect.y += WindowConstants.trackOptionButtonVerticalPadding;
  157. if (GUI.Button(rect, GUIContent.none, DirectorStyles.Instance.trackOptions))
  158. SequencerContextMenu.ShowMarkerHeaderContextMenu(null, state);
  159. }
  160. static void DrawMuteButton(Rect rect, WindowState state)
  161. {
  162. if (GUI.Button(rect, GUIContent.none, TimelineWindow.styles.mute))
  163. TimelineAction.Invoke<ToggleMuteMarkersOnTimeline>(state);
  164. }
  165. public LayerZOrder zOrder
  166. {
  167. get { return m_ZOrder; }
  168. }
  169. }
  170. }