using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace UnityEditor.Timeline { static class PickerUtils { public static List<object> pickedElements { get; private set; } public static void DoPick(WindowState state, Vector2 mousePosition) { if (state.GetWindow().sequenceHeaderRect.Contains(mousePosition)) { pickedElements = state.headerSpacePartitioner.GetItemsAtPosition<object>(mousePosition).ToList(); } else if (state.GetWindow().sequenceContentRect.Contains(mousePosition)) { pickedElements = state.spacePartitioner.GetItemsAtPosition<object>(mousePosition).ToList(); } else { if (pickedElements != null) pickedElements.Clear(); else pickedElements = new List<object>(); } } public static ILayerable TopmostPickedItem() { return PickedItemsSortedByZOrderOfType<ILayerable>().FirstOrDefault(); } public static T TopmostPickedItemOfType<T>() where T : class, ILayerable { return PickedItemsSortedByZOrderOfType<T>().FirstOrDefault(); } public static T TopmostPickedItemOfType<T>(Func<T, bool> predicate) where T : class, ILayerable { return PickedItemsSortedByZOrderOfType<T>().FirstOrDefault(predicate); } static IEnumerable<T> PickedItemsSortedByZOrderOfType<T>() where T: class, ILayerable { return pickedElements.OfType<T>().OrderByDescending(x => x.zOrder); } public static T FirstPickedElementOfType<T>() where T : class, IBounds { return pickedElements.FirstOrDefault(e => e is T) as T; } } }