< Summary

Class:DCL.NavmapZoom
Assembly:Navmap
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/NavMap/NavmapZoom.cs
Covered lines:25
Uncovered lines:31
Coverable lines:56
Total lines:141
Line coverage:44.6% (25 of 56)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
NavmapZoom()0%110100%
ResetToDefault()0%110100%
SetUiButtonsInteractability()0%110100%
Start()0%110100%
OnEnable()0%110100%
OnDisable()0%110100%
OnMouseWheelValueChanged(...)0%30500%
Zoom(...)0%90900%
UpdateScale(...)0%2100%
ScaleOverTime()0%20400%
ZoomInput()0%110100%
SetUiInteractable(...)0%330100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/NavMap/NavmapZoom.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using UnityEngine;
 4using UnityEngine.EventSystems;
 5using UnityEngine.UI;
 6
 7namespace DCL
 8{
 9    public class NavmapZoom : MonoBehaviour
 10    {
 11        private const int MAX_ZOOM = 4;
 12        private const int MIN_ZOOM = 1;
 13        private const float MOUSE_WHEEL_THRESHOLD = 0.04f;
 14        private const float SCALE_DURATION = 0.2f;
 15
 16        [SerializeField] private InputAction_Measurable mouseWheelAction;
 17        [SerializeField] private RectTransform containerRectTransform;
 18        [SerializeField] private AnimationCurve zoomCurve;
 19
 20        [SerializeField] private ZoomInput zoomIn;
 21        [SerializeField] private ZoomInput zoomOut;
 22
 23        private int currentZoomLevel;
 24        private bool isScaling;
 25
 1126        public float Scale { get; private set; } = 1;
 027        private BaseVariable<bool> navmapVisible => DataStore.i.HUDs.navmapVisible;
 28
 29        public void ResetToDefault()
 30        {
 231            currentZoomLevel = MAX_ZOOM / 2;
 232            Scale = zoomCurve.Evaluate(currentZoomLevel);
 233            containerRectTransform.localScale = new Vector3(Scale, Scale, Scale);
 34
 235            SetUiButtonsInteractability();
 236        }
 37
 38        private void SetUiButtonsInteractability()
 39        {
 240            zoomIn.SetUiInteractable(isInteractable: currentZoomLevel < MAX_ZOOM);
 241            zoomOut.SetUiInteractable(isInteractable: currentZoomLevel > MIN_ZOOM);
 242        }
 43
 244        private void Start() => ResetToDefault();
 45
 46        private void OnEnable()
 47        {
 248            mouseWheelAction.OnValueChanged += OnMouseWheelValueChanged;
 49
 250            zoomIn.InputAction.OnStarted += Zoom;
 251            zoomOut.InputAction.OnStarted += Zoom;
 52
 253            zoomIn.Button.onClick.AddListener( () => Zoom(DCLAction_Hold.ZoomIn));
 254            zoomOut.Button.onClick.AddListener( () => Zoom(DCLAction_Hold.ZoomOut));
 255        }
 56
 57        private void OnDisable()
 58        {
 259            mouseWheelAction.OnValueChanged -= OnMouseWheelValueChanged;
 60
 261            zoomIn.InputAction.OnStarted -= Zoom;
 262            zoomOut.InputAction.OnStarted -= Zoom;
 263        }
 64
 65        private void OnMouseWheelValueChanged(DCLAction_Measurable action, float value)
 66        {
 067            if (value == 0 || Mathf.Abs(value) < MOUSE_WHEEL_THRESHOLD)
 068                return;
 69
 070            var zoomAction = value > 0 ? DCLAction_Hold.ZoomIn : DCLAction_Hold.ZoomOut;
 71
 072            Zoom(zoomAction);
 073        }
 74
 75        private void Zoom(DCLAction_Hold action)
 76        {
 077            if (!navmapVisible.Get() || isScaling)
 078                return;
 79
 080            switch (action)
 81            {
 082                case DCLAction_Hold.ZoomIn when currentZoomLevel == MAX_ZOOM:
 083                case DCLAction_Hold.ZoomOut when currentZoomLevel == MIN_ZOOM:
 084                    return;
 85            }
 86
 087            EventSystem.current.SetSelectedGameObject(null);
 88
 089            float startScale = Scale;
 090            UpdateScale(zoomDirection: action == DCLAction_Hold.ZoomIn ? 1 : -1);
 91
 092            StopAllCoroutines();
 093            StartCoroutine(ScaleOverTime(from: startScale, to: Scale));
 94
 095            SetUiButtonsInteractability();
 096        }
 97
 98        private void UpdateScale(int zoomDirection)
 99        {
 0100            currentZoomLevel += zoomDirection;
 0101            Scale = zoomCurve.Evaluate(currentZoomLevel);
 0102            MapRenderer.i.scaleFactor = Scale;
 0103        }
 104
 105        private IEnumerator ScaleOverTime(float from, float to)
 106        {
 0107            isScaling = true;
 108
 0109            Vector3 startScale = new Vector3(from, from, from);
 0110            Vector3 targetScale = new Vector3(to, to, to);
 111
 0112            for (float timer = 0; timer < SCALE_DURATION; timer += Time.deltaTime)
 113            {
 0114                containerRectTransform.localScale =
 115                    Vector3.Lerp(startScale, targetScale, timer / SCALE_DURATION);
 116
 0117                yield return null;
 118            }
 119
 0120            isScaling = false;
 0121        }
 122
 123        [Serializable]
 124        private class ZoomInput
 125        {
 1126            private static Color normalColor = new Color(0f, 0f, 0f, 1f);
 1127            private static Color disabledColor = new Color(0f, 0f, 0f, 0.5f);
 128
 129            public InputAction_Hold InputAction;
 130            public Button Button;
 131
 132            [SerializeField] private Image Image;
 133
 134            public void SetUiInteractable(bool isInteractable)
 135            {
 4136                Button.interactable = isInteractable;
 4137                Image.color = isInteractable ? normalColor : disabledColor;
 4138            }
 139        }
 140    }
 141}