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; } }