2022-01-12 10:06:03 +03:00
using UnityEditor.Experimental ;
using UnityEditor.StyleSheets ;
using UnityEngine ;
using UnityEngine.Timeline ;
namespace UnityEditor.Timeline
{
class DirectorStyles
{
const string k_Elipsis = "…" ;
const string k_ImagePath = "Packages/com.unity.timeline/Editor/StyleSheets/Images/Icons/{0}.png" ;
public const string resourcesPath = "Packages/com.unity.timeline/Editor/StyleSheets/res/" ;
//Timeline resources
2022-01-12 10:39:15 +03:00
public const string newTimelineDefaultNameSuffix = "Timeline" ;
2022-01-12 10:06:03 +03:00
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" ) ;
2022-01-12 10:39:15 +03:00
public static readonly GUIContent previewDisabledContent = EditorGUIUtility . TrTextContentWithIcon ( "Preview" , "Scene preview is disabled for this TimelineAsset" , MessageType . Info ) ;
2022-01-12 10:06:03 +03:00
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)" ) ;
2022-01-12 10:39:15 +03:00
public static readonly GUIContent showMarkersOn = TrIconContent ( "TimelineCollapseMarkerButtonEnabled" , "Show / Hide Timeline Markers" ) ;
public static readonly GUIContent showMarkersOff = TrIconContent ( "TimelineCollapseMarkerButtonDisabled" , "Show / Hide Timeline Markers" ) ;
2022-01-12 10:06:03 +03:00
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 = EditorGUIUtility . TrIconContent ( "Animation.Play" , "Play the timeline (Space)" ) ;
public static readonly GUIContent gotoBeginingContent = EditorGUIUtility . TrIconContent ( "Animation.FirstKey" , "Go to the beginning of the timeline (Shift+<)" ) ;
public static readonly GUIContent gotoEndContent = EditorGUIUtility . TrIconContent ( "Animation.LastKey" , "Go to the end of the timeline (Shift+>)" ) ;
public static readonly GUIContent nextFrameContent = EditorGUIUtility . TrIconContent ( "Animation.NextKey" , "Go to the next frame" ) ;
public static readonly GUIContent previousFrameContent = EditorGUIUtility . TrIconContent ( "Animation.PrevKey" , "Go to the previous frame" ) ;
public static readonly GUIContent newContent = EditorGUIUtility . IconContent ( "CreateAddNew" , "Add new tracks." ) ;
public static readonly GUIContent optionsCogIcon = EditorGUIUtility . TrIconContent ( "_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 = EditorGUIUtility . TrIconContent ( "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 ;
2022-01-12 10:39:15 +03:00
public GUIStyle trackMuteButton ;
public GUIStyle trackLockButton ;
public GUIStyle trackRecordButton ;
2022-01-12 10:06:03 +03:00
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 ;
2022-01-12 10:39:15 +03:00
public GUIStyle trackMarkerButton ;
2022-01-12 10:06:03 +03:00
public GUIStyle markerMultiOverlay ;
public GUIStyle bottomShadow ;
public GUIStyle trackOptions ;
public GUIStyle infiniteTrack ;
public GUIStyle clipOut ;
public GUIStyle clipIn ;
2022-01-12 10:39:15 +03:00
public GUIStyle trackCurvesButton ;
public GUIStyle trackLockOverlay ;
2022-01-12 10:06:03 +03:00
public GUIStyle activation ;
public GUIStyle playrange ;
2022-01-12 10:39:15 +03:00
public GUIStyle timelineLockButton ;
public GUIStyle trackAvatarMaskButton ;
2022-01-12 10:06:03 +03:00
public GUIStyle markerWarning ;
public GUIStyle editModeBtn ;
public GUIStyle showMarkersBtn ;
public GUIStyle sequenceSwitcher ;
2022-01-12 10:39:15 +03:00
public GUIStyle inlineCurveHandle ;
public GUIStyle timeReferenceButton ;
public GUIStyle trackButtonSuite ;
public GUIStyle previewButtonDisabled ;
public GUIStyle markerHeaderMuteButton ;
2022-01-12 10:06:03 +03:00
static internal DirectorStyles s_Instance ;
DirectorNamedColor m_DarkSkinColors ;
DirectorNamedColor m_LightSkinColors ;
DirectorNamedColor m_DefaultSkinColors ;
const string k_DarkSkinPath = resourcesPath + "Timeline_DarkSkin.txt" ;
const string k_LightSkinPath = resourcesPath + "Timeline_LightSkin.txt" ;
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" ) ;
2022-01-12 10:39:15 +03:00
trackMuteButton = GetGUIStyle ( "trackMuteButton" ) ;
trackLockButton = GetGUIStyle ( "trackLockButton" ) ;
trackRecordButton = GetGUIStyle ( "trackRecordButton" ) ;
2022-01-12 10:06:03 +03:00
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" ) ;
2022-01-12 10:39:15 +03:00
trackCurvesButton = GetGUIStyle ( "trackCurvesButton" ) ;
trackLockOverlay = GetGUIStyle ( "trackLockOverlay" ) ;
2022-01-12 10:06:03 +03:00
activation = GetGUIStyle ( "Icon-Activation" ) ;
playrange = GetGUIStyle ( "Icon-Playrange" ) ;
2022-01-12 10:39:15 +03:00
timelineLockButton = GetGUIStyle ( "IN LockButton" ) ;
trackAvatarMaskButton = GetGUIStyle ( "trackAvatarMaskButton" ) ;
trackMarkerButton = GetGUIStyle ( "trackCollapseMarkerButton" ) ;
2022-01-12 10:06:03 +03:00
markerMultiOverlay = GetGUIStyle ( "MarkerMultiOverlay" ) ;
editModeBtn = GetGUIStyle ( "editModeBtn" ) ;
showMarkersBtn = GetGUIStyle ( "showMarkerBtn" ) ;
markerWarning = GetGUIStyle ( "markerWarningOverlay" ) ;
sequenceSwitcher = GetGUIStyle ( "sequenceSwitcher" ) ;
2022-01-12 10:39:15 +03:00
inlineCurveHandle = GetGUIStyle ( "RL DragHandle" ) ;
timeReferenceButton = GetGUIStyle ( "timeReferenceButton" ) ;
trackButtonSuite = GetGUIStyle ( "trackButtonSuite" ) ;
previewButtonDisabled = GetGUIStyle ( "previewButtonDisabled" ) ;
markerHeaderMuteButton = GetGUIStyle ( "markerHeaderMuteButton" ) ;
2022-01-12 10:06:03 +03:00
playrangeContent = new GUIContent ( GetBackgroundImage ( playrange ) ) { tooltip = "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 EditorGUIUtility . TrIconContent ( 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 EditorGUIUtility . TrTextContentWithIcon ( text , tooltip , iconName = = null ? null : ResolveIcon ( iconName ) ) ;
}
public static GUIContent TrTextContent ( string text , string tooltip = null )
{
return EditorGUIUtility . TrTextContent ( 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 ) ;
}
}
}