197 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			197 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using UnityEditor.Timeline.Actions; | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.Timeline; | ||
|  | 
 | ||
|  | namespace UnityEditor.Timeline | ||
|  | { | ||
|  |     class InlineCurveResize : Manipulator | ||
|  |     { | ||
|  |         bool m_Captured; | ||
|  | 
 | ||
|  |         float m_CapturedHeight; | ||
|  |         float m_CaptureMouseYPos; | ||
|  | 
 | ||
|  |         InlineCurveResizeHandle m_Target; | ||
|  | 
 | ||
|  |         protected override bool MouseDown(Event evt, WindowState state) | ||
|  |         { | ||
|  |             m_Target = PickerUtils.FirstPickedElementOfType<InlineCurveResizeHandle>(); | ||
|  |             if (m_Target == null) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             m_Captured = true; | ||
|  |             m_CapturedHeight = TimelineWindowViewPrefs.GetInlineCurveHeight(m_Target.trackGUI.track); | ||
|  |             m_CaptureMouseYPos = GUIUtility.GUIToScreenPoint(Event.current.mousePosition).y; | ||
|  |             state.AddCaptured(this); | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         protected override bool MouseDrag(Event evt, WindowState state) | ||
|  |         { | ||
|  |             if (!m_Captured || m_Target == null) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             var trackGUI = m_Target.trackGUI; | ||
|  | 
 | ||
|  |             float inlineTrackHeight = m_CapturedHeight + | ||
|  |                 (GUIUtility.GUIToScreenPoint(Event.current.mousePosition).y - m_CaptureMouseYPos); | ||
|  | 
 | ||
|  |             TimelineWindowViewPrefs.SetInlineCurveHeight(trackGUI.track, Mathf.Max(inlineTrackHeight, 60.0f)); | ||
|  | 
 | ||
|  |             state.GetWindow().treeView.CalculateRowRects(); | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         protected override bool MouseUp(Event evt, WindowState state) | ||
|  |         { | ||
|  |             if (!m_Captured) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             state.RemoveCaptured(this); | ||
|  |             m_Captured = false; | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void Overlay(Event evt, WindowState state) | ||
|  |         { | ||
|  |             var rect = state.GetWindow().sequenceRect; | ||
|  |             EditorGUIUtility.AddCursorRect(rect, MouseCursor.SplitResizeUpDown); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     class TrackResize : Manipulator | ||
|  |     { | ||
|  |         bool m_Captured; | ||
|  |         int m_NumberOfContributingTracks; | ||
|  | 
 | ||
|  |         TrackResizeHandle m_Target; | ||
|  |         List<TimelineTrackGUI> m_TracksToResize; | ||
|  | 
 | ||
|  |         protected override bool MouseDown(Event evt, WindowState state) | ||
|  |         { | ||
|  |             m_Target = PickerUtils.FirstPickedElementOfType<TrackResizeHandle>(); | ||
|  |             if (m_Target == null) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             m_NumberOfContributingTracks = 1; | ||
|  |             var selectedTracks = SelectionManager.SelectedTrackGUI().ToList(); | ||
|  | 
 | ||
|  |             if (selectedTracks.Any() && selectedTracks.Contains(m_Target.trackGUI)) //resize all selected tracks | ||
|  |             { | ||
|  |                 var allTrackGui = state.GetWindow().treeView.allTrackGuis; | ||
|  |                 m_TracksToResize = allTrackGui.OfType<TimelineTrackGUI>().Where(i => SelectionManager.Contains(i.track)).ToList(); | ||
|  |                 m_NumberOfContributingTracks += m_TracksToResize.IndexOf(m_Target.trackGUI); | ||
|  |             } | ||
|  |             else | ||
|  |                 m_TracksToResize = new List<TimelineTrackGUI> { m_Target.trackGUI }; | ||
|  | 
 | ||
|  |             m_Captured = true; | ||
|  |             state.AddCaptured(this); | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         protected override bool MouseDrag(Event evt, WindowState state) | ||
|  |         { | ||
|  |             if (!m_Captured || m_Target == null) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             var delta = evt.mousePosition.y - m_Target.boundingRect.center.y; | ||
|  |             var extension = Mathf.RoundToInt(delta / m_NumberOfContributingTracks / state.trackScale); | ||
|  |             foreach (var track in m_TracksToResize) | ||
|  |                 track.heightExtension += extension; | ||
|  | 
 | ||
|  |             state.GetWindow().treeView.CalculateRowRects(); | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         protected override bool MouseUp(Event evt, WindowState state) | ||
|  |         { | ||
|  |             if (!m_Captured) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             foreach (var track in m_TracksToResize) | ||
|  |                 CommitExtension(track); | ||
|  | 
 | ||
|  |             state.GetWindow().treeView.CalculateRowRects(); | ||
|  |             state.RemoveCaptured(this); | ||
|  |             m_Captured = false; | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } | ||
|  | 
 | ||
|  |         public override void Overlay(Event evt, WindowState state) | ||
|  |         { | ||
|  |             var rect = state.GetWindow().sequenceRect; | ||
|  |             EditorGUIUtility.AddCursorRect(rect, MouseCursor.SplitResizeUpDown); | ||
|  |         } | ||
|  | 
 | ||
|  |         static void CommitExtension(TimelineTrackGUI trackGUI) | ||
|  |         { | ||
|  |             if (trackGUI != null) | ||
|  |                 TimelineWindowViewPrefs.SetTrackHeightExtension(trackGUI.track, trackGUI.heightExtension); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     class TrackDoubleClick : Manipulator | ||
|  |     { | ||
|  |         protected override bool DoubleClick(Event evt, WindowState state) | ||
|  |         { | ||
|  |             if (evt.button != 0) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             var trackGUI = PickerUtils.FirstPickedElementOfType<TimelineTrackBaseGUI>(); | ||
|  | 
 | ||
|  |             if (trackGUI == null) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             // Double-click is only available for AnimationTracks: it conflicts with selection mechanics on other tracks | ||
|  |             if ((trackGUI.track as AnimationTrack) == null) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             return EditTrackInAnimationWindow.Do(trackGUI.track); | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     class TrackShortcutManipulator : Manipulator | ||
|  |     { | ||
|  |         protected override bool KeyDown(Event evt, WindowState state) | ||
|  |         { | ||
|  |             return InternalExecute(evt, state); | ||
|  |         } | ||
|  | 
 | ||
|  |         protected override bool ExecuteCommand(Event evt, WindowState state) | ||
|  |         { | ||
|  |             return InternalExecute(evt, state); | ||
|  |         } | ||
|  | 
 | ||
|  |         static bool InternalExecute(Event evt, WindowState state) | ||
|  |         { | ||
|  |             if (state.IsCurrentEditingASequencerTextField()) | ||
|  |                 return false; | ||
|  | 
 | ||
|  |             var tracks = SelectionManager.SelectedTracks().ToList(); | ||
|  |             var items = SelectionManager.SelectedClipGUI(); | ||
|  | 
 | ||
|  |             foreach (var item in items) | ||
|  |             { | ||
|  |                 var trackGUI = item.parent as TimelineTrackBaseGUI; | ||
|  |                 if (trackGUI == null) | ||
|  |                     continue; | ||
|  | 
 | ||
|  |                 if (!tracks.Contains(trackGUI.track)) | ||
|  |                     tracks.Add(trackGUI.track); | ||
|  |             } | ||
|  | 
 | ||
|  |             return ActionManager.HandleShortcut(evt, | ||
|  |                 ActionManager.TrackActions, | ||
|  |                 x => ActionManager.ExecuteTrackAction(x, tracks)); | ||
|  |         } | ||
|  |     } | ||
|  | } |