TimelineMarkerClusterGUI.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine;
  5. using UnityObject = UnityEngine.Object;
  6. namespace UnityEditor.Timeline
  7. {
  8. class TimelineMarkerClusterGUI : TimelineItemGUI
  9. {
  10. readonly List<TimelineMarkerGUI> m_MarkerGUIs;
  11. readonly IZOrderProvider m_ZOrderProvider;
  12. public TimelineMarkerGUI topMarker
  13. {
  14. get { return m_MarkerGUIs.LastOrDefault(); }
  15. }
  16. TimelineMarkerGUI m_ManipulatedMarker;
  17. public TimelineMarkerClusterGUI(List<TimelineMarkerGUI> guis, IRowGUI parent,
  18. IZOrderProvider zOrderProvider, LayerZOrder layerZOrder)
  19. : base(parent)
  20. {
  21. m_MarkerGUIs = guis;
  22. m_ZOrderProvider = zOrderProvider;
  23. zOrder = layerZOrder;
  24. SortMarkers();
  25. topMarker.onStartDrag += OnDragTopMarker;
  26. }
  27. public override double start
  28. {
  29. get { return topMarker.start; }
  30. }
  31. public override double end
  32. {
  33. get { return topMarker.end; }
  34. }
  35. public override ITimelineItem item
  36. {
  37. get { return topMarker.item; }
  38. }
  39. public override void Select()
  40. {
  41. foreach (var marker in m_MarkerGUIs)
  42. {
  43. if (!marker.IsSelected())
  44. marker.Select();
  45. }
  46. }
  47. public override void Deselect()
  48. {
  49. foreach (var marker in m_MarkerGUIs)
  50. {
  51. if (marker.IsSelected())
  52. marker.Deselect();
  53. }
  54. }
  55. public override void Draw(Rect trackRect, bool trackRectChanged, WindowState state)
  56. {
  57. RegisterRect(state);
  58. topMarker.Draw(trackRect, trackRectChanged, state);
  59. if (m_MarkerGUIs.Count > 1)
  60. GUI.Box(treeViewRect, String.Empty, DirectorStyles.Instance.markerMultiOverlay);
  61. if (m_ManipulatedMarker != null)
  62. m_ManipulatedMarker.Draw(trackRect, trackRectChanged, state);
  63. }
  64. public override Rect RectToTimeline(Rect trackRect, WindowState state)
  65. {
  66. return topMarker.RectToTimeline(trackRect, state);
  67. }
  68. public void CycleTop()
  69. {
  70. if (m_MarkerGUIs.Count < 2)
  71. return;
  72. topMarker.onStartDrag -= OnDragTopMarker;
  73. var last = topMarker;
  74. for (int i = 0; i < m_MarkerGUIs.Count; ++i)
  75. {
  76. var next = m_MarkerGUIs[i];
  77. m_MarkerGUIs[i] = last;
  78. last = next;
  79. }
  80. topMarker.zOrder = m_ZOrderProvider.Next();
  81. topMarker.onStartDrag += OnDragTopMarker;
  82. }
  83. void OnDragTopMarker()
  84. {
  85. m_ManipulatedMarker = topMarker;
  86. m_ManipulatedMarker.onStartDrag -= OnDragTopMarker;
  87. m_MarkerGUIs.RemoveAt(m_MarkerGUIs.Count - 1);
  88. }
  89. void SortMarkers()
  90. {
  91. m_MarkerGUIs.Sort((lhs, rhs) => lhs.zOrder.CompareTo(rhs.zOrder));
  92. }
  93. void RegisterRect(WindowState state)
  94. {
  95. treeViewRect = topMarker.treeViewRect;
  96. if (Event.current.type == EventType.Repaint && !parent.locked)
  97. state.spacePartitioner.AddBounds(this, rect);
  98. }
  99. public static bool CanCycleMarkers()
  100. {
  101. if (!SelectionManager.SelectedMarkers().Any())
  102. return false;
  103. var cluster = PickerUtils.PickedLayerableOfType<TimelineMarkerClusterGUI>();
  104. if (cluster == null)
  105. return false;
  106. // Only cycle if the marker is selected and nothing else is selected
  107. return cluster.topMarker.IsSelected() && SelectionManager.Count() == 1;
  108. }
  109. public static void CycleMarkers()
  110. {
  111. var cluster = PickerUtils.PickedLayerableOfType<TimelineMarkerClusterGUI>();
  112. if (cluster == null)
  113. return;
  114. cluster.topMarker.Deselect();
  115. cluster.CycleTop();
  116. cluster.topMarker.Select();
  117. }
  118. }
  119. }