namespace UIWidgets { using UIWidgets.Styles; using UnityEngine; using UnityEngine.UI; /// /// Autocomplete as Combobox. /// public class AutocompleteStringCombobox : MonoBehaviour, IStylable { /// /// Autocomplete. /// [SerializeField] public AutocompleteString Autocomplete; /// /// Button to show all options. /// [SerializeField] public Button AutocompleteToggle; /// /// Return focus to InputField if input not found. /// [SerializeField] public bool FocusIfInvalid = false; /// /// Index of the selected option. /// [SerializeField] [HideInInspector] public int Index { get { return Autocomplete.DataSource.IndexOf(Autocomplete.InputFieldAdapter.text); } } /// /// Start this instance. /// protected virtual void Start() { Autocomplete.InputFieldAdapter.onEndEdit.AddListener(Validate); AutocompleteToggle.onClick.AddListener(Autocomplete.ShowAllOptions); } /// /// Destroy this instance. /// protected virtual void OnDestroy() { Autocomplete.InputFieldAdapter.onEndEdit.RemoveListener(Validate); AutocompleteToggle.onClick.RemoveListener(Autocomplete.ShowAllOptions); } /// /// Validate input. /// /// Value. protected void Validate(string value) { if (Autocomplete.DataSource.Contains(value)) { return; } if (FocusIfInvalid) { Autocomplete.InputFieldAdapter.Focus(); } else { Autocomplete.InputFieldAdapter.text = string.Empty; } } #region IStylable implementation /// public virtual bool SetStyle(Style style) { if (Autocomplete != null) { Autocomplete.SetStyle(style); } if (AutocompleteToggle != null) { style.Combobox.ToggleButton.ApplyTo(AutocompleteToggle.targetGraphic); } return true; } /// public virtual bool GetStyle(Style style) { if (Autocomplete != null) { Autocomplete.GetStyle(style); } if (AutocompleteToggle != null) { style.Combobox.ToggleButton.GetFrom(AutocompleteToggle.targetGraphic); } return true; } #endregion } }