rimworld-animation-studio/Library/PackageCache/com.unity.timeline@1.2.18/Editor/Actions/ItemAction.cs
2022-09-13 00:36:34 -05:00

124 lines
3.9 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Timeline;
namespace UnityEditor.Timeline
{
[ActiveInMode(TimelineModes.Default)]
abstract class ItemAction<T> : MenuItemActionBase where T : class
{
public abstract bool Execute(WindowState state, T[] items);
protected virtual MenuActionDisplayState GetDisplayState(WindowState state, T[] items)
{
return items.Length > 0 ? MenuActionDisplayState.Visible : MenuActionDisplayState.Disabled;
}
protected virtual string GetDisplayName(T[] items)
{
return menuName;
}
public bool CanExecute(WindowState state, T[] items)
{
return GetDisplayState(state, items) == MenuActionDisplayState.Visible;
}
protected virtual void AddMenuItem(WindowState state, T[] items, List<MenuActionItem> menuItem)
{
var mode = TimelineWindow.instance.currentMode.mode;
menuItem.Add(
new MenuActionItem()
{
category = category,
entryName = GetDisplayName(items),
shortCut = this.shortCut,
isChecked = false,
isActiveInMode = IsActionActiveInMode(this, mode),
priority = priority,
state = GetDisplayState(state, items),
callback = () => Execute(state, items)
}
);
}
public static bool HandleShortcut(WindowState state, Event evt, T item)
{
T[] items = { item };
foreach (ItemAction<T> action in actions)
{
var attr = action.GetType().GetCustomAttributes(typeof(ShortcutAttribute), true);
foreach (ShortcutAttribute shortcut in attr)
{
if (shortcut.MatchesEvent(evt))
{
if (s_ShowActionTriggeredByShortcut)
Debug.Log(action.GetType().Name);
if (!IsActionActiveInMode(action, TimelineWindow.instance.currentMode.mode))
return false;
var result = action.Execute(state, items);
state.Refresh();
state.Evaluate();
return result;
}
}
}
return false;
}
static List<ItemAction<T>> s_ActionClasses;
static List<ItemAction<T>> actions
{
get
{
if (s_ActionClasses == null)
{
s_ActionClasses = GetActionsOfType(typeof(ItemAction<T>)).Select(x => (ItemAction<T>)x.GetConstructors()[0].Invoke(null)).ToList();
}
return s_ActionClasses;
}
}
public static void GetMenuEntries(T[] items, List<MenuActionItem> menuItems)
{
if (items == null || items.Length == 0)
return;
foreach (var action in actions)
{
if (action.showInMenu)
action.AddMenuItem(TimelineWindow.instance.state, items, menuItems);
}
}
public static bool Invoke<TAction>(WindowState state, T[] items)
where TAction : ItemAction<T>
{
var itemsDerived = items.ToArray();
if (!itemsDerived.Any())
return false;
var action = actions.FirstOrDefault(x => x.GetType() == typeof(TAction));
if (action != null)
return action.Execute(state, itemsDerived);
return false;
}
public static bool Invoke<TAction>(WindowState state, T item)
where TAction : ItemAction<T>
{
return Invoke<TAction>(state, new[] {item});
}
}
}