123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- using System;
- using System.ComponentModel;
- using System.Linq;
- using System.Reflection;
- using UnityEditor.ShortcutManagement;
- using UnityEngine;
-
- namespace UnityEditor.Timeline.Actions
- {
- /// interface indicating an Action class
- interface IAction { }
-
- /// extension methods for IActions
- static class ActionExtensions
- {
- const string kActionPostFix = "Action";
-
- public static string GetUndoName(this IAction action)
- {
- if (action == null)
- throw new ArgumentNullException(nameof(action));
-
- var attr = action.GetType().GetCustomAttribute<ApplyDefaultUndoAttribute>(false);
- if (attr != null && !string.IsNullOrWhiteSpace(attr.UndoTitle))
- return attr.UndoTitle;
-
- return action.GetDisplayName();
- }
-
- public static string GetMenuEntryName(this IAction action)
- {
- var menuAction = action as IMenuName;
- if (menuAction != null && !string.IsNullOrWhiteSpace(menuAction.menuName))
- return menuAction.menuName;
-
- var attr = action.GetType().GetCustomAttribute<MenuEntryAttribute>(false);
- if (attr != null && !string.IsNullOrWhiteSpace(attr.name))
- return attr.name;
-
- return action.GetDisplayName();
- }
-
- public static string GetDisplayName(this IAction action)
- {
- if (action == null)
- throw new ArgumentNullException(nameof(action));
-
- var attr = action.GetType().GetCustomAttribute<DisplayNameAttribute>(false);
- if (attr != null && !string.IsNullOrEmpty(attr.DisplayName))
- return attr.DisplayName;
-
- var name = action.GetType().Name;
- if (name.EndsWith(kActionPostFix))
- return ObjectNames.NicifyVariableName(name.Substring(0, name.Length - kActionPostFix.Length));
-
- return ObjectNames.NicifyVariableName(name);
- }
-
- public static bool HasAutoUndo(this IAction action)
- {
- return action != null && ActionManager.ActionsWithAutoUndo.Contains(action.GetType());
- }
-
- public static bool IsChecked(this IAction action)
- {
- return (action is IMenuChecked menuAction) && menuAction.isChecked;
- }
-
- public static bool IsActionActiveInMode(this IAction action, TimelineModes mode)
- {
- var attr = action.GetType().GetCustomAttribute<ActiveInModeAttribute>(true);
- return attr != null && (attr.modes & mode) != 0;
- }
-
- public static string GetShortcut(this IAction action)
- {
- if (action == null)
- throw new ArgumentNullException(nameof(action));
-
- var shortcutAttribute = GetShortcutAttributeForAction(action);
- var shortCut = shortcutAttribute == null ? string.Empty : shortcutAttribute.GetMenuShortcut();
- if (string.IsNullOrWhiteSpace(shortCut))
- {
- //Check if there is a static method with attribute
- var customShortcutMethod = action.GetType().GetMethods().FirstOrDefault(m => m.GetCustomAttribute<TimelineShortcutAttribute>(true) != null);
- if (customShortcutMethod != null)
- {
- var shortcutId = customShortcutMethod.GetCustomAttribute<TimelineShortcutAttribute>(true).identifier;
- var shortcut = ShortcutIntegration.instance.directory.FindShortcutEntry(shortcutId);
- if (shortcut != null && shortcut.combinations.Any())
- shortCut = KeyCombination.SequenceToMenuString(shortcut.combinations);
- }
- }
-
- return shortCut;
- }
-
- static ShortcutAttribute GetShortcutAttributeForAction(this IAction action)
- {
- if (action == null)
- throw new ArgumentNullException(nameof(action));
-
- var shortcutAttributes = action.GetType()
- .GetCustomAttributes(typeof(ShortcutAttribute), true)
- .Cast<ShortcutAttribute>();
-
- foreach (var shortcutAttribute in shortcutAttributes)
- {
- if (shortcutAttribute is ShortcutPlatformOverrideAttribute shortcutOverride)
- {
- if (shortcutOverride.MatchesCurrentPlatform())
- return shortcutOverride;
- }
- else
- {
- return shortcutAttribute;
- }
- }
-
- return null;
- }
- }
- }
|