using System; using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace UIKit { public interface IUIStyleSheetController { void Reload (); void RegisterListener (IUIStyleObserver observer); void UnregisterListener (IUIStyleObserver observer); UIStyle GetStyle (UIStyleId id); void AddStyle (UIStyleId id, UIStyle style); } [ExecuteInEditMode] public class UIStyleSheetController : IUIStyleSheetController { private static readonly UIStyleSheetController m_Instance = new UIStyleSheetController (); public static IUIStyleSheetController Default { get { return m_Instance; } } List<IUIStyleObserver> m_Listeners = new List<IUIStyleObserver> (); static UIStyleSheetController () { } protected UIStyleSheetController () { Reload (); } UIStyleSheet m_DefaultAsset; public Dictionary<string, UIStyle> StyleSheet = new Dictionary<string, UIStyle> (); public void Reload () { LoadAsset (); } async void LoadAsset (Action completion = null) { var address = "UILibrary/ui-style_sheet-default.asset"; m_DefaultAsset = await AssetHelper.LoadAssetAsync<UIStyleSheet> (address); ReloadCache (); } public UIStyle GetStyle (UIStyleId id) { if (StyleSheet.Count == 0) { Reload (); } var key = id.ToString (); if (StyleSheet.ContainsKey (key)) { return StyleSheet[key]; } else { return null; } } public void AddStyle (UIStyleId id, UIStyle style) { if (m_DefaultAsset == null) { Debug.Log ("[UIKit] m_DefaultAsset is null."); return; } Debug.Log ("[UIKit] style sheet: " + id.ToString () + " updated."); var key = id.ToString (); if (!m_DefaultAsset.StyleSheet.ContainsKey (key)) { m_DefaultAsset.StyleSheet.Add (key, new UIStyle ()); } m_DefaultAsset.StyleSheet[key] = style; #if UNITY_EDITOR EditorUtility.SetDirty (m_DefaultAsset); #endif ReloadCache (); } void ReloadCache () { StyleSheet.Clear (); foreach (var ss in m_DefaultAsset.StyleSheet) { if (!StyleSheet.ContainsKey (ss.Key)) { StyleSheet.Add (ss.Key, ss.Value); } } NotifyAssetChanged (); } public void RegisterListener (IUIStyleObserver observer) { m_Listeners.Add (observer); } public void UnregisterListener (IUIStyleObserver observer) { m_Listeners.Remove (observer); } public void NotifyAssetChanged () { foreach (var listener in m_Listeners) { listener.OnUIStyleChanged (); } } } }