A game about forced loneliness, made by TACStudios
1using System.Collections.Generic;
2using System.Linq;
3using UnityEditor.IMGUI.Controls;
4using UnityEngine;
5using UnityEngine.Timeline;
6
7namespace UnityEditor.Timeline
8{
9 class TimelineTreeViewGUI
10 {
11 readonly TimelineAsset m_Timeline;
12 readonly TreeViewController m_TreeView;
13 readonly TimelineTreeView m_TimelineTreeView;
14 readonly TimelineWindow m_Window;
15 readonly TimelineDataSource m_DataSource;
16
17 TreeViewItem root
18 {
19 get { return m_DataSource.root; }
20 }
21
22 TimelineTrackBaseGUI[] visibleTrackGuis
23 {
24 get
25 {
26 int firstRow;
27 int lastRow;
28 var visibleRows = new List<TimelineTrackBaseGUI>();
29 m_TreeView.gui.GetFirstAndLastRowVisible(out firstRow, out lastRow);
30
31 for (int r = firstRow; r <= lastRow; r++)
32 {
33 var track = m_TreeView.data.GetItem(r) as TimelineTrackBaseGUI;
34 if (track != null && track != root)
35 {
36 AddVisibleTrackRecursive(ref visibleRows, track);
37 }
38 }
39 return visibleRows.ToArray();
40 }
41 }
42
43 public TrackAsset[] visibleTracks
44 {
45 get { return visibleTrackGuis.Select(x => x.track).ToArray(); }
46 }
47
48 public List<TimelineClipGUI> allClipGuis
49 {
50 get
51 {
52 TimelineDataSource dataSource = m_TreeView.data as TimelineDataSource;
53 if (dataSource != null && dataSource.allTrackGuis != null)
54 return dataSource.allTrackGuis.OfType<TimelineTrackGUI>().SelectMany(x => x.clips).ToList();
55
56 return null;
57 }
58 }
59
60 public List<TimelineTrackBaseGUI> allTrackGuis
61 {
62 get
63 {
64 var dataSource = m_TreeView.data as TimelineDataSource;
65 if (dataSource != null)
66 return dataSource.allTrackGuis;
67 return null;
68 }
69 }
70
71 public Vector2 contentSize
72 {
73 get { return m_TreeView.GetContentSize(); }
74 }
75
76 public Vector2 scrollPosition
77 {
78 get { return m_TreeView.state.scrollPos; }
79 set
80 {
81 Rect r = m_TreeView.GetTotalRect();
82 Vector2 visibleContent = m_TreeView.GetContentSize();
83 m_TreeView.state.scrollPos = new Vector2(value.x, Mathf.Clamp(value.y, 0, Mathf.Max(0, visibleContent.y - r.height)));
84 }
85 }
86
87 public bool showingVerticalScrollBar
88 {
89 get { return m_TreeView.showingVerticalScrollBar; }
90 }
91
92 public void FrameItem(TreeViewItem item)
93 {
94 m_TreeView.Frame(item.id, true, false, true);
95 }
96
97 public TimelineDragging timelineDragging { get { return m_TreeView.dragging as TimelineDragging; } }
98
99 public TimelineTreeViewGUI(TimelineWindow sequencerWindow, TimelineAsset timeline, Rect rect)
100 {
101 m_Timeline = timeline;
102 m_Window = sequencerWindow;
103
104 var treeviewState = new TreeViewState();
105 treeviewState.scrollPos = new Vector2(treeviewState.scrollPos.x, TimelineWindowViewPrefs.GetOrCreateViewModel(m_Timeline).verticalScroll);
106
107 m_TreeView = new TreeViewController(sequencerWindow, treeviewState);
108 m_TreeView.horizontalScrollbarStyle = GUIStyle.none;
109 m_TreeView.scrollViewStyle = GUI.skin.scrollView;
110
111 m_TimelineTreeView = new TimelineTreeView(sequencerWindow, m_TreeView);
112 var dragging = new TimelineDragging(m_TreeView, m_Window, m_Timeline);
113 m_DataSource = new TimelineDataSource(this, m_TreeView, sequencerWindow);
114
115 m_DataSource.onVisibleRowsChanged += m_TimelineTreeView.CalculateRowRects;
116 m_TreeView.Init(rect, m_DataSource, m_TimelineTreeView, dragging);
117
118 m_DataSource.ExpandItems(m_DataSource.root);
119 }
120
121 public ITreeViewGUI gui
122 {
123 get { return m_TimelineTreeView; }
124 }
125 public ITreeViewDataSource data
126 {
127 get { return m_TreeView == null ? null : m_TreeView.data; }
128 }
129
130 public TimelineWindow TimelineWindow
131 {
132 get { return m_Window; }
133 }
134
135 public void CalculateRowRects()
136 {
137 m_TimelineTreeView.CalculateRowRects();
138 }
139
140 public void Reload()
141 {
142 AnimationClipCurveCache.Instance.ClearCachedProxyClips();
143
144 m_TreeView.ReloadData();
145 m_DataSource.ExpandItems(m_DataSource.root);
146 m_TimelineTreeView.CalculateRowRects();
147 }
148
149 public void OnGUI(Rect rect)
150 {
151 int keyboardControl = GUIUtility.GetControlID(FocusType.Passive, rect);
152 m_TreeView.OnGUI(rect, keyboardControl);
153 TimelineWindowViewPrefs.GetOrCreateViewModel(m_Timeline).verticalScroll = m_TreeView.state.scrollPos.y;
154 }
155
156 public Rect GetRowRect(int row)
157 {
158 return m_TimelineTreeView.GetRowRect(row);
159 }
160
161 static void AddVisibleTrackRecursive(ref List<TimelineTrackBaseGUI> list, TimelineTrackBaseGUI track)
162 {
163 if (track == null)
164 return;
165
166 list.Add(track);
167
168 if (!track.isExpanded)
169 return;
170
171 if (track.children != null)
172 {
173 foreach (var c in track.children)
174 {
175 AddVisibleTrackRecursive(ref list, c as TimelineTrackBaseGUI);
176 }
177 }
178 }
179 }
180}