You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
5.4 KiB
123 lines
5.4 KiB
using System; |
|
|
|
namespace UnityEngine.Timeline |
|
{ |
|
/// <summary> |
|
/// Extension methods for TimelineClip |
|
/// </summary> |
|
public static class TimelineClipExtensions |
|
{ |
|
static readonly string k_UndoSetParentTrackText = "Move Clip"; |
|
|
|
/// <summary> |
|
/// Tries to move a TimelineClip to a different track. Validates that the destination track can accept the clip before performing the move. |
|
/// Fails if the clip's PlayableAsset is null, the current and destination tracks are the same or the destination track cannot accept the clip. |
|
/// </summary> |
|
/// <param name="clip">Clip that is being moved</param> |
|
/// <param name="destinationTrack">Desired destination track</param> |
|
/// <exception cref="System.ArgumentNullException">Thrown if <paramref name="clip"/> or <paramref name="destinationTrack"/> are null</exception> |
|
/// <exception cref="System.InvalidOperationException">Thrown if the PlayableAsset in the TimelineClip is null</exception> |
|
/// <exception cref="System.InvalidOperationException">Thrown if the current parent track and destination track are the same</exception> |
|
/// <exception cref="System.InvalidOperationException">Thrown if the destination track cannot hold tracks of the given type</exception> |
|
public static void MoveToTrack(this TimelineClip clip, TrackAsset destinationTrack) |
|
{ |
|
if (clip == null) |
|
{ |
|
throw new ArgumentNullException($"'this' argument for {nameof(MoveToTrack)} cannot be null."); |
|
} |
|
|
|
if (destinationTrack == null) |
|
{ |
|
throw new ArgumentNullException("Cannot move TimelineClip to a null track."); |
|
} |
|
|
|
TrackAsset parentTrack = clip.GetParentTrack(); |
|
Object asset = clip.asset; |
|
|
|
// If the asset is null we cannot validate its type against the destination track |
|
if (asset == null) |
|
{ |
|
throw new InvalidOperationException("Cannot move a TimelineClip to a different track if the TimelineClip's PlayableAsset is null."); |
|
} |
|
|
|
if (parentTrack == destinationTrack) |
|
{ |
|
throw new InvalidOperationException($"TimelineClip is already on {destinationTrack.name}."); |
|
} |
|
|
|
if (!destinationTrack.ValidateClipType(asset.GetType())) |
|
{ |
|
throw new InvalidOperationException($"Track {destinationTrack.name} cannot contain clips of type {clip.GetType().Name}."); |
|
} |
|
|
|
MoveToTrack_Impl(clip, destinationTrack, asset, parentTrack); |
|
} |
|
|
|
/// <summary> |
|
/// Tries to move a TimelineClip to a different track. Validates that the destination track can accept the clip before performing the move. |
|
/// Fails if the clip's PlayableAsset is null, the current and destination tracks are the same or the destination track cannot accept the clip. |
|
/// </summary> |
|
/// <param name="clip">Clip that is being moved</param> |
|
/// <param name="destinationTrack">Desired destination track</param> |
|
/// <returns>Returns true if the clip was successfully moved to the destination track, false otherwise. Also returns false if either argument is null</returns> |
|
/// <exception cref="System.ArgumentNullException">Thrown if <paramref name="clip"/> or <paramref name="destinationTrack"/> are null</exception> |
|
public static bool TryMoveToTrack(this TimelineClip clip, TrackAsset destinationTrack) |
|
{ |
|
if (clip == null) |
|
{ |
|
throw new ArgumentNullException($"'this' argument for {nameof(TryMoveToTrack)} cannot be null."); |
|
} |
|
|
|
if (destinationTrack == null) |
|
{ |
|
throw new ArgumentNullException("Cannot move TimelineClip to a null parent."); |
|
} |
|
|
|
TrackAsset parentTrack = clip.GetParentTrack(); |
|
Object asset = clip.asset; |
|
|
|
// If the asset is null we cannot validate its type against the destination track |
|
if (asset == null) |
|
{ |
|
return false; |
|
} |
|
|
|
if (parentTrack != destinationTrack) |
|
{ |
|
if (!destinationTrack.ValidateClipType(asset.GetType())) |
|
{ |
|
return false; |
|
} |
|
|
|
MoveToTrack_Impl(clip, destinationTrack, asset, parentTrack); |
|
|
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
static void MoveToTrack_Impl(TimelineClip clip, TrackAsset destinationTrack, Object asset, TrackAsset parentTrack) |
|
{ |
|
TimelineUndo.PushUndo(asset, k_UndoSetParentTrackText); |
|
if (parentTrack != null) |
|
{ |
|
TimelineUndo.PushUndo(parentTrack, k_UndoSetParentTrackText); |
|
} |
|
|
|
TimelineUndo.PushUndo(destinationTrack, k_UndoSetParentTrackText); |
|
|
|
clip.SetParentTrack_Internal(destinationTrack); |
|
|
|
if (parentTrack == null) |
|
{ |
|
TimelineCreateUtilities.SaveAssetIntoObject(asset, destinationTrack); |
|
} |
|
else if (parentTrack.timelineAsset != destinationTrack.timelineAsset) |
|
{ |
|
TimelineCreateUtilities.RemoveAssetFromObject(asset, parentTrack); |
|
TimelineCreateUtilities.SaveAssetIntoObject(asset, destinationTrack); |
|
} |
|
} |
|
} |
|
}
|
|
|