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.
196 lines
6.2 KiB
196 lines
6.2 KiB
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)); |
|
} |
|
} |
|
}
|
|
|