< Summary

Class:BuilderInWorldLoadingView
Assembly:BuildModeHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/BuildModeHUD/Scripts/BuilderInWorldLoadingView.cs
Covered lines:62
Uncovered lines:11
Coverable lines:73
Total lines:187
Line coverage:84.9% (62 of 73)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
BuilderInWorldLoadingView()0%110100%
Create()0%110100%
Awake()0%110100%
CreateLoadingTips()0%330100%
Show()0%220100%
Hide(...)0%220100%
Dispose()0%330100%
StartTipsCarousel()0%110100%
StopTipsCarousel()0%220100%
TryToHideCoroutine()0%770100%
RunTipsCarouselCoroutine()0%7.464040%
IncrementTipIndex()0%220100%
RunTipsAnimationCoroutine()0%20400%
ForzeToEndCurrentTipsAnimation()0%110100%
SetPercentage(...)0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/BuildModeHUD/Scripts/BuilderInWorldLoadingView.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using System.Collections.Generic;
 4using UnityEngine;
 5using UnityEngine.UI;
 6
 7public interface IBuilderInWorldLoadingView
 8{
 9    bool isActive { get; }
 10
 11    GameObject viewGO { get; }
 12    void Show();
 13    void Hide(bool forzeHidding = false, Action onHideAction = null);
 14    void StartTipsCarousel();
 15    void StopTipsCarousel();
 16    void SetPercentage(float newValue);
 17    void Dispose();
 18}
 19
 20public class BuilderInWorldLoadingView : MonoBehaviour, IBuilderInWorldLoadingView
 21{
 22    private const string VIEW_PATH = "BuilderInWorldLoadingView";
 23
 24    [Header("Loading Tips Config")]
 25    [SerializeField] internal BuilderInWorldLoadingTip loadingTipPrefab;
 26    [SerializeField] internal RectTransform loadingTipsContainer;
 27    [SerializeField] internal ScrollRect loadingTipsScroll;
 28    [SerializeField] internal List<BuilderInWorldLoadingTipModel> loadingTips;
 5529    [SerializeField] internal float timeBetweenTips = 3f;
 30    [SerializeField] internal AnimationCurve animationTipsCurve;
 5531    [SerializeField] internal float animationTipsTransitionTime = 1f;
 32
 33    [Header("Other Config")]
 5534    [SerializeField] internal float minVisibilityTime = 1.5f;
 35    [SerializeField] internal LoadingBar loadingBar;
 36
 737    public bool isActive => gameObject.activeSelf;
 38
 10539    public GameObject viewGO => gameObject;
 40
 41    internal Coroutine tipsCoroutine;
 42    internal Coroutine hideCoroutine;
 43    internal float showTime = 0f;
 44    internal int currentTipIndex = 0;
 45    internal float currentFinalNormalizedPos;
 46
 47    internal static BuilderInWorldLoadingView Create()
 48    {
 249        var view = Instantiate(Resources.Load<GameObject>(VIEW_PATH)).GetComponent<BuilderInWorldLoadingView>();
 250        view.gameObject.name = "_BuilderInWorldLoadingView";
 51
 252        return view;
 53    }
 54
 5655    private void Awake() { CreateLoadingTips(); }
 56
 57    private void CreateLoadingTips()
 58    {
 2859        RectTransform tipsContainerRectTranform = loadingTipsContainer;
 2860        float tipsContainerHorizontalOffset = 0;
 61
 16862        for (int i = 0; i < loadingTips.Count; i++)
 63        {
 5664            BuilderInWorldLoadingTip newTip = Instantiate(loadingTipPrefab, loadingTipsContainer);
 5665            newTip.Configure(loadingTips[i]);
 66
 5667            if (i > 0)
 68            {
 2869                tipsContainerHorizontalOffset += ((RectTransform)newTip.transform).rect.size.x;
 70            }
 71        }
 72
 2873        tipsContainerRectTranform.offsetMax = new Vector2(tipsContainerHorizontalOffset, tipsContainerRectTranform.offse
 2874    }
 75
 76    public void Show()
 77    {
 978        gameObject.SetActive(true);
 979        showTime = Time.realtimeSinceStartup;
 80
 981        if (loadingTips.Count > 0)
 82        {
 983            StartTipsCarousel();
 84        }
 85
 986        AudioScriptableObjects.builderEnter.Play();
 987    }
 88
 89    public void Hide(bool forzeHidding = false, Action onHideAction = null)
 90    {
 1291        if (hideCoroutine != null)
 292            CoroutineStarter.Stop(hideCoroutine);
 93
 1294        hideCoroutine = CoroutineStarter.Start(TryToHideCoroutine(forzeHidding, onHideAction));
 1295    }
 96
 97    public void Dispose()
 98    {
 2999        if (hideCoroutine != null)
 5100            CoroutineStarter.Stop(hideCoroutine);
 29101        if (tipsCoroutine != null)
 1102            CoroutineStarter.Stop(tipsCoroutine);
 29103    }
 104
 105    public void StartTipsCarousel()
 106    {
 9107        StopTipsCarousel();
 9108        tipsCoroutine = CoroutineStarter.Start(RunTipsCarouselCoroutine());
 9109    }
 110
 111    public void StopTipsCarousel()
 112    {
 41113        if (tipsCoroutine == null)
 33114            return;
 115
 8116        CoroutineStarter.Stop(tipsCoroutine);
 8117        tipsCoroutine = null;
 118
 8119        ForzeToEndCurrentTipsAnimation();
 8120    }
 121
 122    internal IEnumerator TryToHideCoroutine(bool forzeHidding, Action onHideAction)
 123    {
 12124        while (!forzeHidding && (Time.realtimeSinceStartup - showTime) < minVisibilityTime)
 125        {
 7126            yield return null;
 127        }
 128
 5129        StopTipsCarousel();
 5130        if (gameObject != null)
 5131            gameObject.SetActive(false);
 5132        onHideAction?.Invoke();
 5133        AudioScriptableObjects.builderReady.Play();
 5134    }
 135
 136    internal IEnumerator RunTipsCarouselCoroutine()
 137    {
 9138        currentTipIndex = 0;
 139
 0140        while (true)
 141        {
 9142            yield return new WaitForSeconds(timeBetweenTips);
 0143            yield return RunTipsAnimationCoroutine();
 0144            IncrementTipIndex();
 145        }
 146    }
 147
 148    private void IncrementTipIndex()
 149    {
 8150        currentTipIndex++;
 8151        if (currentTipIndex >= loadingTips.Count - 1)
 152        {
 8153            currentTipIndex = 0;
 8154            loadingTipsScroll.horizontalNormalizedPosition = 0f;
 155
 156            // Moving the last tip game object to the first position in the hierarchy, we make the carousel cyclical.
 8157            loadingTipsContainer.GetChild(loadingTipsContainer.childCount - 1).SetAsFirstSibling();
 158        }
 8159    }
 160
 161    internal IEnumerator RunTipsAnimationCoroutine()
 162    {
 0163        float currentAnimationTime = 0f;
 0164        float initialNormalizedPos = loadingTipsScroll.horizontalNormalizedPosition;
 0165        currentFinalNormalizedPos = initialNormalizedPos + (1f / (loadingTips.Count - 1));
 166
 0167        while (currentAnimationTime <= animationTipsTransitionTime)
 168        {
 0169            loadingTipsScroll.horizontalNormalizedPosition = Mathf.Lerp(
 170                initialNormalizedPos,
 171                currentFinalNormalizedPos,
 172                animationTipsCurve.Evaluate(currentAnimationTime / animationTipsTransitionTime));
 173
 0174            currentAnimationTime += Time.deltaTime;
 175
 0176            yield return null;
 177        }
 0178    }
 179
 180    internal void ForzeToEndCurrentTipsAnimation()
 181    {
 8182        loadingTipsScroll.horizontalNormalizedPosition = currentFinalNormalizedPos;
 8183        IncrementTipIndex();
 8184    }
 185
 44186    public void SetPercentage(float newValue) { loadingBar.SetPercentage(newValue); }
 187}