< Summary

Class:SearchBarComponentView
Assembly:UIComponents
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/UIComponents/Scripts/Components/SearchBar/SearchBarComponentView.cs
Covered lines:66
Uncovered lines:5
Coverable lines:71
Total lines:200
Line coverage:92.9% (66 of 71)
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%110100%
SetFocus()0%110100%
Dispose()0%110100%
OnValueChanged(...)0%3.043083.33%
SearchWhileTyping()0%6.046090%
StopSearchCoroutine()0%220100%
SetTypingMode()0%110100%
SetSearchMode()0%110100%
SetClearMode()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    /// <summary>
 40    /// Set the focus on the text input.
 41    /// </summary>
 42    void SetFocus();
 43}
 44
 45public class SearchBarComponentView : BaseComponentView, ISearchBarComponentView, IComponentModelConfig<SearchBarCompone
 46{
 47    [Header("Prefab References")]
 48    [SerializeField] internal TMP_InputField inputField;
 49    [SerializeField] internal TMP_Text placeHolderText;
 50    [SerializeField] internal GameObject searchSpinner;
 51    [SerializeField] internal Button clearSearchButton;
 52
 53    [Header("Configuration")]
 54    [SerializeField] internal SearchBarComponentModel model;
 55
 56    public event Action<string> OnSearchText;
 57    public event Action<string> OnSubmit;
 58
 59    internal Coroutine searchWhileTypingRoutine;
 60    internal float lastValueChangeTime = 0;
 61
 2362    public string Text => inputField.text;
 63
 64    public override void Awake()
 65    {
 11966        base.Awake();
 67
 11968        inputField.onValueChanged.AddListener(OnValueChanged);
 11969        inputField.onSubmit.AddListener(SubmitSearch);
 11970        clearSearchButton.onClick.AddListener(() => ClearSearch());
 71
 11972        SetClearMode();
 11973    }
 74
 75    public void Configure(SearchBarComponentModel newModel)
 76    {
 3277        model = newModel;
 3278        RefreshControl();
 3279    }
 80
 81    public override void RefreshControl()
 82    {
 3283        if (model == null)
 084            return;
 85
 3286        SetPlaceHolderText(model.placeHolderText);
 3287    }
 88
 89    public void SetPlaceHolderText(string value)
 90    {
 15891        model.placeHolderText = value;
 92
 15893        if (placeHolderText == null)
 094            return;
 95
 15896        placeHolderText.text = value;
 15897    }
 98
 99    public void SubmitSearch(string value)
 100    {
 5101        StopSearchCoroutine();
 102
 5103        inputField.text = value;
 5104        SetSearchMode();
 5105        OnSearchText?.Invoke(value);
 5106        OnSubmit?.Invoke(value);
 0107    }
 108
 109    public void ClearSearch(bool notify = true)
 110    {
 155111        StopSearchCoroutine();
 112
 155113        inputField.SetTextWithoutNotify(string.Empty);
 155114        SetClearMode();
 115
 155116        if (notify)
 151117            OnSearchText?.Invoke(string.Empty);
 31118    }
 119
 2120    public void SetIdleSearchTime(float idleSearchTime) { model.idleTimeToTriggerSearch = idleSearchTime; }
 121
 122    public void SetFocus()
 123    {
 8124        inputField.Select();
 8125    }
 126
 127    public override void Dispose()
 128    {
 127129        base.Dispose();
 130
 127131        inputField.onValueChanged.RemoveAllListeners();
 127132        inputField.onSubmit.RemoveAllListeners();
 127133        inputField.onSelect.RemoveAllListeners();
 127134        inputField.onDeselect.RemoveAllListeners();
 127135        clearSearchButton.onClick.RemoveAllListeners();
 136
 127137        StopSearchCoroutine();
 127138    }
 139
 140    internal void OnValueChanged(string value)
 141    {
 10142        if (model.idleTimeToTriggerSearch < 0)
 0143            return;
 144
 10145        lastValueChangeTime = Time.unscaledTime;
 146
 10147        if (searchWhileTypingRoutine == null)
 10148            searchWhileTypingRoutine = StartCoroutine(SearchWhileTyping());
 10149    }
 150
 151    internal IEnumerator SearchWhileTyping()
 152    {
 10153        SetTypingMode();
 154
 10155        while ((Time.unscaledTime - lastValueChangeTime) < model.idleTimeToTriggerSearch)
 156        {
 8157            yield return null;
 158        }
 159
 2160        string value = inputField.text;
 2161        if (string.IsNullOrEmpty(value))
 162        {
 0163            SetClearMode();
 164        }
 165        else
 166        {
 2167            SetSearchMode();
 168        }
 169
 2170        OnSearchText?.Invoke(value);
 2171        searchWhileTypingRoutine = null;
 2172    }
 173
 174    internal void StopSearchCoroutine()
 175    {
 287176        if (searchWhileTypingRoutine != null)
 177        {
 8178            StopCoroutine(searchWhileTypingRoutine);
 8179            searchWhileTypingRoutine = null;
 180        }
 287181    }
 182
 183    internal void SetTypingMode()
 184    {
 11185        clearSearchButton.gameObject.SetActive(false);
 11186        searchSpinner.SetActive(true);
 11187    }
 188
 189    internal void SetSearchMode()
 190    {
 8191        clearSearchButton.gameObject.SetActive(true);
 8192        searchSpinner.SetActive(false);
 8193    }
 194
 195    internal void SetClearMode()
 196    {
 275197        clearSearchButton.gameObject.SetActive(false);
 275198        searchSpinner.SetActive(false);
 275199    }
 200}