public static DragAndDropVisualMode HandleClipPanePlayableAssetDragAndDrop(IEnumerable <IPlayableAsset> assetsBeingDropped, TrackAsset targetTrack, bool perform, TimelineAsset timeline, TrackAsset parent, PlayableDirector director, double candidateTime, TypeResolver typeResolver) { // get the list of supported track types var assetTypes = assetsBeingDropped.Select(x => x.GetType()).Distinct(); IEnumerable <Type> supportedTypes = null; if (targetTrack == null) { supportedTypes = TypeUtility.AllTrackTypes().Where(t => TypeUtility.GetPlayableAssetsHandledByTrack(t).Intersect(assetTypes).Any()).ToList(); } else { supportedTypes = Enumerable.Empty <Type>(); var trackAssetTypes = TypeUtility.GetPlayableAssetsHandledByTrack(targetTrack.GetType()); if (trackAssetTypes.Intersect(assetTypes).Any()) { supportedTypes = new[] { targetTrack.GetType() } } ; } if (!supportedTypes.Any()) { return(DragAndDropVisualMode.Rejected); } if (perform) { Action <Type> onResolved = (t) => { if (targetTrack == null) { targetTrack = TimelineHelpers.CreateTrack(timeline, t, parent, string.Empty); } var clipTypes = TypeUtility.GetPlayableAssetsHandledByTrack(targetTrack.GetType()); foreach (var asset in assetsBeingDropped) { if (clipTypes.Contains(asset.GetType())) { TimelineHelpers.CreateClipOnTrackFromPlayableAsset(asset, targetTrack, candidateTime); } } }; typeResolver(supportedTypes, onResolved, k_SelectTrackWithClip); } return(DragAndDropVisualMode.Copy); }