public IEnumerable <SequenceContext> GetSubSequences() { var contexts = editSequence.asset?.flattenedTracks .SelectMany(x => x.clips) .Where((TimelineUtility.HasCustomEditor)) .SelectMany((clip => TimelineUtility.GetSubTimelines(clip, TimelineEditor.inspectedDirector) .Select(director => new SequenceContext(director, clip)))); return(contexts); }
bool IsValid(WindowState state, TimelineClip[] clips) { if (clips.Length != 1 || state == null || state.editSequence.director == null) { return(false); } var clip = clips[0]; var directors = TimelineUtility.GetSubTimelines(clip, state.editSequence.director); return(directors.Any(x => x != null)); }
public override ActionValidity Validate(IEnumerable <TimelineClip> clips) { if (clips == null || clips.Count() != 1 || TimelineEditor.inspectedDirector == null) { return(ActionValidity.NotApplicable); } var clip = clips.First(); var directors = TimelineUtility.GetSubTimelines(clip, TimelineEditor.inspectedDirector); return(directors.Any(x => x != null) ? ActionValidity.Valid : ActionValidity.NotApplicable); }
public override bool Execute(WindowState state, TimelineClip[] clips) { if (!IsValid(state, clips)) { return(false); } var clip = clips[0]; var directors = TimelineUtility.GetSubTimelines(clip, state.editSequence.director); ExecuteInternal(state, directors, 0, clip); return(true); }
public override bool Execute(IEnumerable <TimelineClip> clips) { if (Validate(clips) != ActionValidity.Valid) { return(false); } var clip = clips.First(); var directors = TimelineUtility.GetSubTimelines(clip, TimelineEditor.inspectedDirector); ExecuteInternal(directors, 0, clip); return(true); }
internal void AddMenuItem(List <MenuActionItem> menuItems) { var clips = TimelineEditor.selectedClips; if (clips == null || clips.Length != 1) { return; } var mode = TimelineWindow.instance.currentMode.mode; MenuEntryAttribute menuAttribute = GetType().GetCustomAttributes(typeof(MenuEntryAttribute), false).OfType <MenuEntryAttribute>().FirstOrDefault(); var menuItem = new MenuActionItem() { category = menuAttribute.subMenuPath ?? string.Empty, entryName = menuAttribute.name, isActiveInMode = this.IsActionActiveInMode(mode), priority = menuAttribute.priority, state = Validate(clips), callback = null }; var subDirectors = TimelineUtility.GetSubTimelines(clips[0], TimelineEditor.inspectedDirector); if (subDirectors.Count == 1) { menuItem.entryName = SingleItemPrefix + DisplayNameHelper.GetDisplayName(subDirectors[0]); menuItem.callback = () => { Execute(clips); }; menuItems.Add(menuItem); } else { for (int i = 0; i < subDirectors.Count; i++) { var index = i; menuItem.category = MultiItemPrefix; menuItem.entryName = DisplayNameHelper.GetDisplayName(subDirectors[i]); menuItem.callback = () => { ExecuteInternal(subDirectors, index, clips[0]); }; menuItems.Add(menuItem); } } }
protected override void AddSelfToMenu(GenericMenu menu, WindowState state, TimelineClip[] items) { if (GetDisplayState(state, items) == MenuActionDisplayState.Hidden) { return; } // GetDisplayState() guarantees that all that follows is valid var clip = items[0]; var subDirectors = TimelineUtility.GetSubTimelines(clip, state.editSequence.director); var separator = GetSeparator(this); if (separator != null && separator.before) { menu.AddSeparator(""); } if (subDirectors.Count == 1) { menu.AddItem(new GUIContent("Edit " + DisplayNameHelper.GetDisplayName(subDirectors[0])), false, f => { ExecuteInternal(state, subDirectors, 0, clip); }, this); } else { const string prefix = "Edit Sub-Timelines/"; for (int i = 0, n = subDirectors.Count; i < n; i++) { var directorIndex = i; menu.AddItem( new GUIContent(prefix + DisplayNameHelper.GetDisplayName(subDirectors[directorIndex])), false, f => { ExecuteInternal(state, subDirectors, directorIndex, clip); }, this); } } if (separator != null && separator.after) { menu.AddSeparator(""); } }
protected override void AddMenuItem(WindowState state, TimelineClip[] items, List <MenuActionItem> menuItems) { if (items == null || items.Length != 1) { return; } var mode = TimelineWindow.instance.currentMode.mode; var menuItem = new MenuActionItem() { category = category, entryName = GetDisplayName(items), shortCut = string.Empty, isChecked = false, isActiveInMode = IsActionActiveInMode(this, mode), priority = priority, state = GetDisplayState(state, items), callback = null }; var subDirectors = TimelineUtility.GetSubTimelines(items[0], state.editSequence.director); if (subDirectors.Count == 1) { menuItem.entryName = SingleItemPrefix + DisplayNameHelper.GetDisplayName(subDirectors[0]); menuItem.callback = () => Execute(state, items); menuItems.Add(menuItem); } else { for (int i = 0; i < subDirectors.Count; i++) { var index = i; menuItem.category = MultiItemPrefix; menuItem.entryName = DisplayNameHelper.GetDisplayName(subDirectors[i]); menuItem.callback = () => ExecuteInternal(state, subDirectors, index, items[0]); menuItems.Add(menuItem); } } }
public static SequencePathSubElement Create(ISequenceState state, IExposedPropertyTable resolver) { var clip = state.hostClip; Debug.Assert(clip != null); var track = clip.parentTrack; Debug.Assert(track != null); var asset = track.timelineAsset; Debug.Assert(asset != null); var directors = TimelineUtility.GetSubTimelines(clip, resolver as PlayableDirector); return(new SequencePathSubElement { trackInstanceID = track.GetInstanceID(), trackHash = track.Hash(), clipIndex = Array.IndexOf(track.clips, clip), clipHash = clip.Hash(), subDirectorIndex = directors.IndexOf(state.director) }); }
static bool ValidateSubElements(List <SequencePathSubElement> subElements, PlayableDirector director, out List <SequenceBuildingBlock> buildingBlocks) { buildingBlocks = new List <SequenceBuildingBlock>(subElements.Count); var currentDirector = director; foreach (var element in subElements) { var timeline = currentDirector.playableAsset as TimelineAsset; if (timeline == null) { return(false); } if (timeline.trackObjects == null) { return(false); } var track = timeline.GetOutputTracks().FirstOrDefault(t => t.GetInstanceID() == element.trackInstanceID); if (track == null) { return(false); } if (track.Hash() != element.trackHash) { return(false); } if (track.clips == null) { return(false); } if (track.clips.Length <= element.clipIndex) { return(false); } var clip = track.clips[element.clipIndex]; if (clip == null) { return(false); } if (clip.Hash() != element.clipHash) { return(false); } var candidateDirectors = TimelineUtility.GetSubTimelines(clip, director); if (element.subDirectorIndex < 0 || element.subDirectorIndex >= candidateDirectors.Count) { return(false); } var candidateDirector = candidateDirectors[element.subDirectorIndex]; if (candidateDirector == null || !(candidateDirector.playableAsset is TimelineAsset)) { return(false); } currentDirector = candidateDirector; buildingBlocks.Add( new SequenceBuildingBlock { asset = currentDirector.playableAsset as TimelineAsset, director = currentDirector, hostClip = clip }); } return(true); }