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);
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
                }
            }
        }
Esempio n. 7
0
        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);
                }
            }
        }
Esempio n. 9
0
        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)
            });
        }
Esempio n. 10
0
        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);
        }