A game about forced loneliness, made by TACStudios
at master 309 lines 8.9 kB view raw
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}