124 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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;
 | |
|         }
 | |
|     }
 | |
| }
 |