109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
	
namespace SRDebugger.UI.Controls
 | 
						|
{
 | 
						|
    using System;
 | 
						|
    using UnityEngine;
 | 
						|
 | 
						|
    public abstract class DataBoundControl : OptionsControlBase
 | 
						|
    {
 | 
						|
        private bool _hasStarted;
 | 
						|
        private bool _isReadOnly;
 | 
						|
        private object _prevValue;
 | 
						|
        private SRF.Helpers.PropertyReference _prop;
 | 
						|
 | 
						|
        public SRF.Helpers.PropertyReference Property
 | 
						|
        {
 | 
						|
            get { return _prop; }
 | 
						|
        }
 | 
						|
 | 
						|
        public bool IsReadOnly
 | 
						|
        {
 | 
						|
            get { return _isReadOnly; }
 | 
						|
        }
 | 
						|
 | 
						|
        public string PropertyName { get; private set; }
 | 
						|
 | 
						|
        #region Data Binding
 | 
						|
 | 
						|
        public void Bind(string propertyName, SRF.Helpers.PropertyReference prop)
 | 
						|
        {
 | 
						|
            PropertyName = propertyName;
 | 
						|
            _prop = prop;
 | 
						|
 | 
						|
            _isReadOnly = !prop.CanWrite;
 | 
						|
 | 
						|
            OnBind(propertyName, prop.PropertyType);
 | 
						|
            Refresh();
 | 
						|
        }
 | 
						|
 | 
						|
        protected void UpdateValue(object newValue)
 | 
						|
        {
 | 
						|
            if (newValue == _prevValue)
 | 
						|
            {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            if (IsReadOnly)
 | 
						|
            {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            _prop.SetValue(newValue);
 | 
						|
            _prevValue = newValue;
 | 
						|
        }
 | 
						|
 | 
						|
        public override void Refresh()
 | 
						|
        {
 | 
						|
            if (_prop == null)
 | 
						|
            {
 | 
						|
                return;
 | 
						|
            }
 | 
						|
 | 
						|
            var currentValue = _prop.GetValue();
 | 
						|
 | 
						|
            if (currentValue != _prevValue)
 | 
						|
            {
 | 
						|
                try
 | 
						|
                {
 | 
						|
                    OnValueUpdated(currentValue);
 | 
						|
                }
 | 
						|
                catch (Exception e)
 | 
						|
                {
 | 
						|
                    Debug.LogError("[SROptions] Error refreshing binding.");
 | 
						|
                    Debug.LogException(e);
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            _prevValue = currentValue;
 | 
						|
        }
 | 
						|
 | 
						|
        protected virtual void OnBind(string propertyName, Type t) {}
 | 
						|
        protected abstract void OnValueUpdated(object newValue);
 | 
						|
 | 
						|
        public abstract bool CanBind(Type type, bool isReadOnly);
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Unity
 | 
						|
 | 
						|
        protected override void Start()
 | 
						|
        {
 | 
						|
            base.Start();
 | 
						|
 | 
						|
            Refresh();
 | 
						|
            _hasStarted = true;
 | 
						|
        }
 | 
						|
 | 
						|
        protected override void OnEnable()
 | 
						|
        {
 | 
						|
            base.OnEnable();
 | 
						|
 | 
						|
            if (_hasStarted)
 | 
						|
            {
 | 
						|
                Refresh();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |