|
|
|
|
namespace SRDebugger.UI.Controls
|
|
|
|
|
{
|
|
|
|
|
using System;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
using SRF.Helpers;
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
prop.ValueChanged += OnValueChanged;
|
|
|
|
|
|
|
|
|
|
OnBind(propertyName, prop.PropertyType);
|
|
|
|
|
Refresh();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void OnValueChanged(PropertyReference property)
|
|
|
|
|
{
|
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
if (_prop != null)
|
|
|
|
|
{
|
|
|
|
|
_prop.ValueChanged += OnValueChanged;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Refresh();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override void OnDisable()
|
|
|
|
|
{
|
|
|
|
|
base.OnDisable();
|
|
|
|
|
|
|
|
|
|
if (_prop != null)
|
|
|
|
|
{
|
|
|
|
|
_prop.ValueChanged -= OnValueChanged;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|