< 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:38
Uncovered lines:28
Coverable lines:66
Total lines:174
Line coverage:57.5% (38 of 66)
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%2.062075%
StartTipsCarousel()0%110100%
StopTipsCarousel()0%3.192033.33%
TryToHideCoroutine()0%6.116085.71%
RunTipsCarouselCoroutine()0%7.464040%
IncrementTipIndex()0%6200%
RunTipsAnimationCoroutine()0%20400%
ForzeToEndCurrentTipsAnimation()0%2100%
SetPercentage(...)0%2100%

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    void Show();
 12    void Hide(bool forzeHidding = false, Action onHideAction = null);
 13    void StartTipsCarousel();
 14    void StopTipsCarousel();
 15    void SetPercentage(float newValue);
 16}
 17
 18public class BuilderInWorldLoadingView : MonoBehaviour, IBuilderInWorldLoadingView
 19{
 20    private const string VIEW_PATH = "BuilderInWorldLoadingView";
 21
 22    [Header("Loading Tips Config")]
 23    [SerializeField] internal BuilderInWorldLoadingTip loadingTipPrefab;
 24    [SerializeField] internal RectTransform loadingTipsContainer;
 25    [SerializeField] internal ScrollRect loadingTipsScroll;
 26    [SerializeField] internal List<BuilderInWorldLoadingTipModel> loadingTips;
 29927    [SerializeField] internal float timeBetweenTips = 3f;
 28    [SerializeField] internal AnimationCurve animationTipsCurve;
 29929    [SerializeField] internal float animationTipsTransitionTime = 1f;
 30
 31    [Header("Other Config")]
 29932    [SerializeField] internal float minVisibilityTime = 1.5f;
 33    [SerializeField] internal LoadingBar loadingBar;
 34
 035    public bool isActive => gameObject.activeSelf;
 36
 37    internal Coroutine tipsCoroutine;
 38    internal Coroutine hideCoroutine;
 39    internal float showTime = 0f;
 40    internal int currentTipIndex = 0;
 41    internal float currentFinalNormalizedPos;
 42
 43    internal static BuilderInWorldLoadingView Create()
 44    {
 245        var view = Instantiate(Resources.Load<GameObject>(VIEW_PATH)).GetComponent<BuilderInWorldLoadingView>();
 246        view.gameObject.name = "_BuilderInWorldLoadingView";
 47
 248        return view;
 49    }
 50
 451    private void Awake() { CreateLoadingTips(); }
 52
 53    private void CreateLoadingTips()
 54    {
 255        RectTransform tipsContainerRectTranform = loadingTipsContainer;
 256        float tipsContainerHorizontalOffset = 0;
 57
 1258        for (int i = 0; i < loadingTips.Count; i++)
 59        {
 460            BuilderInWorldLoadingTip newTip = Instantiate(loadingTipPrefab, loadingTipsContainer);
 461            newTip.Configure(loadingTips[i]);
 62
 463            if (i > 0)
 64            {
 265                tipsContainerHorizontalOffset += ((RectTransform)newTip.transform).rect.size.x;
 66            }
 67        }
 68
 269        tipsContainerRectTranform.offsetMax = new Vector2(tipsContainerHorizontalOffset, tipsContainerRectTranform.offse
 270    }
 71
 72    public void Show()
 73    {
 174        gameObject.SetActive(true);
 175        showTime = Time.realtimeSinceStartup;
 76
 177        if (loadingTips.Count > 0)
 78        {
 179            StartTipsCarousel();
 80        }
 81
 182        AudioScriptableObjects.builderEnter.Play();
 183    }
 84
 85    public void Hide(bool forzeHidding = false, Action onHideAction = null)
 86    {
 187        if (hideCoroutine != null)
 088            CoroutineStarter.Stop(hideCoroutine);
 89
 190        hideCoroutine = CoroutineStarter.Start(TryToHideCoroutine(forzeHidding, onHideAction));
 191    }
 92
 93    public void StartTipsCarousel()
 94    {
 195        StopTipsCarousel();
 196        tipsCoroutine = CoroutineStarter.Start(RunTipsCarouselCoroutine());
 197    }
 98
 99    public void StopTipsCarousel()
 100    {
 2101        if (tipsCoroutine == null)
 2102            return;
 103
 0104        CoroutineStarter.Stop(tipsCoroutine);
 0105        tipsCoroutine = null;
 106
 0107        ForzeToEndCurrentTipsAnimation();
 0108    }
 109
 110    internal IEnumerator TryToHideCoroutine(bool forzeHidding, Action onHideAction)
 111    {
 1112        while (!forzeHidding && (Time.realtimeSinceStartup - showTime) < minVisibilityTime)
 113        {
 0114            yield return null;
 115        }
 116
 1117        StopTipsCarousel();
 1118        gameObject.SetActive(false);
 1119        onHideAction?.Invoke();
 1120        AudioScriptableObjects.builderReady.Play();
 1121    }
 122
 123    internal IEnumerator RunTipsCarouselCoroutine()
 124    {
 1125        currentTipIndex = 0;
 126
 0127        while (true)
 128        {
 1129            yield return new WaitForSeconds(timeBetweenTips);
 0130            yield return RunTipsAnimationCoroutine();
 0131            IncrementTipIndex();
 132        }
 133    }
 134
 135    private void IncrementTipIndex()
 136    {
 0137        currentTipIndex++;
 0138        if (currentTipIndex >= loadingTips.Count - 1)
 139        {
 0140            currentTipIndex = 0;
 0141            loadingTipsScroll.horizontalNormalizedPosition = 0f;
 142
 143            // Moving the last tip game object to the first position in the hierarchy, we make the carousel cyclical.
 0144            loadingTipsContainer.GetChild(loadingTipsContainer.childCount - 1).SetAsFirstSibling();
 145        }
 0146    }
 147
 148    internal IEnumerator RunTipsAnimationCoroutine()
 149    {
 0150        float currentAnimationTime = 0f;
 0151        float initialNormalizedPos = loadingTipsScroll.horizontalNormalizedPosition;
 0152        currentFinalNormalizedPos = initialNormalizedPos + (1f / (loadingTips.Count - 1));
 153
 0154        while (currentAnimationTime <= animationTipsTransitionTime)
 155        {
 0156            loadingTipsScroll.horizontalNormalizedPosition = Mathf.Lerp(
 157                initialNormalizedPos,
 158                currentFinalNormalizedPos,
 159                animationTipsCurve.Evaluate(currentAnimationTime / animationTipsTransitionTime));
 160
 0161            currentAnimationTime += Time.deltaTime;
 162
 0163            yield return null;
 164        }
 0165    }
 166
 167    internal void ForzeToEndCurrentTipsAnimation()
 168    {
 0169        loadingTipsScroll.horizontalNormalizedPosition = currentFinalNormalizedPos;
 0170        IncrementTipIndex();
 0171    }
 172
 0173    public void SetPercentage(float newValue) { loadingBar.SetPercentage(newValue); }
 174}