diff options
| author | Andrew Lee <alee14498@protonmail.com> | 2020-04-19 17:19:32 -0400 |
|---|---|---|
| committer | Andrew Lee <alee14498@protonmail.com> | 2020-04-19 17:19:32 -0400 |
| commit | c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78 (patch) | |
| tree | ee4d51c7c1d633e11f46453ef1edd3c77c4ef9f7 /Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/Menus/MenuItemActionBase.cs | |
| download | Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.tar.gz Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.tar.bz2 Project-Sandbox-c55fba8ab2a1c9d3df65eda4a5a1e957f4aa1f78.zip | |
Inital commit
Diffstat (limited to 'Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/Menus/MenuItemActionBase.cs')
| -rw-r--r-- | Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/Menus/MenuItemActionBase.cs | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/Menus/MenuItemActionBase.cs b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/Menus/MenuItemActionBase.cs new file mode 100644 index 0000000..241650f --- /dev/null +++ b/Library/PackageCache/com.unity.timeline@1.2.13/Editor/Actions/Menus/MenuItemActionBase.cs @@ -0,0 +1,177 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace UnityEditor.Timeline +{ + enum MenuActionDisplayState + { + Visible, + Disabled, + Hidden + } + + struct MenuActionItem + { + public string category; + public string entryName; + public string shortCut; + public int priority; + public bool isChecked; + public bool isActiveInMode; + public MenuActionDisplayState state; + public GenericMenu.MenuFunction callback; + } + + class MenuItemActionBase + { + public Vector2? mousePosition { get; set; } + + protected static bool s_ShowActionTriggeredByShortcut = false; + + private static MenuEntryAttribute NoMenu = new MenuEntryAttribute(null, MenuOrder.DefaultPriority); + private MenuEntryAttribute m_MenuInfo; + private string m_ShortCut = null; + + + public static IEnumerable<Type> GetActionsOfType(Type actionType) + { + var query = TypeCache.GetTypesDerivedFrom(actionType).Where(type => !type.IsGenericType && !type.IsNested && !type.IsAbstract); + return query; + } + + public static ShortcutAttribute GetShortcutAttributeForAction(MenuItemActionBase action) + { + var shortcutAttributes = action.GetType() + .GetCustomAttributes(typeof(ShortcutAttribute), true) + .Cast<ShortcutAttribute>(); + + foreach (var shortcutAttribute in shortcutAttributes) + { + var shortcutOverride = shortcutAttribute as ShortcutPlatformOverrideAttribute; + if (shortcutOverride != null) + { + if (shortcutOverride.MatchesCurrentPlatform()) + return shortcutOverride; + } + else + { + return shortcutAttribute; + } + } + + return null; + } + + public static void BuildMenu(GenericMenu menu, List<MenuActionItem> items) + { + // sorted the outer menu by priority, then sort the innermenu by priority + var sortedItems = + items.GroupBy(x => string.IsNullOrEmpty(x.category) ? x.entryName : x.category). + OrderBy(x => x.Min(y => y.priority)). + SelectMany(x => x.OrderBy(z => z.priority)); + + int lastPriority = Int32.MinValue; + string lastCategory = string.Empty; + + foreach (var s in sortedItems) + { + if (s.state == MenuActionDisplayState.Hidden) + continue; + + var priority = s.priority; + if (lastPriority == Int32.MinValue) + { + lastPriority = priority; + } + else if ((priority / MenuOrder.SeparatorAt) > (lastPriority / MenuOrder.SeparatorAt)) + { + string path = String.Empty; + if (lastCategory == s.category) + path = s.category; + menu.AddSeparator(path); + } + + lastPriority = priority; + lastCategory = s.category; + + string entry = s.category + s.entryName; + if (!string.IsNullOrEmpty(s.shortCut)) + entry += " " + s.shortCut; + + if (s.state == MenuActionDisplayState.Visible && s.isActiveInMode) + menu.AddItem(new GUIContent(entry), s.isChecked, s.callback); + else + menu.AddDisabledItem(new GUIContent(entry)); + } + } + + public static ActiveInModeAttribute GetActiveInModeAttribute(MenuItemActionBase action) + { + var attr = action.GetType().GetCustomAttributes(typeof(ActiveInModeAttribute), true); + + if (attr.Length > 0) + return (attr[0] as ActiveInModeAttribute); + + return null; + } + + public static bool IsActionActiveInMode(MenuItemActionBase action, TimelineModes mode) + { + ActiveInModeAttribute attr = GetActiveInModeAttribute(action); + return attr != null && (attr.modes & mode) != 0; + } + + public int priority + { + get { return menuInfo.priority; } + } + + public string category + { + get { return menuInfo.subMenuPath; } + } + + public string menuName + { + get + { + if (string.IsNullOrEmpty(menuInfo.name)) + return L10n.Tr(GetType().Name); + return menuInfo.name; + } + } + + // shortcut used by the menu + public string shortCut + { + get + { + if (m_ShortCut == null) + { + var shortcutAttribute = GetShortcutAttributeForAction(this); + m_ShortCut = shortcutAttribute == null ? string.Empty : shortcutAttribute.GetMenuShortcut(); + } + return m_ShortCut; + } + } + + public bool showInMenu + { + get { return menuInfo != NoMenu; } + } + + private MenuEntryAttribute menuInfo + { + get + { + if (m_MenuInfo == null) + m_MenuInfo = GetType().GetCustomAttributes(typeof(MenuEntryAttribute), false).OfType<MenuEntryAttribute>().DefaultIfEmpty(NoMenu).First(); + return m_MenuInfo; + } + } + } +} |
