暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ManipulationsTracks.cs 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using UnityEditor.Timeline.Actions;
  4. using UnityEngine;
  5. using UnityEngine.Timeline;
  6. namespace UnityEditor.Timeline
  7. {
  8. class InlineCurveResize : Manipulator
  9. {
  10. bool m_Captured;
  11. float m_CapturedHeight;
  12. float m_CaptureMouseYPos;
  13. InlineCurveResizeHandle m_Target;
  14. protected override bool MouseDown(Event evt, WindowState state)
  15. {
  16. m_Target = PickerUtils.FirstPickedElementOfType<InlineCurveResizeHandle>();
  17. if (m_Target == null)
  18. return false;
  19. m_Captured = true;
  20. m_CapturedHeight = TimelineWindowViewPrefs.GetInlineCurveHeight(m_Target.trackGUI.track);
  21. m_CaptureMouseYPos = GUIUtility.GUIToScreenPoint(Event.current.mousePosition).y;
  22. state.AddCaptured(this);
  23. return true;
  24. }
  25. protected override bool MouseDrag(Event evt, WindowState state)
  26. {
  27. if (!m_Captured || m_Target == null)
  28. return false;
  29. var trackGUI = m_Target.trackGUI;
  30. float inlineTrackHeight = m_CapturedHeight +
  31. (GUIUtility.GUIToScreenPoint(Event.current.mousePosition).y - m_CaptureMouseYPos);
  32. TimelineWindowViewPrefs.SetInlineCurveHeight(trackGUI.track, Mathf.Max(inlineTrackHeight, 60.0f));
  33. state.GetWindow().treeView.CalculateRowRects();
  34. return true;
  35. }
  36. protected override bool MouseUp(Event evt, WindowState state)
  37. {
  38. if (!m_Captured)
  39. return false;
  40. state.RemoveCaptured(this);
  41. m_Captured = false;
  42. return true;
  43. }
  44. public override void Overlay(Event evt, WindowState state)
  45. {
  46. var rect = state.GetWindow().sequenceRect;
  47. EditorGUIUtility.AddCursorRect(rect, MouseCursor.SplitResizeUpDown);
  48. }
  49. }
  50. class TrackResize : Manipulator
  51. {
  52. bool m_Captured;
  53. int m_NumberOfContributingTracks;
  54. TrackResizeHandle m_Target;
  55. List<TimelineTrackGUI> m_TracksToResize;
  56. protected override bool MouseDown(Event evt, WindowState state)
  57. {
  58. m_Target = PickerUtils.FirstPickedElementOfType<TrackResizeHandle>();
  59. if (m_Target == null)
  60. return false;
  61. m_NumberOfContributingTracks = 1;
  62. var selectedTracks = SelectionManager.SelectedTrackGUI().ToList();
  63. if (selectedTracks.Any() && selectedTracks.Contains(m_Target.trackGUI)) //resize all selected tracks
  64. {
  65. var allTrackGui = state.GetWindow().treeView.allTrackGuis;
  66. m_TracksToResize = allTrackGui.OfType<TimelineTrackGUI>().Where(i => SelectionManager.Contains(i.track)).ToList();
  67. m_NumberOfContributingTracks += m_TracksToResize.IndexOf(m_Target.trackGUI);
  68. }
  69. else
  70. m_TracksToResize = new List<TimelineTrackGUI> { m_Target.trackGUI };
  71. m_Captured = true;
  72. state.AddCaptured(this);
  73. return true;
  74. }
  75. protected override bool MouseDrag(Event evt, WindowState state)
  76. {
  77. if (!m_Captured || m_Target == null)
  78. return false;
  79. var delta = evt.mousePosition.y - m_Target.boundingRect.center.y;
  80. var extension = Mathf.RoundToInt(delta / m_NumberOfContributingTracks / state.trackScale);
  81. foreach (var track in m_TracksToResize)
  82. track.heightExtension += extension;
  83. state.GetWindow().treeView.CalculateRowRects();
  84. return true;
  85. }
  86. protected override bool MouseUp(Event evt, WindowState state)
  87. {
  88. if (!m_Captured)
  89. return false;
  90. foreach (var track in m_TracksToResize)
  91. CommitExtension(track);
  92. state.GetWindow().treeView.CalculateRowRects();
  93. state.RemoveCaptured(this);
  94. m_Captured = false;
  95. return true;
  96. }
  97. public override void Overlay(Event evt, WindowState state)
  98. {
  99. var rect = state.GetWindow().sequenceRect;
  100. EditorGUIUtility.AddCursorRect(rect, MouseCursor.SplitResizeUpDown);
  101. }
  102. static void CommitExtension(TimelineTrackGUI trackGUI)
  103. {
  104. if (trackGUI != null)
  105. TimelineWindowViewPrefs.SetTrackHeightExtension(trackGUI.track, trackGUI.heightExtension);
  106. }
  107. }
  108. class TrackDoubleClick : Manipulator
  109. {
  110. protected override bool DoubleClick(Event evt, WindowState state)
  111. {
  112. if (evt.button != 0)
  113. return false;
  114. var trackGUI = PickerUtils.FirstPickedElementOfType<TimelineTrackBaseGUI>();
  115. if (trackGUI == null)
  116. return false;
  117. // Double-click is only available for AnimationTracks: it conflicts with selection mechanics on other tracks
  118. if ((trackGUI.track as AnimationTrack) == null)
  119. return false;
  120. return EditTrackInAnimationWindow.Do(trackGUI.track);
  121. }
  122. }
  123. class TrackShortcutManipulator : Manipulator
  124. {
  125. protected override bool KeyDown(Event evt, WindowState state)
  126. {
  127. return InternalExecute(evt, state);
  128. }
  129. protected override bool ExecuteCommand(Event evt, WindowState state)
  130. {
  131. return InternalExecute(evt, state);
  132. }
  133. static bool InternalExecute(Event evt, WindowState state)
  134. {
  135. if (state.IsCurrentEditingASequencerTextField())
  136. return false;
  137. var tracks = SelectionManager.SelectedTracks().ToList();
  138. var items = SelectionManager.SelectedClipGUI();
  139. foreach (var item in items)
  140. {
  141. var trackGUI = item.parent as TimelineTrackBaseGUI;
  142. if (trackGUI == null)
  143. continue;
  144. if (!tracks.Contains(trackGUI.track))
  145. tracks.Add(trackGUI.track);
  146. }
  147. return ActionManager.HandleShortcut(evt,
  148. ActionManager.TrackActions,
  149. x => ActionManager.ExecuteTrackAction(x, tracks));
  150. }
  151. }
  152. }