190 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using UnityEngine;
 | |
| using UnityEngine.Timeline;
 | |
| 
 | |
| #if UNITY_6000_2_OR_NEWER
 | |
| using TreeViewController = UnityEditor.IMGUI.Controls.TreeViewController<int>;
 | |
| using TreeViewItem = UnityEditor.IMGUI.Controls.TreeViewItem<int>;
 | |
| using ITreeViewDataSource = UnityEditor.IMGUI.Controls.ITreeViewDataSource<int>;
 | |
| using TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState<int>;
 | |
| using ITreeViewGUI = UnityEditor.IMGUI.Controls.ITreeViewGUI<int>;
 | |
| #else
 | |
| using UnityEditor.IMGUI.Controls;
 | |
| #endif
 | |
| 
 | |
| 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<TimelineTrackBaseGUI>();
 | |
|                 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<TimelineClipGUI> allClipGuis
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 TimelineDataSource dataSource = m_TreeView.data as TimelineDataSource;
 | |
|                 if (dataSource != null && dataSource.allTrackGuis != null)
 | |
|                     return dataSource.allTrackGuis.OfType<TimelineTrackGUI>().SelectMany(x => x.clips).ToList();
 | |
| 
 | |
|                 return null;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public List<TimelineTrackBaseGUI> 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<TimelineTrackBaseGUI> 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);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |