rimworld-animation-studio/Library/PackageCache/com.unity.timeline@1.2.18/Editor/Window/TimelineWindow_TrackGui.cs
2022-09-13 00:36:34 -05:00

219 lines
8.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Timeline;
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.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 + "'";
string newSequencePath = EditorUtility.SaveFilePanelInProject(DirectorStyles.createNewTimelineText.text, currentlySelectedGo.name + "Timeline", "playable", message, ProjectWindowUtil.GetActiveFolderPath());
if (!string.IsNullOrEmpty(newSequencePath))
{
var newAsset = CreateInstance<TimelineAsset>();
AssetDatabase.CreateAsset(newAsset, newSequencePath);
Undo.IncrementCurrentGroup();
if (existingDirector == null)
{
existingDirector = Undo.AddComponent<PlayableDirector>(currentlySelectedGo);
}
existingDirector.playableAsset = newAsset;
SetCurrentTimeline(existingDirector);
var newTrack = TimelineHelpers.CreateTrack<AnimationTrack>();
windowState.previewMode = false;
TimelineUtility.SetSceneGameObject(windowState.editSequence.director, newTrack, currentlySelectedGo);
}
// If we reach this point, the state of the pannel 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);
}
}
void RefreshInlineCurves()
{
foreach (var trackGUI in allTracks.OfType<TimelineTrackGUI>())
{
if (trackGUI.inlineCurveEditor != null)
trackGUI.inlineCurveEditor.Refresh();
}
}
}
}