190 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			190 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using UnityEditorInternal; | ||
|  | 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 TreeViewState = UnityEditor.IMGUI.Controls.TreeViewState<int>; | ||
|  | #else | ||
|  | using UnityEditor.IMGUI.Controls; | ||
|  | #endif | ||
|  | 
 | ||
|  | namespace UnityEditor.Timeline | ||
|  | { | ||
|  |     class BindingSelector | ||
|  |     { | ||
|  |         TreeViewController m_TreeView; | ||
|  |         private BindingTreeViewGUI m_TreeViewGUI; | ||
|  |         public TreeViewController treeViewController | ||
|  |         { | ||
|  |             get { return m_TreeView; } | ||
|  |         } | ||
|  | 
 | ||
|  |         TreeViewState m_TrackGlobalTreeViewState; | ||
|  |         TreeViewState m_TreeViewState; | ||
|  |         BindingTreeViewDataSource m_TreeViewDataSource; | ||
|  |         CurveDataSource m_CurveDataSource; | ||
|  |         TimelineWindow m_Window; | ||
|  |         CurveEditor m_CurveEditor; | ||
|  |         ReorderableList m_DopeLines; | ||
|  | 
 | ||
|  |         string[] m_StringList = { }; | ||
|  |         int[] m_Selection; | ||
|  |         bool m_PartOfSelection; | ||
|  |         public BindingSelector(EditorWindow window, CurveEditor curveEditor, TreeViewState trackGlobalTreeViewState) | ||
|  |         { | ||
|  |             m_Window = window as TimelineWindow; | ||
|  |             m_CurveEditor = curveEditor; | ||
|  |             m_TrackGlobalTreeViewState = trackGlobalTreeViewState; | ||
|  | 
 | ||
|  |             m_DopeLines = new ReorderableList(m_StringList, typeof(string), false, false, false, false); | ||
|  |             m_DopeLines.drawElementBackgroundCallback = null; | ||
|  |             m_DopeLines.showDefaultBackground = false; | ||
|  |             m_DopeLines.index = 0; | ||
|  |             m_DopeLines.headerHeight = 0; | ||
|  |             m_DopeLines.elementHeight = 20; | ||
|  |             m_DopeLines.draggable = false; | ||
|  |         } | ||
|  | 
 | ||
|  |         public void OnGUI(Rect targetRect) | ||
|  |         { | ||
|  |             if (m_TreeView == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             m_TreeView.OnEvent(); | ||
|  |             m_TreeViewGUI.parentWidth = targetRect.width; | ||
|  |             m_TreeView.OnGUI(targetRect, GUIUtility.GetControlID(FocusType.Passive)); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void InitIfNeeded(Rect rect, CurveDataSource dataSource, bool isNewSelection) | ||
|  |         { | ||
|  |             if (Event.current.type != EventType.Layout) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             m_CurveDataSource = dataSource; | ||
|  |             var clip = dataSource.animationClip; | ||
|  | 
 | ||
|  |             List<EditorCurveBinding> allBindings = new List<EditorCurveBinding>(); | ||
|  |             allBindings.Add(new EditorCurveBinding { propertyName = "Summary" }); | ||
|  |             if (clip != null) | ||
|  |                 allBindings.AddRange(AnimationUtility.GetCurveBindings(clip)); | ||
|  | 
 | ||
|  |             m_DopeLines.list = allBindings.ToArray(); | ||
|  | 
 | ||
|  |             if (m_TreeViewState != null) | ||
|  |             { | ||
|  |                 if (isNewSelection) | ||
|  |                     RefreshAll(); | ||
|  | 
 | ||
|  |                 return; | ||
|  |             } | ||
|  | 
 | ||
|  |             m_TreeViewState = m_TrackGlobalTreeViewState != null ? m_TrackGlobalTreeViewState : new TreeViewState(); | ||
|  | 
 | ||
|  |             m_TreeView = new TreeViewController(m_Window, m_TreeViewState) | ||
|  |             { | ||
|  |                 useExpansionAnimation = false, | ||
|  |                 deselectOnUnhandledMouseDown = true | ||
|  |             }; | ||
|  | 
 | ||
|  |             m_TreeView.selectionChangedCallback += OnItemSelectionChanged; | ||
|  | 
 | ||
|  |             m_TreeViewDataSource = new BindingTreeViewDataSource(m_TreeView, clip, m_CurveDataSource); | ||
|  | 
 | ||
|  |             m_TreeViewGUI = new BindingTreeViewGUI(m_TreeView); | ||
|  |             m_TreeView.Init(rect, m_TreeViewDataSource, m_TreeViewGUI, null); | ||
|  | 
 | ||
|  |             m_TreeViewDataSource.UpdateData(); | ||
|  | 
 | ||
|  |             RefreshSelection(); | ||
|  |         } | ||
|  | 
 | ||
|  |         void OnItemSelectionChanged(int[] selection) | ||
|  |         { | ||
|  |             RefreshSelection(selection); | ||
|  |         } | ||
|  | 
 | ||
|  |         void RefreshAll() | ||
|  |         { | ||
|  |             RefreshTree(); | ||
|  |             RefreshSelection(); | ||
|  |         } | ||
|  | 
 | ||
|  |         void RefreshSelection() | ||
|  |         { | ||
|  |             RefreshSelection(m_TreeViewState.selectedIDs != null ? m_TreeViewState.selectedIDs.ToArray() : null); | ||
|  |         } | ||
|  | 
 | ||
|  |         void RefreshSelection(int[] selection) | ||
|  |         { | ||
|  |             if (selection == null || selection.Length == 0) | ||
|  |             { | ||
|  |                 // select all. | ||
|  |                 if (m_TreeViewDataSource.GetRows().Count > 0) | ||
|  |                 { | ||
|  |                     m_Selection = m_TreeViewDataSource.GetRows().Select(r => r.id).ToArray(); | ||
|  |                 } | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 m_Selection = selection; | ||
|  |             } | ||
|  | 
 | ||
|  |             RefreshCurves(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void RefreshCurves() | ||
|  |         { | ||
|  |             if (m_CurveDataSource == null || m_Selection == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             var bindings = new HashSet<EditorCurveBinding>(AnimationPreviewUtilities.EditorCurveBindingComparer.Instance); | ||
|  |             foreach (int s in m_Selection) | ||
|  |             { | ||
|  |                 var item = (CurveTreeViewNode)m_TreeView.FindItem(s); | ||
|  |                 if (item != null && item.bindings != null) | ||
|  |                     bindings.UnionWith(item.bindings); | ||
|  |             } | ||
|  |             var wrappers = m_CurveDataSource.GenerateWrappers(bindings); | ||
|  |             m_CurveEditor.animationCurves = wrappers.ToArray(); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void RefreshTree() | ||
|  |         { | ||
|  |             if (m_TreeViewDataSource == null) | ||
|  |                 return; | ||
|  | 
 | ||
|  |             if (m_Selection == null) | ||
|  |                 m_Selection = new int[0]; | ||
|  | 
 | ||
|  |             // get the names of the previous items | ||
|  |             var selected = m_Selection.Select(x => m_TreeViewDataSource.FindItem(x)).Where(t => t != null).Select(c => c.displayName).ToArray(); | ||
|  | 
 | ||
|  |             // update the source | ||
|  |             m_TreeViewDataSource.UpdateData(); | ||
|  | 
 | ||
|  |             // find the same items | ||
|  |             var reselected = m_TreeViewDataSource.GetRows().Where(x => selected.Contains(x.displayName)).Select(x => x.id).ToArray(); | ||
|  |             if (!reselected.Any()) | ||
|  |             { | ||
|  |                 if (m_TreeViewDataSource.GetRows().Count > 0) | ||
|  |                 { | ||
|  |                     reselected = new[] { m_TreeViewDataSource.GetItem(0).id }; | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             // update the selection | ||
|  |             OnItemSelectionChanged(reselected); | ||
|  |         } | ||
|  | 
 | ||
|  |         internal virtual bool IsRenamingNodeAllowed(TreeViewItem node) | ||
|  |         { | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | } |