seefood_diet / Assets / UIKit / UIStyleSheetController.cs
UIStyleSheetController.cs
Raw
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 ();
            }
        }
    }
}