125 lines
3.9 KiB
C#
125 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});
|
||
|
}
|
||
|
}
|
||
|
}
|