public static DragAndDropVisualMode HandleClipPaneObjectDragAndDrop(IEnumerable <UnityObject> objectsBeingDropped, TrackAsset targetTrack, bool perform, TimelineAsset timeline, TrackAsset parent, PlayableDirector director, double candidateTime, TypeResolver typeResolver, TrackAsset insertBefore = null) { if (timeline == null) { return(DragAndDropVisualMode.Rejected); } // locked tracks always reject if (targetTrack != null && targetTrack.lockedInHierarchy) { return(DragAndDropVisualMode.Rejected); } // treat group tracks as having no track if (targetTrack is GroupTrack) { parent = targetTrack; targetTrack = null; } // Special case for monoscripts, since they describe the type if (objectsBeingDropped.Any(o => o is MonoScript)) { return(HandleClipPaneMonoScriptDragAndDrop(objectsBeingDropped.OfType <MonoScript>(), targetTrack, perform, timeline, parent, director, candidateTime)); } // no unity objects, or explicit exceptions if (!objectsBeingDropped.Any() || objectsBeingDropped.Any(o => !ValidateObjectDrop(o))) { return(DragAndDropVisualMode.Rejected); } // reject scene references if we have no context if (director == null && objectsBeingDropped.Any(o => o.IsSceneObject())) { return(DragAndDropVisualMode.Rejected); } var validTrackTypes = objectsBeingDropped.SelectMany(o => TypeUtility.GetTrackTypesForObject(o)).Distinct().ToList(); // special case for playable assets if (objectsBeingDropped.Any(o => TypeUtility.IsConcretePlayableAsset(o.GetType()))) { var playableAssets = objectsBeingDropped.OfType <IPlayableAsset>().Where(o => TypeUtility.IsConcretePlayableAsset(o.GetType())); return(HandleClipPanePlayableAssetDragAndDrop(playableAssets, targetTrack, perform, timeline, parent, director, candidateTime, typeResolver)); } var markerTypes = objectsBeingDropped.SelectMany(o => TypeUtility.MarkerTypesWithFieldForObject(o)).Distinct(); // No tracks or markers support this object if (!(markerTypes.Any() || validTrackTypes.Any())) { return(DragAndDropVisualMode.Rejected); } // track is not compatible with marker if (targetTrack != null && markerTypes.Any(o => !TypeUtility.DoesTrackSupportMarkerType(targetTrack, o))) { // track is not compatible with object if (!validTrackTypes.Contains(targetTrack.GetType())) { return(DragAndDropVisualMode.Rejected); } } // there is no target track, dropping to empty space, or onto a group if (perform) { // choose track and then clip if (targetTrack == null) { var createdTrack = HandleTrackAndItemCreation(objectsBeingDropped, candidateTime, typeResolver, timeline, parent, validTrackTypes, insertBefore); if (!createdTrack) { timeline.CreateMarkerTrack(); HandleItemCreation(objectsBeingDropped, timeline.markerTrack, candidateTime, typeResolver, true); // menu is always popped if ambiguous choice } } // just choose clip/marker else { HandleItemCreation(objectsBeingDropped, targetTrack, candidateTime, typeResolver, true); // menu is always popped if ambiguous choice } } return(DragAndDropVisualMode.Copy); }