using System.Collections.Generic; using System.Linq; using UnityEditor.IMGUI.Controls; using UnityEngine; using UnityEngine.Timeline; namespace UnityEditor.Timeline { class TimelineTreeViewGUI { readonly TimelineAsset m_Timeline; readonly TreeViewController m_TreeView; readonly TimelineTreeView m_TimelineTreeView; readonly TimelineWindow m_Window; readonly TimelineDataSource m_DataSource; TreeViewItem root { get { return m_DataSource.root; } } TimelineTrackBaseGUI[] visibleTrackGuis { get { int firstRow; int lastRow; var visibleRows = new List(); m_TreeView.gui.GetFirstAndLastRowVisible(out firstRow, out lastRow); for (int r = firstRow; r <= lastRow; r++) { var track = m_TreeView.data.GetItem(r) as TimelineTrackBaseGUI; if (track != null && track != root) { AddVisibleTrackRecursive(ref visibleRows, track); } } return visibleRows.ToArray(); } } public TrackAsset[] visibleTracks { get { return visibleTrackGuis.Select(x => x.track).ToArray(); } } public List allClipGuis { get { TimelineDataSource dataSource = m_TreeView.data as TimelineDataSource; if (dataSource != null && dataSource.allTrackGuis != null) return dataSource.allTrackGuis.OfType().SelectMany(x => x.clips).ToList(); return null; } } public List allTrackGuis { get { var dataSource = m_TreeView.data as TimelineDataSource; if (dataSource != null) return dataSource.allTrackGuis; return null; } } public Vector2 contentSize { get { return m_TreeView.GetContentSize(); } } public Vector2 scrollPosition { get { return m_TreeView.state.scrollPos; } set { Rect r = m_TreeView.GetTotalRect(); Vector2 visibleContent = m_TreeView.GetContentSize(); m_TreeView.state.scrollPos = new Vector2(value.x, Mathf.Clamp(value.y, 0, Mathf.Max(0, visibleContent.y - r.height))); } } public bool showingVerticalScrollBar { get { return m_TreeView.showingVerticalScrollBar; } } public void FrameItem(TreeViewItem item) { m_TreeView.Frame(item.id, true, false, true); } public TimelineDragging timelineDragging { get { return m_TreeView.dragging as TimelineDragging; } } public TimelineTreeViewGUI(TimelineWindow sequencerWindow, TimelineAsset timeline, Rect rect) { m_Timeline = timeline; m_Window = sequencerWindow; var treeviewState = new TreeViewState(); treeviewState.scrollPos = new Vector2(treeviewState.scrollPos.x, TimelineWindowViewPrefs.GetOrCreateViewModel(m_Timeline).verticalScroll); m_TreeView = new TreeViewController(sequencerWindow, treeviewState); m_TreeView.horizontalScrollbarStyle = GUIStyle.none; m_TreeView.scrollViewStyle = GUI.skin.scrollView; m_TimelineTreeView = new TimelineTreeView(sequencerWindow, m_TreeView); var dragging = new TimelineDragging(m_TreeView, m_Window, m_Timeline); m_DataSource = new TimelineDataSource(this, m_TreeView, sequencerWindow); m_DataSource.onVisibleRowsChanged += m_TimelineTreeView.CalculateRowRects; m_TreeView.Init(rect, m_DataSource, m_TimelineTreeView, dragging); m_DataSource.ExpandItems(m_DataSource.root); } public ITreeViewGUI gui { get { return m_TimelineTreeView; } } public ITreeViewDataSource data { get { return m_TreeView == null ? null : m_TreeView.data; } } public TimelineWindow TimelineWindow { get { return m_Window; } } public void CalculateRowRects() { m_TimelineTreeView.CalculateRowRects(); } public void Reload() { AnimationClipCurveCache.Instance.ClearCachedProxyClips(); m_TreeView.ReloadData(); m_DataSource.ExpandItems(m_DataSource.root); m_TimelineTreeView.CalculateRowRects(); } public void OnGUI(Rect rect) { int keyboardControl = GUIUtility.GetControlID(FocusType.Passive, rect); m_TreeView.OnGUI(rect, keyboardControl); TimelineWindowViewPrefs.GetOrCreateViewModel(m_Timeline).verticalScroll = m_TreeView.state.scrollPos.y; } public Rect GetRowRect(int row) { return m_TimelineTreeView.GetRowRect(row); } static void AddVisibleTrackRecursive(ref List list, TimelineTrackBaseGUI track) { if (track == null) return; list.Add(track); if (!track.isExpanded) return; if (track.children != null) { foreach (var c in track.children) { AddVisibleTrackRecursive(ref list, c as TimelineTrackBaseGUI); } } } } }