diff options
Diffstat (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/ItemAction.cs')
| -rw-r--r-- | Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/ItemAction.cs | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/ItemAction.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/ItemAction.cs new file mode 100644 index 0000000..cd4c3a4 --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/ItemAction.cs @@ -0,0 +1,124 @@ +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}); + } + } +} |
