A game about forced loneliness, made by TACStudios
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}