< Summary

Class:DCL.Components.UIScreenSpace
Assembly:DCL.Components.UI
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/UI/UIScreenSpace/UIScreenSpace.cs
Covered lines:75
Uncovered lines:12
Coverable lines:87
Total lines:192
Line coverage:86.2% (75 of 87)
Covered branches:0
Total branches:0
Covered methods:8
Total methods:12
Method coverage:66.6% (8 of 12)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
UIScreenSpace()0%110100%
GetClassId()0%2100%
AttachTo(...)0%2100%
DetachFrom(...)0%2100%
ApplyChanges()0%440100%
Dispose()0%330100%
OnChangeSceneUI(...)0%110100%
OnPlayerCoordinatesChanged(...)0%3.333066.67%
AllUIHidden_OnChange(...)0%2100%
UpdateCanvasVisibility()0%990100%
InitializeCanvas()0%6.066088.37%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/UI/UIScreenSpace/UIScreenSpace.cs

#LineLine coverage
 1using DCL.Configuration;
 2using DCL.Controllers;
 3using DCL.Helpers;
 4using DCL.Models;
 5using System;
 6using System.Collections;
 7using System.Collections.Generic;
 8using UnityEngine;
 9using UnityEngine.UI;
 10
 11namespace DCL.Components
 12{
 13    public class UIScreenSpace : UIShape
 14    {
 15        static bool VERBOSE = false;
 16
 17        public Canvas canvas;
 18        public GraphicRaycaster graphicRaycaster;
 19
 20        private CanvasGroup canvasGroup;
 21        private bool isInsideSceneBounds;
 14322        private BaseVariable<bool> isUIEnabled => DataStore.i.HUDs.isCurrentSceneUiEnabled;
 23        private HUDCanvasCameraModeController hudCanvasCameraModeController;
 5024        private readonly DataStore_Player dataStorePlayer = DataStore.i.player;
 25
 5026        public UIScreenSpace()
 27        {
 5028            dataStorePlayer.playerGridPosition.OnChange += OnPlayerCoordinatesChanged;
 5029            DataStore.i.HUDs.isCurrentSceneUiEnabled.OnChange += OnChangeSceneUI;
 5030            OnChangeSceneUI(isUIEnabled.Get(), true);
 5031            model = new Model();
 5032        }
 33
 034        public override int GetClassId() { return (int) CLASS_ID.UI_SCREEN_SPACE_SHAPE; }
 35
 36        public override void AttachTo(IDCLEntity entity, System.Type overridenAttachedType = null)
 37        {
 038            Debug.LogError(
 39                "Aborted UIScreenShape attachment to an entity. UIShapes shouldn't be attached to entities.");
 040        }
 41
 042        public override void DetachFrom(IDCLEntity entity, System.Type overridenAttachedType = null) { }
 43
 44        private bool initialized = false;
 45
 46        public override IEnumerator ApplyChanges(BaseModel newModel)
 47        {
 5848            if (!initialized)
 49            {
 5050                InitializeCanvas();
 5051                initialized = true;
 52            }
 53            else
 54            {
 855                OnPlayerCoordinatesChanged(dataStorePlayer.playerGridPosition.Get(), dataStorePlayer.playerGridPosition.
 56            }
 57
 58            //We have to wait a frame for the Canvas Scaler to act
 5859            yield return null;
 5860        }
 61
 62        public override void Dispose()
 63        {
 1964            hudCanvasCameraModeController?.Dispose();
 1965            dataStorePlayer.playerGridPosition.OnChange -= OnPlayerCoordinatesChanged;
 1966            DataStore.i.HUDs.isCurrentSceneUiEnabled.OnChange -= OnChangeSceneUI;
 1967            CommonScriptableObjects.allUIHidden.OnChange -= AllUIHidden_OnChange;
 68
 1969            if (childHookRectTransform != null)
 70            {
 1971                Utils.SafeDestroy(childHookRectTransform.gameObject);
 72            }
 1973        }
 74
 75        void OnChangeSceneUI(bool current, bool previous)
 76        {
 5077            UpdateCanvasVisibility();
 5078        }
 79
 80        void OnPlayerCoordinatesChanged(Vector2Int current, Vector2Int previous)
 81        {
 5882            if (canvas == null)
 083                return;
 84
 5885            UpdateCanvasVisibility();
 86
 5887            if (VERBOSE)
 88            {
 089                Debug.Log($"set screenspace = {current}");
 90            }
 5891        }
 92
 093        private void AllUIHidden_OnChange(bool current, bool previous) { UpdateCanvasVisibility(); }
 94
 95        private void UpdateCanvasVisibility()
 96        {
 15897            if (canvas == null || scene == null)
 5098                return;
 99
 108100            var model = (Model) this.model;
 101
 108102            isInsideSceneBounds = scene.IsInsideSceneBoundaries(dataStorePlayer.playerGridPosition.Get());
 103
 108104            if (isInsideSceneBounds)
 105            {
 100106                DataStore.i.Get<DataStore_World>().currentRaycaster.Set(graphicRaycaster);
 107            }
 108
 108109            bool shouldBeVisible = model.visible && isInsideSceneBounds && !CommonScriptableObjects.allUIHidden.Get() &&
 110
 108111            canvasGroup.alpha = shouldBeVisible ? 1f : 0f;
 108112            canvasGroup.blocksRaycasts = shouldBeVisible;
 108113        }
 114
 115        void InitializeCanvas()
 116        {
 50117            if (VERBOSE)
 118            {
 0119                Debug.Log("Started canvas initialization in " + id);
 120            }
 121
 50122            GameObject canvasGameObject = new GameObject("UIScreenSpace");
 50123            canvasGameObject.layer = LayerMask.NameToLayer("UI");
 50124            canvasGameObject.transform.SetParent(scene.GetSceneTransform());
 50125            canvasGameObject.transform.ResetLocalTRS();
 126
 127            // Canvas
 50128            canvas = canvasGameObject.AddComponent<Canvas>();
 50129            hudCanvasCameraModeController = new HUDCanvasCameraModeController(canvas, DataStore.i.camera.hudsCamera);
 130
 131            // Canvas Scaler (for maintaining ui aspect ratio)
 50132            CanvasScaler canvasScaler = canvasGameObject.AddComponent<CanvasScaler>();
 50133            canvasScaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
 50134            canvasScaler.referenceResolution = new Vector2(1280f, 720f);
 50135            canvasScaler.matchWidthOrHeight = 1f; // Match height, recommended for landscape projects
 136
 137            // Graphics Raycaster (for allowing touch/click input on the ui components)
 50138            graphicRaycaster = canvasGameObject.AddComponent<GraphicRaycaster>();
 139
 50140            canvas.sortingOrder = -1;
 141
 50142            if (scene.isPersistent && scene.sceneData.sceneNumber != EnvironmentSettings.AVATAR_GLOBAL_SCENE_NUMBER)
 143            {
 0144                canvas.sortingOrder -= 1;
 145            }
 146
 147            // We create a middleman-gameobject to change the size of the parcel-devs accessible canvas, to have its bot
 50148            GameObject resizedPanel = new GameObject("ResizeUIArea");
 149
 50150            resizedPanel.AddComponent<CanvasRenderer>();
 50151            childHookRectTransform = resizedPanel.AddComponent<RectTransform>();
 50152            childHookRectTransform.SetParent(canvas.transform);
 50153            childHookRectTransform.ResetLocalTRS();
 154
 50155            childHookRectTransform.anchorMin = Vector2.zero;
 50156            childHookRectTransform.anchorMax = new Vector2(1, 0);
 157
 158            // We scale the panel downwards to subtract the viewport's top 10%
 50159            float canvasHeight = canvasScaler.referenceResolution.y;
 50160            childHookRectTransform.pivot = new Vector2(0.5f, 0f);
 50161            float canvasSubtraction = canvasHeight * UISettings.RESERVED_CANVAS_TOP_PERCENTAGE / 100;
 50162            childHookRectTransform.sizeDelta = new Vector2(0, canvasHeight - canvasSubtraction);
 163
 164            // We scale the panel upwards to subtract the viewport's bottom 5% for Decentraland's taskbar
 50165            canvasHeight = childHookRectTransform.sizeDelta.y;
 50166            childHookRectTransform.pivot = new Vector2(0.5f, 1f);
 50167            childHookRectTransform.anchoredPosition = new Vector3(0, canvasHeight, 0f);
 50168            childHookRectTransform.sizeDelta = new Vector2(0, canvasHeight - canvasSubtraction / 2);
 169
 170            // Canvas group
 50171            canvasGroup = canvas.gameObject.AddComponent<CanvasGroup>();
 50172            canvasGroup.alpha = 0f; // Alpha will be updated later when the player enters this scene
 50173            canvasGroup.blocksRaycasts = false;
 174
 50175            if (VERBOSE)
 176            {
 0177                Debug.Log("canvas initialized, width: " + childHookRectTransform.rect.width);
 0178                Debug.Log("canvas initialized, height: " + childHookRectTransform.rect.height);
 179            }
 180
 50181            OnPlayerCoordinatesChanged(dataStorePlayer.playerGridPosition.Get(), dataStorePlayer.playerGridPosition.Get(
 182
 50183            if (VERBOSE)
 184            {
 0185                Debug.Log("Finished canvas initialization in " + id);
 186            }
 187
 50188            UpdateCanvasVisibility();
 50189            CommonScriptableObjects.allUIHidden.OnChange += AllUIHidden_OnChange;
 50190        }
 191    }
 192}