377 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			377 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using UnityEditor.Experimental; | ||
|  | using UnityEditor.StyleSheets; | ||
|  | using UnityEngine; | ||
|  | using UnityEngine.Timeline; | ||
|  | using UnityEngine.UIElements; | ||
|  | 
 | ||
|  | namespace UnityEditor.Timeline | ||
|  | { | ||
|  |     class DirectorStyles | ||
|  |     { | ||
|  |         const string k_Elipsis = "…"; | ||
|  |         const string k_ImagePath = "Packages/com.unity.timeline/Editor/StyleSheets/Images/Icons/{0}.png"; | ||
|  |         const string k_ResourcesPath = stylesheetsPath + "res/"; | ||
|  |         const string k_DarkSkinPath = k_ResourcesPath + "Timeline_DarkSkin.txt"; | ||
|  |         const string k_LightSkinPath = k_ResourcesPath + "Timeline_LightSkin.txt"; | ||
|  | 
 | ||
|  |         //Timeline resources | ||
|  |         public const string stylesheetsPath = "Packages/com.unity.timeline/Editor/StyleSheets/"; | ||
|  |         public const string newTimelineDefaultNameSuffix = "Timeline"; | ||
|  | 
 | ||
|  |         public static readonly GUIContent referenceTrackLabel = TrTextContent("R", "This track references an external asset"); | ||
|  |         public static readonly GUIContent recordingLabel = TrTextContent("Recording..."); | ||
|  |         public static readonly GUIContent noTimelineAssetSelected = TrTextContent("To start creating a timeline, select a GameObject"); | ||
|  |         public static readonly GUIContent createTimelineOnSelection = TrTextContent("To begin a new timeline with {0}, create {1}"); | ||
|  |         public static readonly GUIContent noTimelinesInScene = TrTextContent("No timeline found in the scene"); | ||
|  |         public static readonly GUIContent createNewTimelineText = TrTextContent("Create a new Timeline and Director Component for Game Object"); | ||
|  |         public static readonly GUIContent previewContent = TrTextContent("Preview", "Enable/disable scene preview mode"); | ||
|  |         public static readonly GUIContent previewDisabledContent = L10n.TextContentWithIcon("Preview", "Scene preview is disabled for this TimelineAsset", MessageType.Info); | ||
|  |         public static readonly GUIContent mixOff = TrIconContent("TimelineEditModeMixOFF", "Mix Mode (1)"); | ||
|  |         public static readonly GUIContent mixOn = TrIconContent("TimelineEditModeMixON", "Mix Mode (1)"); | ||
|  |         public static readonly GUIContent rippleOff = TrIconContent("TimelineEditModeRippleOFF", "Ripple Mode (2)"); | ||
|  |         public static readonly GUIContent rippleOn = TrIconContent("TimelineEditModeRippleON", "Ripple Mode (2)"); | ||
|  |         public static readonly GUIContent replaceOff = TrIconContent("TimelineEditModeReplaceOFF", "Replace Mode (3)"); | ||
|  |         public static readonly GUIContent replaceOn = TrIconContent("TimelineEditModeReplaceON", "Replace Mode (3)"); | ||
|  |         public static readonly GUIContent showMarkersOn = TrIconContent("TimelineCollapseMarkerButtonEnabled", "Show / Hide Timeline Markers"); | ||
|  |         public static readonly GUIContent showMarkersOff = TrIconContent("TimelineCollapseMarkerButtonDisabled", "Show / Hide Timeline Markers"); | ||
|  |         public static readonly GUIContent showMarkersOnTimeline = TrTextContent("Show markers"); | ||
|  |         public static readonly GUIContent timelineMarkerTrackHeader = TrTextContentWithIcon("Markers", string.Empty, "TimelineHeaderMarkerIcon"); | ||
|  |         public static readonly GUIContent signalTrackIcon = IconContent("TimelineSignal"); | ||
|  | 
 | ||
|  |         //Unity Default Resources | ||
|  |         public static readonly GUIContent playContent = L10n.IconContent("Animation.Play", "Play the timeline (Space)"); | ||
|  |         public static readonly GUIContent gotoBeginingContent = L10n.IconContent("Animation.FirstKey", "Go to the beginning of the timeline (Shift+<)"); | ||
|  |         public static readonly GUIContent gotoEndContent = L10n.IconContent("Animation.LastKey", "Go to the end of the timeline (Shift+>)"); | ||
|  |         public static readonly GUIContent nextFrameContent = L10n.IconContent("Animation.NextKey", "Go to the next frame"); | ||
|  |         public static readonly GUIContent previousFrameContent = L10n.IconContent("Animation.PrevKey", "Go to the previous frame"); | ||
|  |         public static readonly GUIContent newContent = L10n.IconContent("CreateAddNew", "Add new tracks."); | ||
|  |         public static readonly GUIContent optionsCogIcon = L10n.IconContent("_Popup", "Options"); | ||
|  |         public static readonly GUIContent animationTrackIcon = EditorGUIUtility.IconContent("AnimationClip Icon"); | ||
|  |         public static readonly GUIContent audioTrackIcon = EditorGUIUtility.IconContent("AudioSource Icon"); | ||
|  |         public static readonly GUIContent playableTrackIcon = EditorGUIUtility.IconContent("cs Script Icon"); | ||
|  |         public static readonly GUIContent timelineSelectorArrow = L10n.IconContent("icon dropdown", "Timeline Selector"); | ||
|  | 
 | ||
|  |         public GUIContent playrangeContent; | ||
|  | 
 | ||
|  |         public static readonly float kBaseIndent = 15.0f; | ||
|  |         public static readonly float kDurationGuiThickness = 5.0f; | ||
|  | 
 | ||
|  |         // matches dark skin warning color. | ||
|  |         public static readonly Color kClipErrorColor = new Color(0.957f, 0.737f, 0.008f, 1f); | ||
|  | 
 | ||
|  |         // TODO: Make skinnable? If we do, we should probably also make the associated cursors skinnable... | ||
|  |         public static readonly Color kMixToolColor = Color.white; | ||
|  |         public static readonly Color kRippleToolColor = new Color(255f / 255f, 210f / 255f, 51f / 255f); | ||
|  |         public static readonly Color kReplaceToolColor = new Color(165f / 255f, 30f / 255f, 30f / 255f); | ||
|  | 
 | ||
|  |         public const string markerDefaultStyle = "MarkerItem"; | ||
|  | 
 | ||
|  |         public GUIStyle groupBackground; | ||
|  |         public GUIStyle displayBackground; | ||
|  |         public GUIStyle fontClip; | ||
|  |         public GUIStyle fontClipLoop; | ||
|  |         public GUIStyle trackHeaderFont; | ||
|  |         public GUIStyle trackGroupAddButton; | ||
|  |         public GUIStyle groupFont; | ||
|  |         public GUIStyle timeCursor; | ||
|  |         public GUIStyle endmarker; | ||
|  |         public GUIStyle tinyFont; | ||
|  |         public GUIStyle foldout; | ||
|  |         public GUIStyle trackMuteButton; | ||
|  |         public GUIStyle trackLockButton; | ||
|  |         public GUIStyle trackRecordButton; | ||
|  |         public GUIStyle playTimeRangeStart; | ||
|  |         public GUIStyle playTimeRangeEnd; | ||
|  |         public GUIStyle selectedStyle; | ||
|  |         public GUIStyle trackSwatchStyle; | ||
|  |         public GUIStyle connector; | ||
|  |         public GUIStyle keyframe; | ||
|  |         public GUIStyle warning; | ||
|  |         public GUIStyle extrapolationHold; | ||
|  |         public GUIStyle extrapolationLoop; | ||
|  |         public GUIStyle extrapolationPingPong; | ||
|  |         public GUIStyle extrapolationContinue; | ||
|  |         public GUIStyle trackMarkerButton; | ||
|  |         public GUIStyle markerMultiOverlay; | ||
|  |         public GUIStyle bottomShadow; | ||
|  |         public GUIStyle trackOptions; | ||
|  |         public GUIStyle infiniteTrack; | ||
|  |         public GUIStyle clipOut; | ||
|  |         public GUIStyle clipIn; | ||
|  |         public GUIStyle trackCurvesButton; | ||
|  |         public GUIStyle trackLockOverlay; | ||
|  |         public GUIStyle activation; | ||
|  |         public GUIStyle playrange; | ||
|  |         public GUIStyle timelineLockButton; | ||
|  |         public GUIStyle trackAvatarMaskButton; | ||
|  |         public GUIStyle markerWarning; | ||
|  |         public GUIStyle editModeBtn; | ||
|  |         public GUIStyle showMarkersBtn; | ||
|  |         public GUIStyle sequenceSwitcher; | ||
|  |         public GUIStyle inlineCurveHandle; | ||
|  |         public GUIStyle timeReferenceButton; | ||
|  |         public GUIStyle trackButtonSuite; | ||
|  |         public GUIStyle previewButtonDisabled; | ||
|  | 
 | ||
|  |         static internal DirectorStyles s_Instance; | ||
|  | 
 | ||
|  |         DirectorNamedColor m_DarkSkinColors; | ||
|  |         DirectorNamedColor m_LightSkinColors; | ||
|  |         DirectorNamedColor m_DefaultSkinColors; | ||
|  | 
 | ||
|  |         static readonly GUIContent s_TempContent = new GUIContent(); | ||
|  | 
 | ||
|  |         public static bool IsInitialized | ||
|  |         { | ||
|  |             get { return s_Instance != null; } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static DirectorStyles Instance | ||
|  |         { | ||
|  |             get | ||
|  |             { | ||
|  |                 if (s_Instance == null) | ||
|  |                 { | ||
|  |                     s_Instance = new DirectorStyles(); | ||
|  |                     s_Instance.Initialize(); | ||
|  |                 } | ||
|  | 
 | ||
|  |                 return s_Instance; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public static void ReloadStylesIfNeeded() | ||
|  |         { | ||
|  |             if (Instance.ShouldLoadStyles()) | ||
|  |             { | ||
|  |                 Instance.LoadStyles(); | ||
|  |                 if (!Instance.ShouldLoadStyles()) | ||
|  |                     Instance.Initialize(); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public DirectorNamedColor customSkin | ||
|  |         { | ||
|  |             get { return EditorGUIUtility.isProSkin ? m_DarkSkinColors : m_LightSkinColors; } | ||
|  |             internal set | ||
|  |             { | ||
|  |                 if (EditorGUIUtility.isProSkin) | ||
|  |                     m_DarkSkinColors = value; | ||
|  |                 else | ||
|  |                     m_LightSkinColors = value; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         DirectorNamedColor LoadColorSkin(string path) | ||
|  |         { | ||
|  |             var asset = EditorGUIUtility.LoadRequired(path) as TextAsset; | ||
|  | 
 | ||
|  |             if (asset != null && !string.IsNullOrEmpty(asset.text)) | ||
|  |             { | ||
|  |                 return DirectorNamedColor.CreateAndLoadFromText(asset.text); | ||
|  |             } | ||
|  | 
 | ||
|  |             return m_DefaultSkinColors; | ||
|  |         } | ||
|  | 
 | ||
|  |         static DirectorNamedColor CreateDefaultSkin() | ||
|  |         { | ||
|  |             var nc = ScriptableObject.CreateInstance<DirectorNamedColor>(); | ||
|  |             nc.SetDefault(); | ||
|  |             return nc; | ||
|  |         } | ||
|  | 
 | ||
|  |         public void ExportSkinToFile() | ||
|  |         { | ||
|  |             if (customSkin == m_DarkSkinColors) | ||
|  |                 customSkin.ToText(k_DarkSkinPath); | ||
|  | 
 | ||
|  |             if (customSkin == m_LightSkinColors) | ||
|  |                 customSkin.ToText(k_LightSkinPath); | ||
|  |         } | ||
|  | 
 | ||
|  |         public void ReloadSkin() | ||
|  |         { | ||
|  |             if (customSkin == m_DarkSkinColors) | ||
|  |             { | ||
|  |                 m_DarkSkinColors = LoadColorSkin(k_DarkSkinPath); | ||
|  |             } | ||
|  |             else if (customSkin == m_LightSkinColors) | ||
|  |             { | ||
|  |                 m_LightSkinColors = LoadColorSkin(k_LightSkinPath); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public void Initialize() | ||
|  |         { | ||
|  |             m_DefaultSkinColors = CreateDefaultSkin(); | ||
|  |             m_DarkSkinColors = LoadColorSkin(k_DarkSkinPath); | ||
|  |             m_LightSkinColors = LoadColorSkin(k_LightSkinPath); | ||
|  | 
 | ||
|  |             // add the built in colors (control track uses attribute) | ||
|  |             TrackResourceCache.ClearTrackColorCache(); | ||
|  |             TrackResourceCache.SetTrackColor<AnimationTrack>(customSkin.colorAnimation); | ||
|  |             TrackResourceCache.SetTrackColor<PlayableTrack>(Color.white); | ||
|  |             TrackResourceCache.SetTrackColor<AudioTrack>(customSkin.colorAudio); | ||
|  |             TrackResourceCache.SetTrackColor<ActivationTrack>(customSkin.colorActivation); | ||
|  |             TrackResourceCache.SetTrackColor<GroupTrack>(customSkin.colorGroup); | ||
|  |             TrackResourceCache.SetTrackColor<ControlTrack>(customSkin.colorControl); | ||
|  | 
 | ||
|  |             // add default icons | ||
|  |             TrackResourceCache.ClearTrackIconCache(); | ||
|  |             TrackResourceCache.SetTrackIcon<AnimationTrack>(animationTrackIcon); | ||
|  |             TrackResourceCache.SetTrackIcon<AudioTrack>(audioTrackIcon); | ||
|  |             TrackResourceCache.SetTrackIcon<PlayableTrack>(playableTrackIcon); | ||
|  |             TrackResourceCache.SetTrackIcon<ActivationTrack>(new GUIContent(GetBackgroundImage(activation))); | ||
|  |             TrackResourceCache.SetTrackIcon<SignalTrack>(signalTrackIcon); | ||
|  |         } | ||
|  | 
 | ||
|  |         DirectorStyles() | ||
|  |         { | ||
|  |             LoadStyles(); | ||
|  |         } | ||
|  | 
 | ||
|  |         bool ShouldLoadStyles() | ||
|  |         { | ||
|  |             return endmarker == null || | ||
|  |                 endmarker.name == GUISkin.error.name; | ||
|  |         } | ||
|  | 
 | ||
|  |         void LoadStyles() | ||
|  |         { | ||
|  |             endmarker = GetGUIStyle("Icon-Endmarker"); | ||
|  |             groupBackground = GetGUIStyle("groupBackground"); | ||
|  |             displayBackground = GetGUIStyle("sequenceClip"); | ||
|  |             fontClip = GetGUIStyle("Font-Clip"); | ||
|  |             trackHeaderFont = GetGUIStyle("sequenceTrackHeaderFont"); | ||
|  |             trackGroupAddButton = GetGUIStyle("sequenceTrackGroupAddButton"); | ||
|  |             groupFont = GetGUIStyle("sequenceGroupFont"); | ||
|  |             timeCursor = GetGUIStyle("Icon-TimeCursor"); | ||
|  |             tinyFont = GetGUIStyle("tinyFont"); | ||
|  |             foldout = GetGUIStyle("Icon-Foldout"); | ||
|  |             trackMuteButton = GetGUIStyle("trackMuteButton"); | ||
|  |             trackLockButton = GetGUIStyle("trackLockButton"); | ||
|  |             trackRecordButton = GetGUIStyle("trackRecordButton"); | ||
|  |             playTimeRangeStart = GetGUIStyle("Icon-PlayAreaStart"); | ||
|  |             playTimeRangeEnd = GetGUIStyle("Icon-PlayAreaEnd"); | ||
|  |             selectedStyle = GetGUIStyle("Color-Selected"); | ||
|  |             trackSwatchStyle = GetGUIStyle("Icon-TrackHeaderSwatch"); | ||
|  |             connector = GetGUIStyle("Icon-Connector"); | ||
|  |             keyframe = GetGUIStyle("Icon-Keyframe"); | ||
|  |             warning = GetGUIStyle("Icon-Warning"); | ||
|  |             extrapolationHold = GetGUIStyle("Icon-ExtrapolationHold"); | ||
|  |             extrapolationLoop = GetGUIStyle("Icon-ExtrapolationLoop"); | ||
|  |             extrapolationPingPong = GetGUIStyle("Icon-ExtrapolationPingPong"); | ||
|  |             extrapolationContinue = GetGUIStyle("Icon-ExtrapolationContinue"); | ||
|  |             bottomShadow = GetGUIStyle("Icon-Shadow"); | ||
|  |             trackOptions = GetGUIStyle("Icon-TrackOptions"); | ||
|  |             infiniteTrack = GetGUIStyle("Icon-InfiniteTrack"); | ||
|  |             clipOut = GetGUIStyle("Icon-ClipOut"); | ||
|  |             clipIn = GetGUIStyle("Icon-ClipIn"); | ||
|  |             trackCurvesButton = GetGUIStyle("trackCurvesButton"); | ||
|  |             trackLockOverlay = GetGUIStyle("trackLockOverlay"); | ||
|  |             activation = GetGUIStyle("Icon-Activation"); | ||
|  |             playrange = GetGUIStyle("Icon-Playrange"); | ||
|  |             timelineLockButton = GetGUIStyle("IN LockButton"); | ||
|  |             trackAvatarMaskButton = GetGUIStyle("trackAvatarMaskButton"); | ||
|  |             trackMarkerButton = GetGUIStyle("trackCollapseMarkerButton"); | ||
|  |             markerMultiOverlay = GetGUIStyle("MarkerMultiOverlay"); | ||
|  |             editModeBtn = GetGUIStyle("editModeBtn"); | ||
|  |             showMarkersBtn = GetGUIStyle("showMarkerBtn"); | ||
|  |             markerWarning = GetGUIStyle("markerWarningOverlay"); | ||
|  |             sequenceSwitcher = GetGUIStyle("sequenceSwitcher"); | ||
|  |             inlineCurveHandle = GetGUIStyle("RL DragHandle"); | ||
|  |             timeReferenceButton = GetGUIStyle("timeReferenceButton"); | ||
|  |             trackButtonSuite = GetGUIStyle("trackButtonSuite"); | ||
|  |             previewButtonDisabled = GetGUIStyle("previewButtonDisabled"); | ||
|  | 
 | ||
|  |             playrangeContent = new GUIContent(GetBackgroundImage(playrange)) { tooltip = L10n.Tr("Toggle play range markers.") }; | ||
|  | 
 | ||
|  |             fontClipLoop = new GUIStyle(fontClip) { fontStyle = FontStyle.Bold }; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static GUIStyle GetGUIStyle(string s) | ||
|  |         { | ||
|  |             return EditorStyles.FromUSS(s); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static GUIContent TrIconContent(string iconName, string tooltip = null) | ||
|  |         { | ||
|  |             return L10n.IconContent(iconName == null ? null : ResolveIcon(iconName), tooltip); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static GUIContent IconContent(string iconName) | ||
|  |         { | ||
|  |             return EditorGUIUtility.IconContent(iconName == null ? null : ResolveIcon(iconName)); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static GUIContent TrTextContentWithIcon(string text, string tooltip, string iconName) | ||
|  |         { | ||
|  |             return L10n.TextContentWithIcon(text, tooltip, iconName == null ? null : ResolveIcon(iconName)); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static GUIContent TrTextContent(string text, string tooltip = null) | ||
|  |         { | ||
|  |             return L10n.TextContent(text, tooltip); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static Texture2D LoadIcon(string iconName) | ||
|  |         { | ||
|  |             return EditorGUIUtility.LoadIconRequired(iconName == null ? null : ResolveIcon(iconName)); | ||
|  |         } | ||
|  | 
 | ||
|  |         static string ResolveIcon(string icon) | ||
|  |         { | ||
|  |             return string.Format(k_ImagePath, icon); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string Elipsify(string label, Rect rect, GUIStyle style) | ||
|  |         { | ||
|  |             var ret = label; | ||
|  | 
 | ||
|  |             if (label.Length == 0) | ||
|  |                 return ret; | ||
|  | 
 | ||
|  |             s_TempContent.text = label; | ||
|  |             float neededWidth = style.CalcSize(s_TempContent).x; | ||
|  | 
 | ||
|  |             return Elipsify(label, rect.width, neededWidth); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static string Elipsify(string label, float destinationWidth, float neededWidth) | ||
|  |         { | ||
|  |             var ret = label; | ||
|  | 
 | ||
|  |             if (label.Length == 0) | ||
|  |                 return ret; | ||
|  | 
 | ||
|  |             if (destinationWidth < neededWidth) | ||
|  |             { | ||
|  |                 float averageWidthOfOneChar = neededWidth / label.Length; | ||
|  |                 int floor = Mathf.Max((int)Mathf.Floor(destinationWidth / averageWidthOfOneChar), 0); | ||
|  | 
 | ||
|  |                 if (floor < k_Elipsis.Length) | ||
|  |                     ret = string.Empty; | ||
|  |                 else if (floor == k_Elipsis.Length) | ||
|  |                     ret = k_Elipsis; | ||
|  |                 else if (floor < label.Length) | ||
|  |                     ret = label.Substring(0, floor - k_Elipsis.Length) + k_Elipsis; | ||
|  |             } | ||
|  | 
 | ||
|  |             return ret; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static Texture2D GetBackgroundImage(GUIStyle style, StyleState state = StyleState.normal) | ||
|  |         { | ||
|  |             var blockName = GUIStyleExtensions.StyleNameToBlockName(style.name, false); | ||
|  |             var styleBlock = EditorResources.GetStyle(blockName, state); | ||
|  |             return styleBlock.GetTexture(StyleCatalogKeyword.backgroundImage); | ||
|  |         } | ||
|  | 
 | ||
|  |         public static StyleSheet LoadStyleSheet(string path) | ||
|  |         { | ||
|  |             return AssetDatabase.LoadAssetAtPath<StyleSheet>(path); | ||
|  |         } | ||
|  |     } | ||
|  | } |