using System;
namespace RosettaUI
{
///
/// 値を持ち外部と同期するElement
///
public abstract class ReadOnlyValueElement : Element
{
public readonly IGetter getter;
internal event Action listenValue;
private ReadOnlyValueViewBridgeBase _viewBridgeBase;
public T Value => getter.Get();
public bool IsConst => getter.IsConst;
protected ReadOnlyValueElement(IGetter getter)
{
this.getter = getter ?? new ConstGetter(default);
}
protected override void UpdateInternal()
{
base.UpdateInternal();
if (!IsConst)
{
listenValue?.Invoke(getter.Get());
}
}
private void ClearListenValue() => listenValue = null;
protected override ElementViewBridge CreateViewBridge() => new ReadOnlyValueViewBridgeBase(this);
public class ReadOnlyValueViewBridgeBase : ElementViewBridge
{
private ReadOnlyValueElement Element => (ReadOnlyValueElement)element;
public ReadOnlyValueViewBridgeBase(ReadOnlyValueElement element) : base(element)
{
}
public void SubscribeValueOnUpdateCallOnce(Action action)
{
if (action == null) return;
action.Invoke(Element.Value);
SubscribeValueOnUpdate(action);
}
public void SubscribeValueOnUpdate(Action action)
{
if (action != null && !Element.IsConst)
{
Element.listenValue += action;
}
}
public override void UnsubscribeAll()
{
base.UnsubscribeAll();
Element.ClearListenValue();
}
}
}
public static partial class ElementViewBridgeExtensions
{
public static ReadOnlyValueElement.ReadOnlyValueViewBridgeBase GetViewBridge(this ReadOnlyValueElement element) => (ReadOnlyValueElement.ReadOnlyValueViewBridgeBase)element.ViewBridge;
}
}