< Summary

Class:SearchBarComponentView
Assembly:UIComponents
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/UIComponents/Scripts/Components/SearchBar/SearchBarComponentView.cs
Covered lines:68
Uncovered lines:8
Coverable lines:76
Total lines:202
Line coverage:89.4% (68 of 76)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Awake()0%110100%
Configure(...)0%110100%
RefreshControl()0%2.062075%
SetPlaceHolderText(...)0%2.032080%
SubmitSearch(...)0%3.043083.33%
ClearSearch(...)0%330100%
SetIdleSearchTime(...)0%2100%
Dispose()0%110100%
OnValueChanged(...)0%3.043083.33%
SearchWhileTyping()0%6.226081.82%
StopSearchCoroutine()0%220100%
SetTypingMode()0%110100%
SetSearchMode()0%110100%
SetClearMode()0%110100%
SelectInput(...)0%110100%
DeselectInput(...)0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/UIComponents/Scripts/Components/SearchBar/SearchBarComponentView.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using TMPro;
 4using UnityEngine;
 5using UnityEngine.UI;
 6
 7public interface ISearchBarComponentView
 8{
 9    string Text { get; }
 10
 11    /// <summary>
 12    /// Event that will be triggered when a search is ordered in the search component.
 13    /// </summary>
 14    event Action<string> OnSearchText;
 15
 16    /// <summary>
 17    /// Set the place holder text of the search component.
 18    /// </summary>
 19    /// <param name="value"></param>
 20    void SetPlaceHolderText(string value);
 21
 22    /// <summary>
 23    /// Order a specific search.
 24    /// </summary>
 25    /// <param name="value">Text to search.</param>
 26    void SubmitSearch(string value);
 27
 28    /// <summary>
 29    /// Clear the search component.
 30    /// </summary>
 31    void ClearSearch(bool notify = true);
 32
 33    /// <summary>
 34    /// Set the idle time to search.
 35    /// </summary>
 36    /// <param name="idleSearchTime">Time in seconds.</param>
 37    void SetIdleSearchTime(float idleSearchTime);
 38}
 39
 40public class SearchBarComponentView : BaseComponentView, ISearchBarComponentView, IComponentModelConfig<SearchBarCompone
 41{
 42    [Header("Prefab References")]
 43    [SerializeField] internal TMP_InputField inputField;
 44    [SerializeField] internal TMP_Text placeHolderText;
 45    [SerializeField] internal GameObject searchSpinner;
 46    [SerializeField] internal Button clearSearchButton;
 47
 48    [Header("Configuration")]
 49    [SerializeField] internal SearchBarComponentModel model;
 50
 51    public event Action<string> OnSearchText;
 52    public event Action<string> OnSubmit;
 53
 54    internal Coroutine searchWhileTypingRoutine;
 55    internal float lastValueChangeTime = 0;
 56
 057    public string Text => inputField.text;
 58
 59    public override void Awake()
 60    {
 6161        base.Awake();
 62
 6163        inputField.onValueChanged.AddListener(OnValueChanged);
 6164        inputField.onSubmit.AddListener(SubmitSearch);
 6165        inputField.onSelect.AddListener(SelectInput);
 6166        inputField.onDeselect.AddListener(DeselectInput);
 6167        clearSearchButton.onClick.AddListener(() => ClearSearch());
 68
 6169        SetClearMode();
 6170    }
 71
 72    public void Configure(SearchBarComponentModel newModel)
 73    {
 3274        model = newModel;
 3275        RefreshControl();
 3276    }
 77
 78    public override void RefreshControl()
 79    {
 3280        if (model == null)
 081            return;
 82
 3283        SetPlaceHolderText(model.placeHolderText);
 3284    }
 85
 86    public void SetPlaceHolderText(string value)
 87    {
 15888        model.placeHolderText = value;
 89
 15890        if (placeHolderText == null)
 091            return;
 92
 15893        placeHolderText.text = value;
 15894    }
 95
 96    public void SubmitSearch(string value)
 97    {
 298        StopSearchCoroutine();
 99
 2100        inputField.text = value;
 2101        SetSearchMode();
 2102        OnSearchText?.Invoke(value);
 2103        OnSubmit?.Invoke(value);
 0104    }
 105
 106    public void ClearSearch(bool notify = true)
 107    {
 148108        StopSearchCoroutine();
 109
 148110        inputField.SetTextWithoutNotify(string.Empty);
 148111        SetClearMode();
 112
 148113        if (notify)
 148114            OnSearchText?.Invoke(string.Empty);
 24115    }
 116
 0117    public void SetIdleSearchTime(float idleSearchTime) { model.idleTimeToTriggerSearch = idleSearchTime; }
 118
 119    public override void Dispose()
 120    {
 72121        base.Dispose();
 122
 72123        inputField.onValueChanged.RemoveAllListeners();
 72124        inputField.onSubmit.RemoveAllListeners();
 72125        inputField.onSelect.RemoveAllListeners();
 72126        inputField.onDeselect.RemoveAllListeners();
 72127        clearSearchButton.onClick.RemoveAllListeners();
 128
 72129        StopSearchCoroutine();
 72130    }
 131
 132    internal void OnValueChanged(string value)
 133    {
 3134        if (model.idleTimeToTriggerSearch < 0)
 0135            return;
 136
 3137        lastValueChangeTime = Time.unscaledTime;
 138
 3139        if (searchWhileTypingRoutine == null)
 3140            searchWhileTypingRoutine = StartCoroutine(SearchWhileTyping());
 3141    }
 142
 143    internal IEnumerator SearchWhileTyping()
 144    {
 3145        SetTypingMode();
 146
 3147        while ((Time.unscaledTime - lastValueChangeTime) < model.idleTimeToTriggerSearch)
 148        {
 1149            yield return null;
 150        }
 151
 2152        string value = inputField.text;
 2153        if (string.IsNullOrEmpty(value))
 154        {
 0155            SetClearMode();
 0156        }
 157        else
 158        {
 2159            SetSearchMode();
 160        }
 161
 2162        OnSearchText?.Invoke(value);
 2163        searchWhileTypingRoutine = null;
 2164    }
 165
 166    internal void StopSearchCoroutine()
 167    {
 222168        if (searchWhileTypingRoutine != null)
 169        {
 1170            StopCoroutine(searchWhileTypingRoutine);
 1171            searchWhileTypingRoutine = null;
 172        }
 222173    }
 174
 175    internal void SetTypingMode()
 176    {
 4177        clearSearchButton.gameObject.SetActive(false);
 4178        searchSpinner.SetActive(true);
 4179    }
 180
 181    internal void SetSearchMode()
 182    {
 5183        clearSearchButton.gameObject.SetActive(true);
 5184        searchSpinner.SetActive(false);
 5185    }
 186
 187    internal void SetClearMode()
 188    {
 210189        clearSearchButton.gameObject.SetActive(false);
 210190        searchSpinner.SetActive(false);
 210191    }
 192
 193    internal void SelectInput(string value)
 194    {
 1195        placeHolderText.gameObject.SetActive(false);
 1196    }
 197
 198    internal void DeselectInput(string value)
 199    {
 2200        placeHolderText.gameObject.SetActive(true);
 2201    }
 202}