123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- 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, 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, "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("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;
- SetCurrentTimeline(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();
- }
- public enum OverlayDataTypes
- {
- None,
- BackgroundColor,
- BackgroundTexture,
- TextBox
- }
- public struct OverlayData
- {
- public OverlayDataTypes types { get; private set; }
- public Rect rect { get; internal set; }
- public string text { get; private set; }
- public Texture2D texture { get; private set; }
- public Color color { get; private set; }
- public GUIStyle backgroundTextStyle { get; private set; }
- public GUIStyle textStyle { get; private set; }
- public static OverlayData CreateColorOverlay(Rect rectangle, Color backgroundColor)
- {
- OverlayData data = new OverlayData();
- data.rect = rectangle;
- data.color = backgroundColor;
- data.types = OverlayDataTypes.BackgroundColor;
- return data;
- }
- public static OverlayData CreateTextureOverlay(Rect rectangle, Texture2D backTexture)
- {
- OverlayData data = new OverlayData();
- data.rect = rectangle;
- data.texture = backTexture;
- data.types = OverlayDataTypes.BackgroundTexture;
- return data;
- }
- public static OverlayData CreateTextBoxOverlay(Rect rectangle, string msg, GUIStyle textstyle, Color textcolor, Color bgTextColor, GUIStyle bgTextStyle)
- {
- OverlayData data = new OverlayData();
- data.rect = rectangle;
- data.text = msg;
- data.textStyle = textstyle;
- data.textStyle.normal.textColor = textcolor;
- data.backgroundTextStyle = bgTextStyle;
- data.backgroundTextStyle.normal.textColor = bgTextColor;
- data.types = OverlayDataTypes.TextBox;
- return data;
- }
- }
- internal List<OverlayData> OverlayDrawData = new List<OverlayData>();
- 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))
- DrawOverlay(overlayData);
- }
- }
- }
- GUILayout.EndVertical();
- }
- void DrawOverlay(OverlayData overlayData)
- {
- Rect overlayRect = GUIClip.Clip(overlayData.rect);
- if (overlayData.types == OverlayDataTypes.BackgroundColor)
- {
- EditorGUI.DrawRect(overlayRect, overlayData.color);
- }
- else if (overlayData.types == OverlayDataTypes.BackgroundTexture)
- {
- Graphics.DrawTextureRepeated(overlayRect, overlayData.texture);
- }
- else if (overlayData.types == OverlayDataTypes.TextBox)
- {
- using (new GUIColorOverride(overlayData.backgroundTextStyle.normal.textColor))
- GUI.Box(overlayRect, GUIContent.none, overlayData.backgroundTextStyle);
- Graphics.ShadowLabel(overlayRect, GUIContent.Temp(overlayData.text), overlayData.textStyle, overlayData.textStyle.normal.textColor, Color.black);
- }
- }
- }
- }
|