148 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using UnityEngine;
 | |
| using UnityEngine.Playables;
 | |
| 
 | |
| namespace UnityEditor.Timeline
 | |
| {
 | |
|     partial class TimelineWindow
 | |
|     {
 | |
|         public TimelineTreeViewGUI treeView { get; private set; }
 | |
| 
 | |
|         void TracksGUI(Rect clientRect, WindowState state, TimelineModeGUIState trackState)
 | |
|         {
 | |
|             if (Event.current.type == EventType.Repaint && treeView != null)
 | |
|             {
 | |
|                 state.headerSpacePartitioner.Clear();
 | |
|                 state.spacePartitioner.Clear();
 | |
|             }
 | |
| 
 | |
|             if (state.IsEditingASubTimeline() && !state.IsEditingAnEmptyTimeline())
 | |
|             {
 | |
|                 var headerRect = clientRect;
 | |
|                 headerRect.width = state.sequencerHeaderWidth;
 | |
|                 Graphics.DrawBackgroundRect(state, headerRect);
 | |
| 
 | |
|                 var clipRect = clientRect;
 | |
|                 clipRect.xMin = headerRect.xMax;
 | |
|                 Graphics.DrawBackgroundRect(state, clipRect, subSequenceMode: true);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 Graphics.DrawBackgroundRect(state, clientRect);
 | |
|             }
 | |
| 
 | |
|             if (!state.IsEditingAnEmptyTimeline())
 | |
|                 m_TimeArea.DrawMajorTicks(sequenceContentRect, (float)state.referenceSequence.frameRate);
 | |
| 
 | |
|             GUILayout.BeginVertical();
 | |
|             {
 | |
|                 GUILayout.Space(5.0f);
 | |
|                 GUILayout.BeginHorizontal();
 | |
| 
 | |
|                 if (this.state.editSequence.asset == null)
 | |
|                     DrawNoSequenceGUI(state);
 | |
|                 else
 | |
|                     DrawTracksGUI(clientRect, trackState);
 | |
| 
 | |
|                 GUILayout.EndHorizontal();
 | |
|             }
 | |
|             GUILayout.EndVertical();
 | |
| 
 | |
|             Graphics.DrawShadow(clientRect);
 | |
|         }
 | |
| 
 | |
|         void DrawNoSequenceGUI(WindowState windowState)
 | |
|         {
 | |
|             bool showCreateButton = false;
 | |
|             var currentlySelectedGo = UnityEditor.Selection.activeObject != null ? UnityEditor.Selection.activeObject as GameObject : null;
 | |
|             var textContent = DirectorStyles.noTimelineAssetSelected;
 | |
|             var existingDirector = currentlySelectedGo != null ? currentlySelectedGo.GetComponent<PlayableDirector>() : null;
 | |
|             var existingAsset = existingDirector != null ? existingDirector.playableAsset : null;
 | |
| 
 | |
|             if (currentlySelectedGo != null && !TimelineUtility.IsPrefabOrAsset(currentlySelectedGo) && existingAsset == null)
 | |
|             {
 | |
|                 showCreateButton = true;
 | |
|                 textContent = new GUIContent(String.Format(DirectorStyles.createTimelineOnSelection.text, currentlySelectedGo.name, L10n.Tr("a Director component and a Timeline asset")));
 | |
|             }
 | |
|             GUILayout.FlexibleSpace();
 | |
|             GUILayout.BeginVertical();
 | |
|             GUILayout.FlexibleSpace();
 | |
| 
 | |
|             GUILayout.Label(textContent);
 | |
| 
 | |
|             if (showCreateButton)
 | |
|             {
 | |
|                 GUILayout.BeginHorizontal();
 | |
|                 var textSize = GUI.skin.label.CalcSize(textContent);
 | |
|                 GUILayout.Space((textSize.x / 2.0f) - (WindowConstants.createButtonWidth / 2.0f));
 | |
|                 if (GUILayout.Button(L10n.Tr("Create"), GUILayout.Width(WindowConstants.createButtonWidth)))
 | |
|                 {
 | |
|                     var message = DirectorStyles.createNewTimelineText.text + " '" + currentlySelectedGo.name + "'";
 | |
|                     var defaultName = currentlySelectedGo.name.EndsWith(DirectorStyles.newTimelineDefaultNameSuffix, StringComparison.OrdinalIgnoreCase)
 | |
|                         ? currentlySelectedGo.name
 | |
|                         : currentlySelectedGo.name + DirectorStyles.newTimelineDefaultNameSuffix;
 | |
| 
 | |
|                     // Use the project window path by default only if it's under the asset folder.
 | |
|                     // Otherwise the saveFilePanel will reject the save (case 1289923)
 | |
|                     var defaultPath = ProjectWindowUtil.GetActiveFolderPath();
 | |
|                     if (!defaultPath.StartsWith("Assets/", StringComparison.OrdinalIgnoreCase))
 | |
|                         defaultPath = "Assets";
 | |
| 
 | |
|                     string newSequencePath = EditorUtility.SaveFilePanelInProject(DirectorStyles.createNewTimelineText.text, defaultName, "playable", message, defaultPath);
 | |
|                     if (!string.IsNullOrEmpty(newSequencePath))
 | |
|                     {
 | |
|                         var newAsset = TimelineUtility.CreateAndSaveTimelineAsset(newSequencePath);
 | |
| 
 | |
|                         Undo.IncrementCurrentGroup();
 | |
| 
 | |
|                         if (existingDirector == null)
 | |
|                         {
 | |
|                             existingDirector = Undo.AddComponent<PlayableDirector>(currentlySelectedGo);
 | |
|                         }
 | |
| 
 | |
|                         existingDirector.playableAsset = newAsset;
 | |
|                         SetTimeline(existingDirector);
 | |
|                         windowState.previewMode = false;
 | |
|                     }
 | |
| 
 | |
|                     // If we reach this point, the state of the panel has changed; skip the rest of this GUI phase
 | |
|                     // Fixes: case 955831 - [OSX] NullReferenceException when creating a timeline on a selected object
 | |
|                     GUIUtility.ExitGUI();
 | |
|                 }
 | |
|                 GUILayout.EndHorizontal();
 | |
|             }
 | |
|             GUILayout.FlexibleSpace();
 | |
|             GUILayout.EndVertical();
 | |
|             GUILayout.FlexibleSpace();
 | |
|         }
 | |
| 
 | |
|         internal List<OverlayDrawer> OverlayDrawData = new List<OverlayDrawer>();
 | |
| 
 | |
|         void DrawTracksGUI(Rect clientRect, TimelineModeGUIState trackState)
 | |
|         {
 | |
|             GUILayout.BeginVertical(GUILayout.Height(clientRect.height));
 | |
|             if (treeView != null)
 | |
|             {
 | |
|                 if (Event.current.type == EventType.Layout)
 | |
|                 {
 | |
|                     OverlayDrawData.Clear();
 | |
|                 }
 | |
| 
 | |
|                 treeView.OnGUI(clientRect);
 | |
| 
 | |
|                 if (Event.current.type == EventType.Repaint)
 | |
|                 {
 | |
|                     foreach (var overlayData in OverlayDrawData)
 | |
|                     {
 | |
|                         using (new GUIViewportScope(sequenceContentRect))
 | |
|                             overlayData.Draw();
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             GUILayout.EndVertical();
 | |
|         }
 | |
|     }
 | |
| }
 |