No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DirectorStyles.cs 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. using UnityEditor.Experimental;
  2. using UnityEditor.StyleSheets;
  3. using UnityEngine;
  4. using UnityEngine.Timeline;
  5. namespace UnityEditor.Timeline
  6. {
  7. class DirectorStyles
  8. {
  9. const string k_Elipsis = "…";
  10. const string k_ImagePath = "Packages/com.unity.timeline/Editor/StyleSheets/Images/Icons/{0}.png";
  11. public const string resourcesPath = "Packages/com.unity.timeline/Editor/StyleSheets/res/";
  12. //Timeline resources
  13. public const string newTimelineDefaultNameSuffix = "Timeline";
  14. public static readonly GUIContent referenceTrackLabel = TrTextContent("R", "This track references an external asset");
  15. public static readonly GUIContent recordingLabel = TrTextContent("Recording...");
  16. public static readonly GUIContent noTimelineAssetSelected = TrTextContent("To start creating a timeline, select a GameObject");
  17. public static readonly GUIContent createTimelineOnSelection = TrTextContent("To begin a new timeline with {0}, create {1}");
  18. public static readonly GUIContent noTimelinesInScene = TrTextContent("No timeline found in the scene");
  19. public static readonly GUIContent createNewTimelineText = TrTextContent("Create a new Timeline and Director Component for Game Object");
  20. public static readonly GUIContent previewContent = TrTextContent("Preview", "Enable/disable scene preview mode");
  21. public static readonly GUIContent previewDisabledContent = L10n.TextContentWithIcon("Preview", "Scene preview is disabled for this TimelineAsset", MessageType.Info);
  22. public static readonly GUIContent mixOff = TrIconContent("TimelineEditModeMixOFF", "Mix Mode (1)");
  23. public static readonly GUIContent mixOn = TrIconContent("TimelineEditModeMixON", "Mix Mode (1)");
  24. public static readonly GUIContent rippleOff = TrIconContent("TimelineEditModeRippleOFF", "Ripple Mode (2)");
  25. public static readonly GUIContent rippleOn = TrIconContent("TimelineEditModeRippleON", "Ripple Mode (2)");
  26. public static readonly GUIContent replaceOff = TrIconContent("TimelineEditModeReplaceOFF", "Replace Mode (3)");
  27. public static readonly GUIContent replaceOn = TrIconContent("TimelineEditModeReplaceON", "Replace Mode (3)");
  28. public static readonly GUIContent showMarkersOn = TrIconContent("TimelineCollapseMarkerButtonEnabled", "Show / Hide Timeline Markers");
  29. public static readonly GUIContent showMarkersOff = TrIconContent("TimelineCollapseMarkerButtonDisabled", "Show / Hide Timeline Markers");
  30. public static readonly GUIContent showMarkersOnTimeline = TrTextContent("Show markers");
  31. public static readonly GUIContent timelineMarkerTrackHeader = TrTextContentWithIcon("Markers", string.Empty, "TimelineHeaderMarkerIcon");
  32. public static readonly GUIContent signalTrackIcon = IconContent("TimelineSignal");
  33. //Unity Default Resources
  34. public static readonly GUIContent playContent = L10n.IconContent("Animation.Play", "Play the timeline (Space)");
  35. public static readonly GUIContent gotoBeginingContent = L10n.IconContent("Animation.FirstKey", "Go to the beginning of the timeline (Shift+<)");
  36. public static readonly GUIContent gotoEndContent = L10n.IconContent("Animation.LastKey", "Go to the end of the timeline (Shift+>)");
  37. public static readonly GUIContent nextFrameContent = L10n.IconContent("Animation.NextKey", "Go to the next frame");
  38. public static readonly GUIContent previousFrameContent = L10n.IconContent("Animation.PrevKey", "Go to the previous frame");
  39. public static readonly GUIContent newContent = L10n.IconContent("CreateAddNew", "Add new tracks.");
  40. public static readonly GUIContent optionsCogIcon = L10n.IconContent("_Popup", "Options");
  41. public static readonly GUIContent animationTrackIcon = EditorGUIUtility.IconContent("AnimationClip Icon");
  42. public static readonly GUIContent audioTrackIcon = EditorGUIUtility.IconContent("AudioSource Icon");
  43. public static readonly GUIContent playableTrackIcon = EditorGUIUtility.IconContent("cs Script Icon");
  44. public static readonly GUIContent timelineSelectorArrow = L10n.IconContent("icon dropdown", "Timeline Selector");
  45. public GUIContent playrangeContent;
  46. public static readonly float kBaseIndent = 15.0f;
  47. public static readonly float kDurationGuiThickness = 5.0f;
  48. // matches dark skin warning color.
  49. public static readonly Color kClipErrorColor = new Color(0.957f, 0.737f, 0.008f, 1f);
  50. // TODO: Make skinnable? If we do, we should probably also make the associated cursors skinnable...
  51. public static readonly Color kMixToolColor = Color.white;
  52. public static readonly Color kRippleToolColor = new Color(255f / 255f, 210f / 255f, 51f / 255f);
  53. public static readonly Color kReplaceToolColor = new Color(165f / 255f, 30f / 255f, 30f / 255f);
  54. public const string markerDefaultStyle = "MarkerItem";
  55. public GUIStyle groupBackground;
  56. public GUIStyle displayBackground;
  57. public GUIStyle fontClip;
  58. public GUIStyle fontClipLoop;
  59. public GUIStyle trackHeaderFont;
  60. public GUIStyle trackGroupAddButton;
  61. public GUIStyle groupFont;
  62. public GUIStyle timeCursor;
  63. public GUIStyle endmarker;
  64. public GUIStyle tinyFont;
  65. public GUIStyle foldout;
  66. public GUIStyle trackMuteButton;
  67. public GUIStyle trackLockButton;
  68. public GUIStyle trackRecordButton;
  69. public GUIStyle playTimeRangeStart;
  70. public GUIStyle playTimeRangeEnd;
  71. public GUIStyle selectedStyle;
  72. public GUIStyle trackSwatchStyle;
  73. public GUIStyle connector;
  74. public GUIStyle keyframe;
  75. public GUIStyle warning;
  76. public GUIStyle extrapolationHold;
  77. public GUIStyle extrapolationLoop;
  78. public GUIStyle extrapolationPingPong;
  79. public GUIStyle extrapolationContinue;
  80. public GUIStyle trackMarkerButton;
  81. public GUIStyle markerMultiOverlay;
  82. public GUIStyle bottomShadow;
  83. public GUIStyle trackOptions;
  84. public GUIStyle infiniteTrack;
  85. public GUIStyle clipOut;
  86. public GUIStyle clipIn;
  87. public GUIStyle trackCurvesButton;
  88. public GUIStyle trackLockOverlay;
  89. public GUIStyle activation;
  90. public GUIStyle playrange;
  91. public GUIStyle timelineLockButton;
  92. public GUIStyle trackAvatarMaskButton;
  93. public GUIStyle markerWarning;
  94. public GUIStyle editModeBtn;
  95. public GUIStyle showMarkersBtn;
  96. public GUIStyle sequenceSwitcher;
  97. public GUIStyle inlineCurveHandle;
  98. public GUIStyle timeReferenceButton;
  99. public GUIStyle trackButtonSuite;
  100. public GUIStyle previewButtonDisabled;
  101. static internal DirectorStyles s_Instance;
  102. DirectorNamedColor m_DarkSkinColors;
  103. DirectorNamedColor m_LightSkinColors;
  104. DirectorNamedColor m_DefaultSkinColors;
  105. const string k_DarkSkinPath = resourcesPath + "Timeline_DarkSkin.txt";
  106. const string k_LightSkinPath = resourcesPath + "Timeline_LightSkin.txt";
  107. static readonly GUIContent s_TempContent = new GUIContent();
  108. public static bool IsInitialized
  109. {
  110. get { return s_Instance != null; }
  111. }
  112. public static DirectorStyles Instance
  113. {
  114. get
  115. {
  116. if (s_Instance == null)
  117. {
  118. s_Instance = new DirectorStyles();
  119. s_Instance.Initialize();
  120. }
  121. return s_Instance;
  122. }
  123. }
  124. public static void ReloadStylesIfNeeded()
  125. {
  126. if (Instance.ShouldLoadStyles())
  127. {
  128. Instance.LoadStyles();
  129. if (!Instance.ShouldLoadStyles())
  130. Instance.Initialize();
  131. }
  132. }
  133. public DirectorNamedColor customSkin
  134. {
  135. get { return EditorGUIUtility.isProSkin ? m_DarkSkinColors : m_LightSkinColors; }
  136. internal set
  137. {
  138. if (EditorGUIUtility.isProSkin)
  139. m_DarkSkinColors = value;
  140. else
  141. m_LightSkinColors = value;
  142. }
  143. }
  144. DirectorNamedColor LoadColorSkin(string path)
  145. {
  146. var asset = EditorGUIUtility.LoadRequired(path) as TextAsset;
  147. if (asset != null && !string.IsNullOrEmpty(asset.text))
  148. {
  149. return DirectorNamedColor.CreateAndLoadFromText(asset.text);
  150. }
  151. return m_DefaultSkinColors;
  152. }
  153. static DirectorNamedColor CreateDefaultSkin()
  154. {
  155. var nc = ScriptableObject.CreateInstance<DirectorNamedColor>();
  156. nc.SetDefault();
  157. return nc;
  158. }
  159. public void ExportSkinToFile()
  160. {
  161. if (customSkin == m_DarkSkinColors)
  162. customSkin.ToText(k_DarkSkinPath);
  163. if (customSkin == m_LightSkinColors)
  164. customSkin.ToText(k_LightSkinPath);
  165. }
  166. public void ReloadSkin()
  167. {
  168. if (customSkin == m_DarkSkinColors)
  169. {
  170. m_DarkSkinColors = LoadColorSkin(k_DarkSkinPath);
  171. }
  172. else if (customSkin == m_LightSkinColors)
  173. {
  174. m_LightSkinColors = LoadColorSkin(k_LightSkinPath);
  175. }
  176. }
  177. public void Initialize()
  178. {
  179. m_DefaultSkinColors = CreateDefaultSkin();
  180. m_DarkSkinColors = LoadColorSkin(k_DarkSkinPath);
  181. m_LightSkinColors = LoadColorSkin(k_LightSkinPath);
  182. // add the built in colors (control track uses attribute)
  183. TrackResourceCache.ClearTrackColorCache();
  184. TrackResourceCache.SetTrackColor<AnimationTrack>(customSkin.colorAnimation);
  185. TrackResourceCache.SetTrackColor<PlayableTrack>(Color.white);
  186. TrackResourceCache.SetTrackColor<AudioTrack>(customSkin.colorAudio);
  187. TrackResourceCache.SetTrackColor<ActivationTrack>(customSkin.colorActivation);
  188. TrackResourceCache.SetTrackColor<GroupTrack>(customSkin.colorGroup);
  189. TrackResourceCache.SetTrackColor<ControlTrack>(customSkin.colorControl);
  190. // add default icons
  191. TrackResourceCache.ClearTrackIconCache();
  192. TrackResourceCache.SetTrackIcon<AnimationTrack>(animationTrackIcon);
  193. TrackResourceCache.SetTrackIcon<AudioTrack>(audioTrackIcon);
  194. TrackResourceCache.SetTrackIcon<PlayableTrack>(playableTrackIcon);
  195. TrackResourceCache.SetTrackIcon<ActivationTrack>(new GUIContent(GetBackgroundImage(activation)));
  196. TrackResourceCache.SetTrackIcon<SignalTrack>(signalTrackIcon);
  197. }
  198. DirectorStyles()
  199. {
  200. LoadStyles();
  201. }
  202. bool ShouldLoadStyles()
  203. {
  204. return endmarker == null ||
  205. endmarker.name == GUISkin.error.name;
  206. }
  207. void LoadStyles()
  208. {
  209. endmarker = GetGUIStyle("Icon-Endmarker");
  210. groupBackground = GetGUIStyle("groupBackground");
  211. displayBackground = GetGUIStyle("sequenceClip");
  212. fontClip = GetGUIStyle("Font-Clip");
  213. trackHeaderFont = GetGUIStyle("sequenceTrackHeaderFont");
  214. trackGroupAddButton = GetGUIStyle("sequenceTrackGroupAddButton");
  215. groupFont = GetGUIStyle("sequenceGroupFont");
  216. timeCursor = GetGUIStyle("Icon-TimeCursor");
  217. tinyFont = GetGUIStyle("tinyFont");
  218. foldout = GetGUIStyle("Icon-Foldout");
  219. trackMuteButton = GetGUIStyle("trackMuteButton");
  220. trackLockButton = GetGUIStyle("trackLockButton");
  221. trackRecordButton = GetGUIStyle("trackRecordButton");
  222. playTimeRangeStart = GetGUIStyle("Icon-PlayAreaStart");
  223. playTimeRangeEnd = GetGUIStyle("Icon-PlayAreaEnd");
  224. selectedStyle = GetGUIStyle("Color-Selected");
  225. trackSwatchStyle = GetGUIStyle("Icon-TrackHeaderSwatch");
  226. connector = GetGUIStyle("Icon-Connector");
  227. keyframe = GetGUIStyle("Icon-Keyframe");
  228. warning = GetGUIStyle("Icon-Warning");
  229. extrapolationHold = GetGUIStyle("Icon-ExtrapolationHold");
  230. extrapolationLoop = GetGUIStyle("Icon-ExtrapolationLoop");
  231. extrapolationPingPong = GetGUIStyle("Icon-ExtrapolationPingPong");
  232. extrapolationContinue = GetGUIStyle("Icon-ExtrapolationContinue");
  233. bottomShadow = GetGUIStyle("Icon-Shadow");
  234. trackOptions = GetGUIStyle("Icon-TrackOptions");
  235. infiniteTrack = GetGUIStyle("Icon-InfiniteTrack");
  236. clipOut = GetGUIStyle("Icon-ClipOut");
  237. clipIn = GetGUIStyle("Icon-ClipIn");
  238. trackCurvesButton = GetGUIStyle("trackCurvesButton");
  239. trackLockOverlay = GetGUIStyle("trackLockOverlay");
  240. activation = GetGUIStyle("Icon-Activation");
  241. playrange = GetGUIStyle("Icon-Playrange");
  242. timelineLockButton = GetGUIStyle("IN LockButton");
  243. trackAvatarMaskButton = GetGUIStyle("trackAvatarMaskButton");
  244. trackMarkerButton = GetGUIStyle("trackCollapseMarkerButton");
  245. markerMultiOverlay = GetGUIStyle("MarkerMultiOverlay");
  246. editModeBtn = GetGUIStyle("editModeBtn");
  247. showMarkersBtn = GetGUIStyle("showMarkerBtn");
  248. markerWarning = GetGUIStyle("markerWarningOverlay");
  249. sequenceSwitcher = GetGUIStyle("sequenceSwitcher");
  250. inlineCurveHandle = GetGUIStyle("RL DragHandle");
  251. timeReferenceButton = GetGUIStyle("timeReferenceButton");
  252. trackButtonSuite = GetGUIStyle("trackButtonSuite");
  253. previewButtonDisabled = GetGUIStyle("previewButtonDisabled");
  254. playrangeContent = new GUIContent(GetBackgroundImage(playrange)) { tooltip = L10n.Tr("Toggle play range markers.") };
  255. fontClipLoop = new GUIStyle(fontClip) { fontStyle = FontStyle.Bold };
  256. }
  257. public static GUIStyle GetGUIStyle(string s)
  258. {
  259. return EditorStyles.FromUSS(s);
  260. }
  261. public static GUIContent TrIconContent(string iconName, string tooltip = null)
  262. {
  263. return L10n.IconContent(iconName == null ? null : ResolveIcon(iconName), tooltip);
  264. }
  265. public static GUIContent IconContent(string iconName)
  266. {
  267. return EditorGUIUtility.IconContent(iconName == null ? null : ResolveIcon(iconName));
  268. }
  269. public static GUIContent TrTextContentWithIcon(string text, string tooltip, string iconName)
  270. {
  271. return L10n.TextContentWithIcon(text, tooltip, iconName == null ? null : ResolveIcon(iconName));
  272. }
  273. public static GUIContent TrTextContent(string text, string tooltip = null)
  274. {
  275. return L10n.TextContent(text, tooltip);
  276. }
  277. public static Texture2D LoadIcon(string iconName)
  278. {
  279. return EditorGUIUtility.LoadIconRequired(iconName == null ? null : ResolveIcon(iconName));
  280. }
  281. static string ResolveIcon(string icon)
  282. {
  283. return string.Format(k_ImagePath, icon);
  284. }
  285. public static string Elipsify(string label, Rect rect, GUIStyle style)
  286. {
  287. var ret = label;
  288. if (label.Length == 0)
  289. return ret;
  290. s_TempContent.text = label;
  291. float neededWidth = style.CalcSize(s_TempContent).x;
  292. return Elipsify(label, rect.width, neededWidth);
  293. }
  294. public static string Elipsify(string label, float destinationWidth, float neededWidth)
  295. {
  296. var ret = label;
  297. if (label.Length == 0)
  298. return ret;
  299. if (destinationWidth < neededWidth)
  300. {
  301. float averageWidthOfOneChar = neededWidth / label.Length;
  302. int floor = Mathf.Max((int)Mathf.Floor(destinationWidth / averageWidthOfOneChar), 0);
  303. if (floor < k_Elipsis.Length)
  304. ret = string.Empty;
  305. else if (floor == k_Elipsis.Length)
  306. ret = k_Elipsis;
  307. else if (floor < label.Length)
  308. ret = label.Substring(0, floor - k_Elipsis.Length) + k_Elipsis;
  309. }
  310. return ret;
  311. }
  312. public static Texture2D GetBackgroundImage(GUIStyle style, StyleState state = StyleState.normal)
  313. {
  314. var blockName = GUIStyleExtensions.StyleNameToBlockName(style.name, false);
  315. var styleBlock = EditorResources.GetStyle(blockName, state);
  316. return styleBlock.GetTexture(StyleCatalogKeyword.backgroundImage);
  317. }
  318. }
  319. }