A game about forced loneliness, made by TACStudios
at master 199 lines 7.1 kB view raw
1using System.Collections.Generic; 2using System.Linq; 3using UnityEngine; 4 5namespace UnityEditor.Timeline 6{ 7 class EditModeInputHandler 8 { 9 readonly MoveInputHandler m_MoveHandler; 10 readonly TrimInputHandler m_TrimHandler; 11 12 public EditModeInputHandler() 13 { 14 m_MoveHandler = new MoveInputHandler(); 15 m_TrimHandler = new TrimInputHandler(); 16 } 17 18 public void ProcessMove(InputEvent action, double value) 19 { 20 if (TimelineWindow.instance != null && TimelineWindow.instance.state != null) 21 ProcessInputAction(m_MoveHandler, action, value, TimelineWindow.instance.state); 22 } 23 24 public void ProcessTrim(InputEvent action, double value, bool stretch) 25 { 26 if (TimelineWindow.instance != null && TimelineWindow.instance.state != null) 27 { 28 m_TrimHandler.stretch = stretch; 29 ProcessInputAction(m_TrimHandler, action, value, TimelineWindow.instance.state); 30 } 31 } 32 33 public void SetValueForEdge(IEnumerable<ITimelineItem> items, AttractedEdge edge, double value) 34 { 35 if (TimelineWindow.instance != null && TimelineWindow.instance.state != null) 36 MoveInputHandler.SetValueForEdge(items, edge, value, TimelineWindow.instance.state); 37 } 38 39 public void OnGUI(WindowState state, Event evt) 40 { 41 if (TimelineWindow.instance != null && TimelineWindow.instance.state != null) 42 { 43 m_MoveHandler.OnGUI(evt); 44 m_TrimHandler.OnGUI(state); 45 } 46 } 47 48 static void ProcessInputAction(IInputHandler handler, InputEvent action, double value, WindowState state) 49 { 50 var items = SelectionManager.SelectedItems(); 51 switch (action) 52 { 53 case InputEvent.None: 54 return; 55 case InputEvent.DragEnter: 56 handler.OnEnterDrag(items, state); 57 break; 58 case InputEvent.Drag: 59 handler.OnDrag(value, state); 60 break; 61 case InputEvent.DragExit: 62 handler.OnExitDrag(); 63 break; 64 case InputEvent.KeyboardInput: 65 handler.OnSetValue(items, value, state); 66 break; 67 default: 68 return; 69 } 70 } 71 72 interface IInputHandler 73 { 74 void OnEnterDrag(IEnumerable<ITimelineItem> items, WindowState state); 75 void OnDrag(double value, WindowState state); 76 void OnExitDrag(); 77 void OnSetValue(IEnumerable<ITimelineItem> items, double value, WindowState state); 78 } 79 80 class TrimInputHandler : IInputHandler 81 { 82 bool isDragging { get; set; } 83 public bool stretch { get; set; } 84 85 IEnumerable<ITimelineItem> grabbedItems { get; set; } 86 87 public void OnEnterDrag(IEnumerable<ITimelineItem> items, WindowState state) 88 { 89 grabbedItems = items.OfType<ITrimmable>().ToArray(); 90 foreach (var item in grabbedItems) 91 { 92 EditMode.BeginTrim(item, TrimEdge.End); 93 } 94 95 isDragging = true; 96 } 97 98 public void OnDrag(double endValue, WindowState state) 99 { 100 var trimValue = endValue; 101 trimValue = TimeReferenceUtility.SnapToFrameIfRequired(trimValue); 102 103 foreach (var item in grabbedItems) 104 { 105 EditMode.TrimEnd(item, trimValue, stretch); 106 } 107 state.UpdateRootPlayableDuration(state.editSequence.duration); 108 } 109 110 public void OnExitDrag() 111 { 112 isDragging = false; 113 EditMode.FinishTrim(); 114 TimelineWindow.instance.Repaint(); 115 } 116 117 public void OnSetValue(IEnumerable<ITimelineItem> items, double endValue, WindowState state) 118 { 119 foreach (var item in items.OfType<ITrimmable>()) 120 { 121 EditMode.BeginTrim(item, TrimEdge.End); 122 EditMode.TrimEnd(item, endValue, stretch); 123 EditMode.FinishTrim(); 124 } 125 state.UpdateRootPlayableDuration(state.editSequence.duration); 126 } 127 128 public void OnGUI(WindowState state) 129 { 130 if (!isDragging) return; 131 132 foreach (var item in grabbedItems) 133 { 134 EditMode.DrawTrimGUI(state, item.gui, TrimEdge.End); 135 } 136 } 137 } 138 139 class MoveInputHandler : IInputHandler 140 { 141 MoveItemHandler m_MoveItemHandler; 142 143 public void OnEnterDrag(IEnumerable<ITimelineItem> items, WindowState state) 144 { 145 if (items.Any()) 146 { 147 m_MoveItemHandler = new MoveItemHandler(state); 148 m_MoveItemHandler.Grab(items, items.First().parentTrack); 149 } 150 } 151 152 public void OnDrag(double value, WindowState state) 153 { 154 if (m_MoveItemHandler == null) return; 155 156 var startValue = value; 157 startValue = TimeReferenceUtility.SnapToFrameIfRequired(startValue); 158 m_MoveItemHandler.OnAttractedEdge(null, ManipulateEdges.Both, AttractedEdge.None, startValue); 159 } 160 161 public void OnExitDrag() 162 { 163 if (m_MoveItemHandler == null) return; 164 165 m_MoveItemHandler.Drop(); 166 m_MoveItemHandler = null; 167 GUIUtility.ExitGUI(); 168 } 169 170 public void OnSetValue(IEnumerable<ITimelineItem> items, double value, WindowState state) 171 { 172 if (!items.Any()) return; 173 174 m_MoveItemHandler = new MoveItemHandler(state); 175 m_MoveItemHandler.Grab(items, items.First().parentTrack); 176 m_MoveItemHandler.OnAttractedEdge(null, ManipulateEdges.Both, AttractedEdge.None, value); 177 m_MoveItemHandler.Drop(); 178 m_MoveItemHandler = null; 179 } 180 181 public void OnGUI(Event evt) 182 { 183 if (m_MoveItemHandler != null) 184 m_MoveItemHandler.OnGUI(evt); 185 } 186 187 public static void SetValueForEdge(IEnumerable<ITimelineItem> items, AttractedEdge edge, double value, WindowState state) 188 { 189 var handler = new MoveItemHandler(state); 190 foreach (var item in items) 191 { 192 handler.Grab(new[] { item }, item.parentTrack); 193 handler.OnAttractedEdge(null, ManipulateEdges.Both, edge, value); 194 handler.Drop(); 195 } 196 } 197 } 198 } 199}