using System; using System.Collections.Generic; using System.Linq; using UnityEditor.Experimental; using UnityEditor.StyleSheets; using UnityEngine; using UnityEngine.Timeline; namespace UnityEditor.Timeline { static class StyleManager { static readonly StyleState[] k_StyleStates = { StyleState.any }; static readonly string k_ErrorCannotFindStyle = L10n.Tr("Cannot find style {0} for {1}"); static Dictionary s_CustomStyles = new Dictionary(); static GUISkin s_CurrentSkin; public static GUIStyle UssStyleForType(Type type) { ClearCacheIfInvalid(); GUIStyle cachedStyle; if (s_CustomStyles.TryGetValue(type, out cachedStyle)) return cachedStyle; var style = DirectorStyles.GetGUIStyle(DirectorStyles.markerDefaultStyle); var customStyleForType = CustomStyleForType(type); if (customStyleForType != null) { if (IsStyleValid(customStyleForType)) style = DirectorStyles.GetGUIStyle(customStyleForType); else Debug.LogWarningFormat(k_ErrorCannotFindStyle, customStyleForType, type.Name); } s_CustomStyles.Add(type, style); return style; } static string CustomStyleForType(Type type) { var attr = (CustomStyleAttribute)type.GetCustomAttributes(typeof(CustomStyleAttribute), true).FirstOrDefault(); return attr != null ? attr.ussStyle : null; } static bool IsStyleValid(string ussStyle) { return GUISkin.current.FindStyle(ussStyle) != null || EditorResources.styleCatalog.GetStyle(ussStyle, k_StyleStates).IsValid(); } static void ClearCacheIfInvalid() { if (s_CurrentSkin != GUISkin.current) s_CustomStyles.Clear(); s_CurrentSkin = GUISkin.current; } } }