190 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C#
		
	
	
	
| namespace SRF.UI
 | |
| {
 | |
|     using Internal;
 | |
|     using UnityEngine;
 | |
|     using UnityEngine.Serialization;
 | |
|     using UnityEngine.UI;
 | |
| 
 | |
|     [ExecuteInEditMode]
 | |
|     [AddComponentMenu(ComponentMenuPaths.StyleComponent)]
 | |
|     public class StyleComponent : SRMonoBehaviour
 | |
|     {
 | |
|         private Style _activeStyle;
 | |
|         private StyleRoot _cachedRoot;
 | |
|         private Graphic _graphic;
 | |
|         private bool _hasStarted;
 | |
|         private Image _image;
 | |
|         private Selectable _selectable;
 | |
| 
 | |
|         [SerializeField] [FormerlySerializedAs("StyleKey")] [HideInInspector] private string _styleKey;
 | |
| 
 | |
|         public bool IgnoreImage = false;
 | |
| 
 | |
|         public string StyleKey
 | |
|         {
 | |
|             get { return _styleKey; }
 | |
|             set
 | |
|             {
 | |
|                 _styleKey = value;
 | |
|                 Refresh(false);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void Start()
 | |
|         {
 | |
|             Refresh(true);
 | |
|             _hasStarted = true;
 | |
|         }
 | |
| 
 | |
|         private void OnEnable()
 | |
|         {
 | |
|             if (_hasStarted)
 | |
|             {
 | |
|                 Refresh(false);
 | |
|             }
 | |
|         }
 | |
| 
 | |
| #if UNITY_EDITOR
 | |
| 
 | |
|         /// <summary>
 | |
|         /// This method is not included in exported builds - don't worry about it showing up in the profiler.
 | |
|         /// </summary>
 | |
|         private void Update()
 | |
|         {
 | |
|             if (!Application.isPlaying)
 | |
|             {
 | |
|                 ApplyStyle();
 | |
|             }
 | |
|         }
 | |
| 
 | |
| #endif
 | |
| 
 | |
|         public void Refresh(bool invalidateCache)
 | |
|         {
 | |
|             if (string.IsNullOrEmpty(StyleKey))
 | |
|             {
 | |
|                 _activeStyle = null;
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             if (_cachedRoot == null || invalidateCache)
 | |
|             {
 | |
|                 _cachedRoot = GetStyleRoot();
 | |
|             }
 | |
| 
 | |
|             if (_cachedRoot == null)
 | |
|             {
 | |
|                 Debug.LogWarning("[StyleComponent] No active StyleRoot object found in parents.", this);
 | |
|                 _activeStyle = null;
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             var s = _cachedRoot.GetStyle(StyleKey);
 | |
| 
 | |
|             if (s == null)
 | |
|             {
 | |
|                 Debug.LogWarning("[StyleComponent] Style not found ({0})".Fmt(StyleKey), this);
 | |
|                 _activeStyle = null;
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             _activeStyle = s;
 | |
|             ApplyStyle();
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Find the nearest enable style root component in parents
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         private StyleRoot GetStyleRoot()
 | |
|         {
 | |
|             var t = CachedTransform;
 | |
|             StyleRoot root;
 | |
| 
 | |
|             var i = 0;
 | |
| 
 | |
|             do
 | |
|             {
 | |
|                 root = t.GetComponentInParent<StyleRoot>();
 | |
| 
 | |
|                 if (root != null)
 | |
|                 {
 | |
|                     t = root.transform.parent;
 | |
|                 }
 | |
| 
 | |
|                 ++i;
 | |
| 
 | |
|                 if (i > 100)
 | |
|                 {
 | |
|                     Debug.LogWarning("Breaking Loop");
 | |
|                     break;
 | |
|                 }
 | |
|             } while ((root != null && !root.enabled) && t != null);
 | |
| 
 | |
|             return root;
 | |
|         }
 | |
| 
 | |
|         private void ApplyStyle()
 | |
|         {
 | |
|             if (_activeStyle == null)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             if (_graphic == null)
 | |
|             {
 | |
|                 _graphic = GetComponent<Graphic>();
 | |
|             }
 | |
| 
 | |
|             if (_selectable == null)
 | |
|             {
 | |
|                 _selectable = GetComponent<Selectable>();
 | |
|             }
 | |
| 
 | |
|             if (_image == null)
 | |
|             {
 | |
|                 _image = GetComponent<Image>();
 | |
|             }
 | |
| 
 | |
|             if (!IgnoreImage && _image != null)
 | |
|             {
 | |
|                 _image.sprite = _activeStyle.Image;
 | |
|             }
 | |
| 
 | |
|             if (_selectable != null)
 | |
|             {
 | |
|                 var colours = _selectable.colors;
 | |
|                 colours.normalColor = _activeStyle.NormalColor;
 | |
|                 colours.highlightedColor = _activeStyle.HoverColor;
 | |
|                 colours.pressedColor = _activeStyle.ActiveColor;
 | |
|                 colours.disabledColor = _activeStyle.DisabledColor;
 | |
|                 colours.colorMultiplier = 1f;
 | |
| 
 | |
|                 _selectable.colors = colours;
 | |
| 
 | |
|                 if (_graphic != null)
 | |
|                 {
 | |
|                     _graphic.color = Color.white;
 | |
|                 }
 | |
|             }
 | |
|             else if (_graphic != null)
 | |
|             {
 | |
|                 _graphic.color = _activeStyle.NormalColor;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void SRStyleDirty()
 | |
|         {
 | |
|             // If inactive, invalidate the cached root and return. Next time it is enabled
 | |
|             // a new root will be found
 | |
|             if (!CachedGameObject.activeInHierarchy)
 | |
|             {
 | |
|                 _cachedRoot = null;
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             Refresh(true);
 | |
|         }
 | |
|     }
 | |
| }
 |