123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- #if UNITY_2021_2_OR_NEWER
- using UnityEditor.SceneManagement;
- #else
- using UnityEditor.Experimental.SceneManagement;
- #endif
- using UnityEngine.Playables;
- using UnityEngine.Timeline;
- namespace UnityEditor.Timeline
- {
- partial class TimelineWindow
- {
- List<BreadCrumbTitle> m_BreadCrumbLabels = new List<BreadCrumbTitle>(100);
- static TitleMode GetTitleMode(ISequenceState sequence)
- {
- var prefabStage = PrefabStageUtility.GetCurrentPrefabStage();
- // Top level
- if (sequence.hostClip == null)
- {
- if (sequence.director != null && prefabStage != null && prefabStage.IsPartOfPrefabContents(sequence.director.gameObject))
- return TitleMode.Prefab;
- if (sequence.director != null && PrefabUtility.IsPartOfPrefabAsset(sequence.director))
- return TitleMode.PrefabOutOfContext;
- if (sequence.director != null && !sequence.director.isActiveAndEnabled)
- return TitleMode.DisabledComponent;
- if (sequence.director != null)
- return TitleMode.GameObject;
- if (sequence.asset != null)
- return TitleMode.Asset;
- }
- // Subtimelines only get an error icon
- else if (sequence.director != null && !sequence.director.isActiveAndEnabled && !PrefabUtility.IsPartOfPrefabAsset(sequence.director))
- return TitleMode.DisabledComponent;
- return TitleMode.None;
- }
- void DrawBreadcrumbs()
- {
- if (state == null)
- return;
- var count = 0;
- foreach (var sequence in state.GetAllSequences())
- {
- var title = new BreadCrumbTitle
- {
- name = DisplayNameHelper.GetDisplayName(sequence),
- mode = GetTitleMode(sequence)
- };
- if (count >= m_BreadCrumbLabels.Count)
- m_BreadCrumbLabels.Add(title);
- else
- m_BreadCrumbLabels[count] = title;
- count++;
- }
- if (m_BreadCrumbLabels.Count > count)
- m_BreadCrumbLabels.RemoveRange(count, m_BreadCrumbLabels.Count - count);
- using (new EditorGUI.DisabledScope(currentMode.headerState.breadCrumb == TimelineModeGUIState.Disabled))
- {
- var width = position.width - WindowConstants.playControlsWidth - WindowConstants.cogButtonWidth;
- BreadcrumbDrawer.Draw(width, m_BreadCrumbLabels, NavigateToBreadcrumbIndex);
- }
- }
- void NavigateToBreadcrumbIndex(int index)
- {
- state.PopSequencesUntilCount(index + 1);
- }
- void DrawSequenceSelector()
- {
- using (new EditorGUI.DisabledScope(currentMode.headerState.sequenceSelector == TimelineModeGUIState.Disabled))
- {
- if (EditorGUILayout.DropdownButton(DirectorStyles.timelineSelectorArrow, FocusType.Passive, DirectorStyles.Instance.sequenceSwitcher, GUILayout.Width(WindowConstants.selectorWidth)))
- ShowSequenceSelector();
- }
- }
- void ShowSequenceSelector()
- {
- var allDirectors = TimelineUtility.GetDirectorsInSceneUsingAsset(null);
- var formatter = new SequenceMenuNameFormater();
- var namesAndDirectors = new List<ValueTuple<string, PlayableDirector>>();
- foreach (var d in allDirectors)
- {
- if (d.playableAsset is TimelineAsset)
- {
- var text = formatter.Format(DisplayNameHelper.GetDisplayName(d));
- namesAndDirectors.Add(new ValueTuple<string, PlayableDirector>(text, d));
- }
- }
- var sequenceMenu = new GenericMenu();
- foreach (var(timelineName, playableDirector) in namesAndDirectors.OrderBy(i => i.Item1))
- {
- var isCurrent = state.masterSequence.director == playableDirector;
- sequenceMenu.AddItem(new GUIContent(timelineName), isCurrent, OnSequenceSelected, playableDirector);
- }
- if (allDirectors.Length == 0)
- sequenceMenu.AddDisabledItem(DirectorStyles.noTimelinesInScene);
- sequenceMenu.DropDown(EditorGUILayout.s_LastRect);
- }
- void OnSequenceSelected(object arg)
- {
- var directorToBindTo = (PlayableDirector)arg;
- if (directorToBindTo)
- {
- // don't just select the object, it may already be selected.
- SetCurrentTimeline(directorToBindTo);
- }
- }
- }
- }
|