A game about forced loneliness, made by TACStudios
1using System.Collections.Generic;
2using System.Linq;
3using UnityEngine;
4using UnityEngine.Timeline;
5
6namespace UnityEditor.Timeline
7{
8 static class SelectionManager
9 {
10 static IClipCurveEditorOwner currentInlineEditorCurve;
11
12 public static void AddObject(Object obj)
13 {
14 if (obj == null)
15 return;
16
17 currentInlineEditorCurve = null;
18 if (Selection.Contains(obj))
19 return;
20
21 Selection.Add(obj);
22 }
23
24 public static void Add(TrackAsset obj)
25 {
26 // this can indicate a deleted track (Unity 'null')
27 if (obj == null)
28 return;
29
30 currentInlineEditorCurve = null;
31 if (!Selection.Contains(obj))
32 {
33 WindowState state = null;
34 if (TimelineWindow.instance != null)
35 state = TimelineWindow.instance.state;
36
37 if (!Selection.instanceIDs.Any() && state != null && state.editSequence.director != null)
38 Selection.SetActiveObjectWithContext(obj, TimelineWindow.instance.state.editSequence.director);
39 else
40 Selection.Add(obj);
41 }
42 }
43
44 public static void Add(TimelineClip item)
45 {
46 AddObject(EditorClipFactory.GetEditorClip(item));
47 }
48
49 public static void Add(IMarker marker)
50 {
51 var markerAsObject = marker as Object;
52 if (markerAsObject != null)
53 {
54 if (!Selection.Contains(markerAsObject))
55 {
56 currentInlineEditorCurve = null;
57 WindowState state = null;
58 if (TimelineWindow.instance != null)
59 state = TimelineWindow.instance.state;
60
61 if (!Selection.instanceIDs.Any() && state != null && state.editSequence.director != null)
62 Selection.SetActiveObjectWithContext(markerAsObject, TimelineWindow.instance.state.editSequence.director);
63 else
64 Selection.Add(markerAsObject);
65 }
66 }
67 }
68
69 public static void Add(ITimelineItem item)
70 {
71 var clipItem = item as ClipItem;
72 if (clipItem != null)
73 {
74 Add(clipItem.clip);
75 }
76 else
77 {
78 var markerItem = item as MarkerItem;
79 if (markerItem != null)
80 {
81 Add(markerItem.marker);
82 }
83 }
84 }
85
86 public static void SelectOnly(TrackAsset track)
87 {
88 RemoveTimelineSelection();
89 Add(track);
90 }
91
92 public static void SelectOnly(TimelineClip clip)
93 {
94 RemoveTimelineSelection();
95 Add(clip);
96 }
97
98 public static void SelectOnly(IMarker item)
99 {
100 RemoveTimelineSelection();
101 Add(item);
102 }
103
104 public static void SelectOnly(ITimelineItem item)
105 {
106 var clipItem = item as ClipItem;
107 if (clipItem != null)
108 {
109 SelectOnly(clipItem.clip);
110 }
111 else
112 {
113 var markerItem = item as MarkerItem;
114 if (markerItem != null)
115 {
116 SelectOnly(markerItem.marker);
117 }
118 }
119 }
120
121 public static void SelectInlineCurveEditor(IClipCurveEditorOwner selection)
122 {
123 currentInlineEditorCurve = selection;
124 }
125
126 public static IClipCurveEditorOwner GetCurrentInlineEditorCurve()
127 {
128 return currentInlineEditorCurve;
129 }
130
131 public static bool IsCurveEditorFocused(IClipCurveEditorOwner selection)
132 {
133 return selection == currentInlineEditorCurve;
134 }
135
136 public static bool Contains(TrackAsset item)
137 {
138 if (item == null)
139 return false;
140
141 return Selection.Contains(item);
142 }
143
144 public static bool Contains(TimelineClip item)
145 {
146 if (item == null)
147 return false;
148 return Selection.Contains(EditorClipFactory.GetEditorClip(item));
149 }
150
151 public static bool Contains(Object obj)
152 {
153 return Selection.Contains(obj);
154 }
155
156 public static bool Contains(IMarker marker)
157 {
158 var markerAsObject = marker as Object;
159 return Selection.Contains(markerAsObject);
160 }
161
162 public static bool Contains(ITimelineItem item)
163 {
164 var clipItem = item as ClipItem;
165 if (clipItem != null)
166 {
167 return Contains(clipItem.clip);
168 }
169
170 var markerItem = item as MarkerItem;
171 return markerItem != null && Contains(markerItem.marker);
172 }
173
174 public static void Clear()
175 {
176 currentInlineEditorCurve = null;
177 Selection.activeObject = null;
178 }
179
180 public static void UnSelectTracks()
181 {
182 var newSelection = Selection.objects.Where(x => !(x is TrackAsset));
183 Selection.objects = newSelection.ToArray();
184 }
185
186 public static void Remove(TimelineClip item)
187 {
188 Remove(EditorClipFactory.GetEditorClip(item));
189 }
190
191 public static void Remove(IMarker marker)
192 {
193 var o = marker as Object;
194 if (o != null)
195 {
196 Remove(o);
197 }
198 }
199
200 static void Remove(Object item)
201 {
202 Selection.Remove(item);
203 }
204
205 public static void Remove(TrackAsset item)
206 {
207 Selection.Remove(item);
208 }
209
210 public static void Remove(ITimelineItem item)
211 {
212 var clipItem = item as ClipItem;
213 if (clipItem != null)
214 {
215 Remove(clipItem.clip);
216 }
217 else
218 {
219 var markerItem = item as MarkerItem;
220 if (markerItem != null)
221 {
222 Remove(markerItem.marker);
223 }
224 }
225 }
226
227 public static void RemoveTimelineSelection()
228 {
229 Selection.objects = Selection.objects.Where(s => !IsTimelineType(s)).ToArray();
230 }
231
232 public static void RemoveAllClips()
233 {
234 Selection.objects = Selection.objects.Where(s => !(s is EditorClip)).ToArray();
235 }
236
237 public static int Count()
238 {
239 return Selection.objects.Count(IsTimelineType);
240 }
241
242 public static IEnumerable<TimelineClipGUI> SelectedClipGUI()
243 {
244 foreach (var clip in SelectedClips())
245 {
246 var gui = ItemToItemGui.GetGuiForClip(clip);
247 if (gui != null)
248 yield return gui;
249 }
250 }
251
252 public static IEnumerable<TimelineClip> SelectedClips()
253 {
254 return Selection.objects.OfType<EditorClip>().Select(x => x.clip).Where(x => x != null);
255 }
256
257 public static IEnumerable<IMarker> SelectedMarkers()
258 {
259 return Selection.objects.OfType<IMarker>();
260 }
261
262 public static IEnumerable<TrackAsset> SelectedTracks()
263 {
264 return Selection.objects.OfType<TrackAsset>();
265 }
266
267 public static IEnumerable<T> SelectedItemOfType<T>()
268 {
269 if (typeof(T) == typeof(TimelineClip))
270 return SelectedClips().Cast<T>();
271 if (typeof(T).IsAssignableFrom(typeof(IMarker)))
272 return SelectedMarkers().Cast<T>();
273 return Enumerable.Empty<T>();
274 }
275
276 public static IEnumerable<TimelineTrackBaseGUI> SelectedTrackGUI()
277 {
278 var tracks = SelectedTracks();
279 return TimelineWindow.instance.allTracks.Where(x => tracks.Contains(x.track));
280 }
281
282 static bool IsTimelineType(Object o)
283 {
284 return o is TrackAsset || o is EditorClip || o is IMarker;
285 }
286
287 public static IEnumerable<ITimelineItem> SelectedItems()
288 {
289 var list = new List<ITimelineItem>();
290 foreach (var obj in Selection.objects)
291 {
292 var editorClip = obj as EditorClip;
293 if (editorClip != null)
294 {
295 list.Add(new ClipItem(editorClip.clip));
296 continue;
297 }
298
299 var marker = obj as IMarker;
300 if (marker != null)
301 {
302 list.Add(new MarkerItem(marker));
303 }
304 }
305
306 return list;
307 }
308 }
309}