123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- 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});
- }
- }
- }
|