using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; using UnityEditor.Timeline.Actions; using UnityEngine; using UnityEngine.Timeline; namespace UnityEditor.Timeline { [MenuEntry("Add Override Track", MenuPriority.CustomTrackActionSection.addOverrideTrack), UsedImplicitly] class AddOverrideTrackAction : TrackAction { public override bool Execute(IEnumerable tracks) { foreach (var animTrack in tracks.OfType()) { TimelineHelpers.CreateTrack(typeof(AnimationTrack), animTrack, "Override " + animTrack.GetChildTracks().Count()); } return true; } public override ActionValidity Validate(IEnumerable tracks) { if (tracks.Any(t => t.isSubTrack || !t.GetType().IsAssignableFrom(typeof(AnimationTrack)))) return ActionValidity.NotApplicable; if (tracks.Any(t => t.lockedInHierarchy)) return ActionValidity.Invalid; return ActionValidity.Valid; } } [MenuEntry("Convert To Clip Track", MenuPriority.CustomTrackActionSection.convertToClipMode), UsedImplicitly] class ConvertToClipModeAction : TrackAction { public override bool Execute(IEnumerable tracks) { foreach (var animTrack in tracks.OfType()) animTrack.ConvertToClipMode(); TimelineEditor.Refresh(RefreshReason.ContentsAddedOrRemoved); return true; } public override ActionValidity Validate(IEnumerable tracks) { if (tracks.Any(t => !t.GetType().IsAssignableFrom(typeof(AnimationTrack)))) return ActionValidity.NotApplicable; if (tracks.Any(t => t.lockedInHierarchy)) return ActionValidity.Invalid; if (tracks.OfType().All(a => a.CanConvertToClipMode())) return ActionValidity.Valid; return ActionValidity.NotApplicable; } } [MenuEntry("Convert To Infinite Clip", MenuPriority.CustomTrackActionSection.convertFromClipMode), UsedImplicitly] class ConvertFromClipTrackAction : TrackAction { public override bool Execute(IEnumerable tracks) { foreach (var animTrack in tracks.OfType()) animTrack.ConvertFromClipMode(TimelineEditor.inspectedAsset); TimelineEditor.Refresh(RefreshReason.ContentsAddedOrRemoved); return true; } public override ActionValidity Validate(IEnumerable tracks) { if (tracks.Any(t => !t.GetType().IsAssignableFrom(typeof(AnimationTrack)))) return ActionValidity.NotApplicable; if (tracks.Any(t => t.lockedInHierarchy)) return ActionValidity.Invalid; if (tracks.OfType().All(a => a.CanConvertFromClipMode())) return ActionValidity.Valid; return ActionValidity.NotApplicable; } } abstract class TrackOffsetBaseAction : TrackAction { public abstract TrackOffset trackOffset { get; } public override ActionValidity Validate(IEnumerable tracks) { if (tracks.Any(t => !t.GetType().IsAssignableFrom(typeof(AnimationTrack)))) return ActionValidity.NotApplicable; if (tracks.Any(t => t.lockedInHierarchy)) { return ActionValidity.Invalid; } return ActionValidity.Valid; } public override bool Execute(IEnumerable tracks) { foreach (var animTrack in tracks.OfType()) { animTrack.UnarmForRecord(); animTrack.trackOffset = trackOffset; } TimelineEditor.Refresh(RefreshReason.ContentsModified); return true; } } [MenuEntry("Track Offsets/Apply Transform Offsets", MenuPriority.CustomTrackActionSection.applyTrackOffset), UsedImplicitly] [ApplyDefaultUndo] class ApplyTransformOffsetAction : TrackOffsetBaseAction { public override TrackOffset trackOffset { get { return TrackOffset.ApplyTransformOffsets; } } } [MenuEntry("Track Offsets/Apply Scene Offsets", MenuPriority.CustomTrackActionSection.applySceneOffset), UsedImplicitly] [ApplyDefaultUndo] class ApplySceneOffsetAction : TrackOffsetBaseAction { public override TrackOffset trackOffset { get { return TrackOffset.ApplySceneOffsets; } } } [MenuEntry("Track Offsets/Auto (Deprecated)", MenuPriority.CustomTrackActionSection.applyAutoOffset), UsedImplicitly] [ApplyDefaultUndo] class ApplyAutoAction : TrackOffsetBaseAction { public override TrackOffset trackOffset { get { return TrackOffset.Auto; } } } }