diff options
| author | Andrew Lee <alee14498@protonmail.com> | 2020-04-19 17:19:32 -0400 |
|---|---|---|
| committer | Andrew Lee <alee14498@protonmail.com> | 2020-04-19 17:19:32 -0400 |
| commit | c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78 (patch) | |
| tree | ee4d51c7c1d633e11f46453ef1edd3c77c4ef9f7 /Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/TrimClip.cs | |
| download | Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.tar.gz Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.tar.bz2 Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.zip | |
Inital commit
Diffstat (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/TrimClip.cs')
| -rw-r--r-- | Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/TrimClip.cs | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/TrimClip.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/TrimClip.cs new file mode 100644 index 0000000..0918a17 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Manipulators/Sequence/TrimClip.cs @@ -0,0 +1,232 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; +using UnityEngine.Timeline; + +namespace UnityEditor.Timeline +{ + class TrimClip : Manipulator + { + class TrimClipAttractionHandler : IAttractionHandler + { + public void OnAttractedEdge(IAttractable attractable, ManipulateEdges manipulateEdges, AttractedEdge edge, double time) + { + var clipGUI = attractable as TimelineClipGUI; + if (clipGUI == null) + return; + + var clipItem = ItemsUtils.ToItem(clipGUI.clip); + if (manipulateEdges == ManipulateEdges.Right) + { + bool affectTimeScale = Event.current.modifiers == EventModifiers.Shift; // TODO Do not use Event.current from here. + EditMode.TrimEnd(clipItem, time, affectTimeScale); + } + else if (manipulateEdges == ManipulateEdges.Left) + { + EditMode.TrimStart(clipItem, time); + } + } + } + + bool m_IsCaptured; + TimelineClipHandle m_TrimClipHandler; + + double m_OriginalDuration; + double m_OriginalTimeScale; + bool m_UndoSaved; + SnapEngine m_SnapEngine; + + readonly StringBuilder m_OverlayText = new StringBuilder(); + readonly List<string> m_OverlayStrings = new List<string>(); + + static readonly double kEpsilon = 0.0000001; + + protected override bool MouseDown(Event evt, WindowState state) + { + var handle = PickerUtils.PickedLayerableOfType<TimelineClipHandle>(); + if (handle == null) + return false; + + if (handle.clipGUI.clip.parentTrack != null && handle.clipGUI.clip.parentTrack.lockedInHierarchy) + return false; + + if (ItemSelection.CanClearSelection(evt)) + SelectionManager.Clear(); + + if (!SelectionManager.Contains(handle.clipGUI.clip)) + SelectionManager.Add(handle.clipGUI.clip); + + m_TrimClipHandler = handle; + + m_IsCaptured = true; + state.AddCaptured(this); + + m_UndoSaved = false; + + var clip = m_TrimClipHandler.clipGUI.clip; + + m_OriginalDuration = clip.duration; + m_OriginalTimeScale = clip.timeScale; + + RefreshOverlayStrings(m_TrimClipHandler, state); + + // in ripple trim, the right edge moves and needs to snap + var edges = ManipulateEdges.Right; + if (EditMode.editType != EditMode.EditType.Ripple && m_TrimClipHandler.trimDirection == TrimEdge.Start) + edges = ManipulateEdges.Left; + m_SnapEngine = new SnapEngine(m_TrimClipHandler.clipGUI, new TrimClipAttractionHandler(), edges, state, + evt.mousePosition); + + EditMode.BeginTrim(ItemsUtils.ToItem(clip), m_TrimClipHandler.trimDirection); + + return true; + } + + protected override bool MouseUp(Event evt, WindowState state) + { + if (!m_IsCaptured) + return false; + + m_IsCaptured = false; + m_TrimClipHandler = null; + m_UndoSaved = false; + m_SnapEngine = null; + EditMode.FinishTrim(); + + state.captured.Clear(); + + return true; + } + + protected override bool MouseDrag(Event evt, WindowState state) + { + if (state.editSequence.isReadOnly) + return false; + + if (!m_IsCaptured) + return false; + + if (!m_UndoSaved) + { + var uiClip = m_TrimClipHandler.clipGUI; + TimelineUndo.PushUndo(uiClip.clip.parentTrack, "Trim Clip"); + if (TimelineUtility.IsRecordableAnimationClip(uiClip.clip)) + { + TimelineUndo.PushUndo(uiClip.clip.animationClip, "Trim Clip"); + } + + m_UndoSaved = true; + } + + if (m_SnapEngine != null) + m_SnapEngine.Snap(evt.mousePosition, evt.modifiers); + + RefreshOverlayStrings(m_TrimClipHandler, state); + + if (Selection.activeObject != null) + EditorUtility.SetDirty(Selection.activeObject); + + // updates the duration of the graph without rebuilding + state.UpdateRootPlayableDuration(state.editSequence.duration); + + return true; + } + + public override void Overlay(Event evt, WindowState state) + { + if (!m_IsCaptured) + return; + + EditMode.DrawTrimGUI(state, m_TrimClipHandler.clipGUI, m_TrimClipHandler.trimDirection); + + bool trimStart = m_TrimClipHandler.trimDirection == TrimEdge.Start; + + TimeIndicator.Draw(state, trimStart ? m_TrimClipHandler.clipGUI.start : m_TrimClipHandler.clipGUI.end); + + if (m_SnapEngine != null) + m_SnapEngine.OnGUI(trimStart, !trimStart); + + if (m_OverlayStrings.Count > 0) + { + const float padding = 4.0f; + var labelStyle = TimelineWindow.styles.tinyFont; + var longestLine = labelStyle.CalcSize( + new GUIContent(m_OverlayStrings.Aggregate("", (max, cur) => max.Length > cur.Length ? max : cur))); + var stringLength = longestLine.x + padding; + var lineHeight = longestLine.y + padding; + + var r = new Rect(evt.mousePosition.x - (stringLength / 2.0f), + m_TrimClipHandler.clipGUI.rect.yMax, + stringLength, lineHeight); + + foreach (var s in m_OverlayStrings) + { + GUI.Label(r, s, labelStyle); + r.y += lineHeight; + } + } + } + + void RefreshOverlayStrings(TimelineClipHandle handle, WindowState state) + { + m_OverlayStrings.Clear(); + + m_OverlayText.Length = 0; + + var differenceDuration = handle.clipGUI.clip.duration - m_OriginalDuration; + bool hasDurationDelta = Math.Abs(differenceDuration) > kEpsilon; + + if (state.timeInFrames) + { + var durationInFrame = handle.clipGUI.clip.duration * state.referenceSequence.frameRate; + m_OverlayText.Append("duration: ").Append(durationInFrame.ToString("f2")).Append(" frames"); + + if (hasDurationDelta) + { + m_OverlayText.Append(" ("); + + if (differenceDuration > 0.0) + m_OverlayText.Append("+"); + + var valueInFrame = differenceDuration * state.referenceSequence.frameRate; + m_OverlayText.Append(valueInFrame.ToString("f2")).Append(" frames)"); + } + } + else + { + m_OverlayText.Append("duration: ").Append(handle.clipGUI.clip.duration.ToString("f2")).Append("s"); + + if (hasDurationDelta) + { + m_OverlayText.Append(" ("); + + if (differenceDuration > 0.0) + m_OverlayText.Append("+"); + + m_OverlayText.Append(differenceDuration.ToString("f2")).Append("s)"); + } + } + + m_OverlayStrings.Add(m_OverlayText.ToString()); + + m_OverlayText.Length = 0; + + var differenceSpeed = m_OriginalTimeScale - handle.clipGUI.clip.timeScale; + if (Math.Abs(differenceSpeed) > kEpsilon) + { + m_OverlayText.Append("speed: ").Append(handle.clipGUI.clip.timeScale.ToString("p2")); + + m_OverlayText.Append(" ("); + + if (differenceSpeed > 0.0) + m_OverlayText.Append("+"); + + m_OverlayText.Append(differenceSpeed.ToString("p2")).Append(")"); + + m_OverlayStrings.Add(m_OverlayText.ToString()); + } + } + } +} |
