< Summary

Class:SearchBarComponentView
Assembly:UIComponents
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/UIComponents/Scripts/Components/SearchBar/SearchBarComponentView.cs
Covered lines:67
Uncovered lines:7
Coverable lines:74
Total lines:196
Line coverage:90.5% (67 of 74)
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%220100%
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    /// <summary>
 10    /// Event that will be triggered when a search is ordered in the search component.
 11    /// </summary>
 12    event Action<string> OnSearchText;
 13
 14    /// <summary>
 15    /// Set the place holder text of the search component.
 16    /// </summary>
 17    /// <param name="value"></param>
 18    void SetPlaceHolderText(string value);
 19
 20    /// <summary>
 21    /// Order a specific search.
 22    /// </summary>
 23    /// <param name="value">Text to search.</param>
 24    void SubmitSearch(string value);
 25
 26    /// <summary>
 27    /// Clear the search component.
 28    /// </summary>
 29    void ClearSearch();
 30
 31    /// <summary>
 32    /// Set the idle time to search.
 33    /// </summary>
 34    /// <param name="idleSearchTime">Time in seconds.</param>
 35    void SetIdleSearchTime(float idleSearchTime);
 36}
 37
 38public class SearchBarComponentView : BaseComponentView, ISearchBarComponentView, IComponentModelConfig<SearchBarCompone
 39{
 40    [Header("Prefab References")]
 41    [SerializeField] internal TMP_InputField inputField;
 42    [SerializeField] internal TMP_Text placeHolderText;
 43    [SerializeField] internal GameObject searchSpinner;
 44    [SerializeField] internal Button clearSearchButton;
 45
 46    [Header("Configuration")]
 47    [SerializeField] internal SearchBarComponentModel model;
 48
 49    public event Action<string> OnSearchText;
 50    public event Action<string> OnSubmit;
 51
 52    internal Coroutine searchWhileTypingRoutine;
 53    internal float lastValueChangeTime = 0;
 54
 55    public override void Awake()
 56    {
 5757        base.Awake();
 58
 5759        inputField.onValueChanged.AddListener(OnValueChanged);
 5760        inputField.onSubmit.AddListener(SubmitSearch);
 5761        inputField.onSelect.AddListener(SelectInput);
 5762        inputField.onDeselect.AddListener(DeselectInput);
 5763        clearSearchButton.onClick.AddListener(ClearSearch);
 64
 5765        SetClearMode();
 5766    }
 67
 68    public void Configure(SearchBarComponentModel newModel)
 69    {
 3270        model = newModel;
 3271        RefreshControl();
 3272    }
 73
 74    public override void RefreshControl()
 75    {
 3276        if (model == null)
 077            return;
 78
 3279        SetPlaceHolderText(model.placeHolderText);
 3280    }
 81
 82    public void SetPlaceHolderText(string value)
 83    {
 15884        model.placeHolderText = value;
 85
 15886        if (placeHolderText == null)
 087            return;
 88
 15889        placeHolderText.text = value;
 15890    }
 91
 92    public void SubmitSearch(string value)
 93    {
 294        StopSearchCoroutine();
 95
 296        inputField.text = value;
 297        SetSearchMode();
 298        OnSearchText?.Invoke(value);
 299        OnSubmit?.Invoke(value);
 0100    }
 101
 102    public void ClearSearch()
 103    {
 148104        StopSearchCoroutine();
 105
 148106        inputField.SetTextWithoutNotify(string.Empty);
 148107        SetClearMode();
 148108        OnSearchText?.Invoke(string.Empty);
 24109    }
 110
 0111    public void SetIdleSearchTime(float idleSearchTime) { model.idleTimeToTriggerSearch = idleSearchTime; }
 112
 113    public override void Dispose()
 114    {
 68115        base.Dispose();
 116
 68117        inputField.onValueChanged.RemoveAllListeners();
 68118        inputField.onSubmit.RemoveAllListeners();
 68119        inputField.onSelect.RemoveAllListeners();
 68120        inputField.onDeselect.RemoveAllListeners();
 68121        clearSearchButton.onClick.RemoveAllListeners();
 122
 68123        StopSearchCoroutine();
 68124    }
 125
 126    internal void OnValueChanged(string value)
 127    {
 3128        if (model.idleTimeToTriggerSearch < 0)
 0129            return;
 130
 3131        lastValueChangeTime = Time.unscaledTime;
 132
 3133        if (searchWhileTypingRoutine == null)
 3134            searchWhileTypingRoutine = StartCoroutine(SearchWhileTyping());
 3135    }
 136
 137    internal IEnumerator SearchWhileTyping()
 138    {
 3139        SetTypingMode();
 140
 3141        while ((Time.unscaledTime - lastValueChangeTime) < model.idleTimeToTriggerSearch)
 142        {
 1143            yield return null;
 144        }
 145
 2146        string value = inputField.text;
 2147        if (string.IsNullOrEmpty(value))
 148        {
 0149            SetClearMode();
 0150        }
 151        else
 152        {
 2153            SetSearchMode();
 154        }
 155
 2156        OnSearchText?.Invoke(value);
 2157        searchWhileTypingRoutine = null;
 2158    }
 159
 160    internal void StopSearchCoroutine()
 161    {
 218162        if (searchWhileTypingRoutine != null)
 163        {
 1164            StopCoroutine(searchWhileTypingRoutine);
 1165            searchWhileTypingRoutine = null;
 166        }
 218167    }
 168
 169    internal void SetTypingMode()
 170    {
 4171        clearSearchButton.gameObject.SetActive(false);
 4172        searchSpinner.SetActive(true);
 4173    }
 174
 175    internal void SetSearchMode()
 176    {
 5177        clearSearchButton.gameObject.SetActive(true);
 5178        searchSpinner.SetActive(false);
 5179    }
 180
 181    internal void SetClearMode()
 182    {
 206183        clearSearchButton.gameObject.SetActive(false);
 206184        searchSpinner.SetActive(false);
 206185    }
 186
 187    internal void SelectInput(string value)
 188    {
 1189        placeHolderText.gameObject.SetActive(false);
 1190    }
 191
 192    internal void DeselectInput(string value)
 193    {
 2194        placeHolderText.gameObject.SetActive(true);
 2195    }
 196}