Rasagar/Library/PackageCache/com.unity.timeline/Editor/treeview/TimelineTreeViewGUI.cs
2024-08-26 23:07:20 +03:00

181 lines
5.6 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_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);
}
}
}
}
}