TimelineWindow_Breadcrumbs.cs
4.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
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 = UnityEditor.Experimental.SceneManagement.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);
}
}
}
}