namespace UIWidgets { using System; using UIWidgets.Attributes; using UIWidgets.Styles; using UnityEngine; /// /// Base class for Slide Scale. /// public abstract class SliderScaleBase : MonoBehaviourConditional, IStylable { [SerializeField] [NestedInspector] Scale scale; /// /// Scale. /// public Scale Scale { get { return scale; } set { if (scale != null) { scale.Clear(); } scale = value; UpdateScale(); } } [SerializeField] string format = string.Empty; /// /// Value format. /// public string Format { get { return format; } set { if (format != value) { format = value; UpdateScale(); } } } Func formatter; /// /// Custom value formatter. /// public Func Formatter { get { return formatter; } set { if (formatter != value) { formatter = value; UpdateScale(); } } } RectTransform rectTransform; /// /// RectTransform. /// public RectTransform RectTransform { get { if (rectTransform == null) { rectTransform = transform as RectTransform; } return rectTransform; } } Func value2MarkDataDelegate; /// /// Delegate for the Value2MarkData method. /// protected Func Value2MarkDataDelegate { get { if (value2MarkDataDelegate == null) { value2MarkDataDelegate = Value2MarkData; } return value2MarkDataDelegate; } } bool isInited; /// /// Process the start event. /// protected virtual void Start() { Init(); } /// /// Init this instance. /// public virtual void Init() { if (isInited) { return; } isInited = true; AddListeners(); UpdateScale(); } /// /// Add listeners. /// protected virtual void AddListeners() { Scale.OnChange += UpdateScale; } /// /// Remove listeners. /// protected virtual void RemoveListeners() { Scale.OnChange -= UpdateScale; } /// /// Process the destroy event. /// protected virtual void OnDestroy() { RemoveListeners(); } /// /// Update scale. /// public abstract void UpdateScale(); /// /// Convert value to label. /// /// Value. /// Label. protected virtual string Value2Label(float value) { if (Formatter != null) { return Formatter(value); } return value.ToString(Format); } /// /// Convert value to mark data. /// /// Value. /// Mark data. protected virtual Scale.MarkData Value2MarkData(float value) { var a = Value2Anchor(value); return new Scale.MarkData(value, anchorMin: a, anchorMax: a, value2label: Value2Label); } /// /// Convert value to anchor. /// /// Value. /// Anchor. protected abstract Vector2 Value2Anchor(float value); #region IStylable implementation /// public virtual bool SetStyle(Style style) { Scale.SetStyle(style); return true; } /// public virtual bool GetStyle(Style style) { Scale.GetStyle(style); return true; } #endregion } }