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));
|
||
|
}
|
||
|
}
|
||
|
}
|