183 lines
5.7 KiB
C#
183 lines
5.7 KiB
C#
|
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<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_TreeView.keyboardInputCallback = sequencerWindow.TreeViewKeyboardCallback;
|
||
|
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|