// find the playable asset types that are unhandled private static IEnumerable <Type> GetUnhandledClipTypes() { var typesHandledByTrack = AllTrackTypes().SelectMany(t => GetTrackClipTypesFromAttributes(t)); // exclude anything in the timeline assembly, handled by tracks, has a hide in menu attribute // or is explicity ignored return(AllClipTypes() .Except(typesHandledByTrack) .Where(t => !TypeUtility.IsBuiltIn(t)) // exclude built-in .Where(t => !typeof(TrackAsset).IsAssignableFrom(t)) // exclude track types (they are playable assets) .Where(t => !t.IsDefined(typeof(HideInMenuAttribute), false) && !t.IsDefined(typeof(IgnoreOnPlayableTrackAttribute), true)) .Distinct()); }
static void AddMarkerMenuCommands(List <MenuActionItem> menu, IEnumerable <Type> markerTypes, Action <Type, Object> addMarkerCommand, bool enabled) { int builtInPriority = MenuPriority.AddItem.addMarker; int customPriority = MenuPriority.AddItem.addCustomMarker; foreach (var markerType in markerTypes) { var markerItemType = markerType; string category = TimelineHelpers.GetItemCategoryName(markerItemType); menu.Add( new MenuActionItem() { category = category, entryName = string.Format(Styles.addItemTemplate, TypeUtility.GetDisplayName(markerType)), isActiveInMode = true, priority = TypeUtility.IsBuiltIn(markerType) ? builtInPriority++ : customPriority++, state = enabled ? ActionValidity.Valid : ActionValidity.Invalid, callback = () => addMarkerCommand(markerItemType, null) } ); foreach (var objectReference in TypeUtility.ObjectReferencesForType(markerType)) { var isSceneReference = objectReference.isSceneReference; GenericMenu.MenuFunction menuCallback = () => { Type assetDataType = objectReference.type; ObjectSelector.get.titleContent = EditorGUIUtility.TrTextContent(string.Format(Styles.typeSelectorTemplate, TypeUtility.GetDisplayName(assetDataType))); ObjectSelector.get.Show(null, assetDataType, null, isSceneReference, null, obj => { if (obj != null) { addMarkerCommand(markerItemType, obj); } }, null); }; menu.Add( new MenuActionItem { category = TimelineHelpers.GetItemCategoryName(markerItemType), entryName = string.Format(Styles.addItemFromAssetTemplate, TypeUtility.GetDisplayName(markerType), TypeUtility.GetDisplayName(objectReference.type)), isActiveInMode = true, priority = TypeUtility.IsBuiltIn(markerType) ? builtInPriority++ : customPriority++, state = enabled ? ActionValidity.Valid : ActionValidity.Invalid, callback = menuCallback } ); } } }
static void AddMarkerMenuCommands(List <MenuActionItem> menu, IEnumerable <Type> markerTypes, Action <Type, Object> addMarkerCommand, bool enabled) { int builtInPriority = MenuOrder.AddMarkerItemStart; int customPriority = MenuOrder.AddCustomMarkerItemStart; foreach (var markerType in markerTypes) { var markerItemType = markerType; string category = TimelineHelpers.GetItemCategoryName(markerItemType); menu.Add( new MenuActionItem() { category = category, entryName = string.Format(Styles.addItemTemplate, TypeUtility.GetDisplayName(markerType)), shortCut = string.Empty, isActiveInMode = true, isChecked = false, priority = TypeUtility.IsBuiltIn(markerType) ? builtInPriority++ : customPriority++, state = enabled ? MenuActionDisplayState.Visible : MenuActionDisplayState.Disabled, callback = () => addMarkerCommand(markerItemType, null) } ); foreach (var objectReference in TypeUtility.ObjectReferencesForType(markerType)) { var isSceneReference = objectReference.isSceneReference; GenericMenu.MenuFunction menuCallback = () => { var dataType = markerItemType; ObjectSelector.get.Show(null, dataType, null, isSceneReference, null, (obj) => addMarkerCommand(markerItemType, obj), null); ObjectSelector.get.titleContent = EditorGUIUtility.TrTextContent(string.Format(Styles.typeSelectorTemplate, TypeUtility.GetDisplayName(dataType))); }; menu.Add( new MenuActionItem() { category = TimelineHelpers.GetItemCategoryName(markerItemType), entryName = string.Format(Styles.addItemFromAssetTemplate, TypeUtility.GetDisplayName(markerType), TypeUtility.GetDisplayName(objectReference.type)), shortCut = string.Empty, isActiveInMode = true, isChecked = false, priority = TypeUtility.IsBuiltIn(markerType) ? builtInPriority++ : customPriority++, state = enabled ? MenuActionDisplayState.Visible : MenuActionDisplayState.Disabled, callback = menuCallback } ); } } }
public static void BuildNewTracksContextMenu(List <MenuActionItem> menuItems, ICollection <TrackAsset> parentTracks, WindowState state, string format = null) { if (parentTracks == null) { parentTracks = new TrackAsset[0]; } if (string.IsNullOrEmpty(format)) { format = "{0}"; } // Add Group or SubGroup var title = string.Format(format, parentTracks.Any(t => t != null) ? Styles.trackSubGroup : Styles.trackGroup); var menuState = ActionValidity.Valid; if (state.editSequence.isReadOnly) { menuState = ActionValidity.Invalid; } if (parentTracks.Any() && parentTracks.Any(t => t != null && t.lockedInHierarchy)) { menuState = ActionValidity.Invalid; } GenericMenu.MenuFunction command = () => { SelectionManager.Clear(); if (parentTracks.Count == 0) { Selection.Add(TimelineHelpers.CreateTrack <GroupTrack>(null, title)); } foreach (var parentTrack in parentTracks) { Selection.Add(TimelineHelpers.CreateTrack <GroupTrack>(parentTrack, title)); } TimelineEditor.Refresh(RefreshReason.ContentsAddedOrRemoved); }; menuItems.Add( new MenuActionItem() { category = string.Empty, entryName = title, isActiveInMode = true, priority = MenuPriority.AddItem.addGroup, state = menuState, isChecked = false, callback = command } ); var allTypes = TypeUtility.AllTrackTypes().Where(x => x != typeof(GroupTrack) && !TypeUtility.IsHiddenInMenu(x)).ToList(); int builtInPriority = MenuPriority.AddItem.addTrack; int customPriority = MenuPriority.AddItem.addCustomTrack; foreach (var trackType in allTypes) { var trackItemType = trackType; command = () => { SelectionManager.Clear(); if (parentTracks.Count == 0) { SelectionManager.Add(TimelineHelpers.CreateTrack((Type)trackItemType, null)); } foreach (var parentTrack in parentTracks) { SelectionManager.Add(TimelineHelpers.CreateTrack((Type)trackItemType, parentTrack)); } }; menuItems.Add( new MenuActionItem() { category = TimelineHelpers.GetTrackCategoryName(trackType), entryName = string.Format(format, TimelineHelpers.GetTrackMenuName(trackItemType)), isActiveInMode = true, priority = TypeUtility.IsBuiltIn(trackType) ? builtInPriority++ : customPriority++, state = menuState, callback = command } ); } }
static void AddClipMenuCommands(List <MenuActionItem> menuItems, ICollection <TrackAsset> tracks, double candidateTime) { if (!tracks.Any()) { return; } var trackAsset = tracks.First(); var trackType = trackAsset.GetType(); if (tracks.Any(t => t.GetType() != trackType)) { return; } var enabled = tracks.All(t => t != null && !t.lockedInHierarchy) && !TimelineWindow.instance.state.editSequence.isReadOnly; var assetTypes = TypeUtility.GetPlayableAssetsHandledByTrack(trackType); var visibleAssetTypes = TypeUtility.GetVisiblePlayableAssetsHandledByTrack(trackType); // skips the name if there is only a single type var commandNameTemplate = assetTypes.Count() == 1 ? Styles.addSingleItemFromAssetTemplate : Styles.addItemFromAssetTemplate; int builtInPriority = MenuPriority.AddItem.addClip; int customPriority = MenuPriority.AddItem.addCustomClip; foreach (var assetType in assetTypes) { var assetItemType = assetType; var category = TimelineHelpers.GetItemCategoryName(assetType); Action <Object> onObjectChanged = obj => { if (obj != null) { foreach (var t in tracks) { TimelineHelpers.CreateClipOnTrack(assetItemType, obj, t, candidateTime); } } }; foreach (var objectReference in TypeUtility.ObjectReferencesForType(assetType)) { var isSceneReference = objectReference.isSceneReference; var dataType = objectReference.type; GenericMenu.MenuFunction menuCallback = () => { ObjectSelector.get.Show(null, dataType, null, isSceneReference, null, (obj) => onObjectChanged(obj), null); ObjectSelector.get.titleContent = EditorGUIUtility.TrTextContent(string.Format(Styles.typeSelectorTemplate, TypeUtility.GetDisplayName(dataType))); }; menuItems.Add( new MenuActionItem() { category = category, entryName = string.Format(commandNameTemplate, TypeUtility.GetDisplayName(assetType), TypeUtility.GetDisplayName(objectReference.type)), isActiveInMode = true, priority = TypeUtility.IsBuiltIn(assetType) ? builtInPriority++ : customPriority++, state = enabled ? ActionValidity.Valid : ActionValidity.Invalid, callback = menuCallback } ); } } foreach (var assetType in visibleAssetTypes) { var assetItemType = assetType; var category = TimelineHelpers.GetItemCategoryName(assetType); var commandName = string.Format(Styles.addItemTemplate, TypeUtility.GetDisplayName(assetType)); GenericMenu.MenuFunction command = () => { foreach (var t in tracks) { TimelineHelpers.CreateClipOnTrack(assetItemType, t, candidateTime); } }; menuItems.Add( new MenuActionItem() { category = category, entryName = commandName, isActiveInMode = true, priority = TypeUtility.IsBuiltIn(assetItemType) ? builtInPriority++ : customPriority++, state = enabled ? ActionValidity.Valid : ActionValidity.Invalid, callback = command } ); } }
public static IEnumerable <Type> GetUserMarkerTypes() { return(GetAllMarkerTypes().Where(x => !TypeUtility.IsBuiltIn(x))); }