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 17KB

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