SW-Wiktor-Bombola/SW-Unity/Library/PackageCache/com.unity.timeline@1.2.18/Editor/Animation/AnimationClipActions.cs
2021-12-04 15:15:29 +01:00

97 lines
3.8 KiB
C#

using System.ComponentModel;
using System.Linq;
using JetBrains.Annotations;
using UnityEngine;
using UnityEngine.Timeline;
using UnityEngine.Playables;
using ClipAction = UnityEditor.Timeline.ItemAction<UnityEngine.Timeline.TimelineClip>;
namespace UnityEditor.Timeline
{
[MenuEntry("Match Offsets To Previous Clip", MenuOrder.CustomClipAction.AnimClipMatchPrevious), UsedImplicitly]
class MatchOffsetsPreviousAction : ClipAction
{
public override bool Execute(WindowState state, TimelineClip[] items)
{
AnimationOffsetMenu.MatchClipsToPrevious(state, items.Where(x => IsValidClip(x, TimelineEditor.inspectedDirector)).ToArray());
return true;
}
private static bool IsValidClip(TimelineClip clip, PlayableDirector director)
{
return clip != null &&
clip.parentTrack != null &&
(clip.asset as AnimationPlayableAsset) != null &&
clip.parentTrack.clips.Any(x => x.start < clip.start) &&
TimelineUtility.GetSceneGameObject(director, clip.parentTrack) != null;
}
protected override MenuActionDisplayState GetDisplayState(WindowState state, TimelineClip[] items)
{
if (!items.All(TimelineAnimationUtilities.IsAnimationClip))
return MenuActionDisplayState.Hidden;
var director = TimelineEditor.inspectedDirector;
if (TimelineEditor.inspectedDirector == null)
return MenuActionDisplayState.Hidden;
if (items.Any(c => IsValidClip(c, director)))
return MenuActionDisplayState.Visible;
return MenuActionDisplayState.Hidden;
}
}
[MenuEntry("Match Offsets To Next Clip", MenuOrder.CustomClipAction.AnimClipMatchNext), UsedImplicitly]
class MatchOffsetsNextAction : ClipAction
{
public override bool Execute(WindowState state, TimelineClip[] items)
{
AnimationOffsetMenu.MatchClipsToNext(state, items.Where(x => IsValidClip(x, TimelineEditor.inspectedDirector)).ToArray());
return true;
}
private static bool IsValidClip(TimelineClip clip, PlayableDirector director)
{
return clip != null &&
clip.parentTrack != null &&
(clip.asset as AnimationPlayableAsset) != null &&
clip.parentTrack.clips.Any(x => x.start > clip.start) &&
TimelineUtility.GetSceneGameObject(director, clip.parentTrack) != null;
}
protected override MenuActionDisplayState GetDisplayState(WindowState state, TimelineClip[] items)
{
if (!items.All(TimelineAnimationUtilities.IsAnimationClip))
return MenuActionDisplayState.Hidden;
var director = TimelineEditor.inspectedDirector;
if (TimelineEditor.inspectedDirector == null)
return MenuActionDisplayState.Hidden;
if (items.Any(c => IsValidClip(c, director)))
return MenuActionDisplayState.Visible;
return MenuActionDisplayState.Hidden;
}
}
[MenuEntry("Reset Offsets", MenuOrder.CustomClipAction.AnimClipResetOffset), UsedImplicitly]
class ResetOffsets : ClipAction
{
public override bool Execute(WindowState state, TimelineClip[] items)
{
AnimationOffsetMenu.ResetClipOffsets(state, items.Where(TimelineAnimationUtilities.IsAnimationClip).ToArray());
return true;
}
protected override MenuActionDisplayState GetDisplayState(WindowState state, TimelineClip[] items)
{
if (!items.All(TimelineAnimationUtilities.IsAnimationClip))
return MenuActionDisplayState.Hidden;
return MenuActionDisplayState.Visible;
}
}
}