< Summary

Class:DCL.Components.TextShape
Assembly:DCL.Components.TextShape
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/TextShape/TextShape.cs
Covered lines:70
Uncovered lines:20
Coverable lines:90
Total lines:239
Line coverage:77.7% (70 of 90)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Model()0%110100%
GetDataFromJSON(...)0%110100%
Awake()0%110100%
Update()0%3.333066.67%
GetModel()0%2100%
ApplyChanges()0%7.187084.62%
ApplyModelChanges(...)0%14.110065.52%
GetAlignment(...)0%13130100%
PrepareRectTransform()0%2.042077.78%
GetClassId()0%2100%
Cleanup()0%2100%
OnDestroy()0%110100%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections;
 3using DCL.Controllers;
 4using DCL.Helpers;
 5using DCL.Models;
 6using TMPro;
 7using UnityEngine;
 8using Object = UnityEngine.Object;
 9
 10namespace DCL.Components
 11{
 12    public class TextShape : BaseComponent
 13    {
 14        [Serializable]
 15        public class Model : BaseModel
 16        {
 17            public bool billboard;
 18
 19            [Header("Font Properties")]
 3720            public string value = "";
 21
 3722            public bool visible = true;
 23
 3724            public Color color = Color.white;
 3725            public float opacity = 1f;
 3726            public float fontSize = 100f;
 27            public bool fontAutoSize = false;
 28            public string font;
 29
 30            [Header("Text box properties")]
 3731            public string hTextAlign = "bottom";
 32
 3733            public string vTextAlign = "left";
 3734            public float width = 1f;
 3735            public float height = 0.2f;
 36            public float paddingTop = 0f;
 37            public float paddingRight = 0f;
 38            public float paddingBottom = 0f;
 39            public float paddingLeft = 0f;
 40            public float lineSpacing = 0f;
 41            public int lineCount = 0;
 42            public bool textWrapping = false;
 43
 44            [Header("Text shadow properties")]
 45            public float shadowBlur = 0f;
 46
 47            public float shadowOffsetX = 0f;
 48            public float shadowOffsetY = 0f;
 3749            public Color shadowColor = new Color(1, 1, 1);
 50
 51            [Header("Text outline properties")]
 52            public float outlineWidth = 0f;
 53
 3754            public Color outlineColor = Color.white;
 55
 1456            public override BaseModel GetDataFromJSON(string json) { return Utils.SafeFromJson<Model>(json); }
 57        }
 58
 59        public TextMeshPro text;
 60        public RectTransform rectTransform;
 61        private Model cachedModel;
 62        private Material cachedFontMaterial;
 63
 64        private void Awake()
 65        {
 1066            model = new Model();
 1067            cachedFontMaterial = new Material(text.fontSharedMaterial);
 1068            text.fontSharedMaterial = cachedFontMaterial;
 1069            text.text = string.Empty;
 1070        }
 71
 72        public void Update()
 73        {
 3274            if (cachedModel.billboard && Camera.main != null)
 75            {
 076                transform.forward = Camera.main.transform.forward;
 77            }
 3278        }
 79
 080        new public Model GetModel() { return cachedModel; }
 81
 82        public override IEnumerator ApplyChanges(BaseModel newModel)
 83        {
 1484            if (rectTransform == null)
 085                yield break;
 86
 1487            Model model = (Model) newModel;
 1488            cachedModel = model;
 1489            PrepareRectTransform();
 90
 91            // We avoid using even yield break; as this instruction skips a frame and we don't want that.
 1492            if ( !DCLFont.IsFontLoaded(scene, model.font) )
 93            {
 094                yield return DCLFont.WaitUntilFontIsReady(scene, model.font);
 95            }
 96
 1497            DCLFont.SetFontFromComponent(scene, model.font, text);
 1498            ApplyModelChanges(text, model);
 99
 14100            if (entity.meshRootGameObject == null)
 10101                entity.meshesInfo.meshRootGameObject = gameObject;
 102
 14103            entity.OnShapeUpdated?.Invoke(entity);
 14104        }
 105
 106        public static void ApplyModelChanges(TMP_Text text, Model model)
 107        {
 14108            text.text = model.value;
 109
 14110            text.color = new Color(model.color.r, model.color.g, model.color.b, model.visible ? model.opacity : 0);
 14111            text.fontSize = (int) model.fontSize;
 14112            text.richText = true;
 14113            text.overflowMode = TextOverflowModes.Overflow;
 14114            text.enableAutoSizing = model.fontAutoSize;
 115
 14116            text.margin =
 117                new Vector4
 118                (
 119                    (int) model.paddingLeft,
 120                    (int) model.paddingTop,
 121                    (int) model.paddingRight,
 122                    (int) model.paddingBottom
 123                );
 124
 14125            text.alignment = GetAlignment(model.vTextAlign, model.hTextAlign);
 14126            text.lineSpacing = model.lineSpacing;
 127
 14128            if (model.lineCount != 0)
 129            {
 1130                text.maxVisibleLines = Mathf.Max(model.lineCount, 1);
 1131            }
 132            else
 133            {
 13134                text.maxVisibleLines = int.MaxValue;
 135            }
 136
 14137            text.enableWordWrapping = model.textWrapping && !text.enableAutoSizing;
 138
 14139            if (model.shadowOffsetX != 0 || model.shadowOffsetY != 0)
 140            {
 0141                text.fontSharedMaterial.EnableKeyword("UNDERLAY_ON");
 0142                text.fontSharedMaterial.SetColor("_UnderlayColor", model.shadowColor);
 0143                text.fontSharedMaterial.SetFloat("_UnderlaySoftness", model.shadowBlur);
 0144            }
 14145            else if (text.fontSharedMaterial.IsKeywordEnabled("UNDERLAY_ON"))
 146            {
 0147                text.fontSharedMaterial.DisableKeyword("UNDERLAY_ON");
 148            }
 149
 14150            if (model.outlineWidth > 0f)
 151            {
 0152                text.fontSharedMaterial.EnableKeyword("OUTLINE_ON");
 0153                text.outlineWidth = model.outlineWidth;
 0154                text.outlineColor = model.outlineColor;
 0155            }
 14156            else if (text.fontSharedMaterial.IsKeywordEnabled("OUTLINE_ON"))
 157            {
 0158                text.fontSharedMaterial.DisableKeyword("OUTLINE_ON");
 159            }
 14160        }
 161
 162        public static TextAlignmentOptions GetAlignment(string vTextAlign, string hTextAlign)
 163        {
 43164            vTextAlign = vTextAlign.ToLower();
 43165            hTextAlign = hTextAlign.ToLower();
 166
 167            switch (vTextAlign)
 168            {
 169                case "top":
 170                    switch (hTextAlign)
 171                    {
 172                        case "left":
 1173                            return TextAlignmentOptions.TopLeft;
 174                        case "right":
 1175                            return TextAlignmentOptions.TopRight;
 176                        default:
 1177                            return TextAlignmentOptions.Top;
 178                    }
 179
 180                case "bottom":
 181                    switch (hTextAlign)
 182                    {
 183                        case "left":
 1184                            return TextAlignmentOptions.BottomLeft;
 185                        case "right":
 1186                            return TextAlignmentOptions.BottomRight;
 187                        default:
 1188                            return TextAlignmentOptions.Bottom;
 189                    }
 190
 191                default: // center
 192                    switch (hTextAlign)
 193                    {
 194                        case "left":
 1195                            return TextAlignmentOptions.Left;
 196                        case "right":
 1197                            return TextAlignmentOptions.Right;
 198                        default:
 35199                            return TextAlignmentOptions.Center;
 200                    }
 201            }
 202        }
 203
 204        private void PrepareRectTransform()
 205        {
 14206            rectTransform.anchorMin = Vector2.zero;
 14207            rectTransform.anchorMax = Vector2.one;
 14208            rectTransform.offsetMin = Vector2.zero;
 14209            rectTransform.offsetMax = Vector2.zero;
 210
 211            // NOTE: previously width and height weren't working (setting sizeDelta before anchors and offset result in
 212            // sizeDelta being reset to 0,0)
 213            // to fix textWrapping and avoid backwards compatibility issues as result of the size being properly set (li
 214            // we only set it if textWrapping is enabled.
 14215            if (cachedModel.textWrapping)
 216            {
 0217                rectTransform.sizeDelta = new Vector2(cachedModel.width, cachedModel.height);
 0218            }
 219            else
 220            {
 14221                rectTransform.sizeDelta = Vector2.zero;
 222            }
 14223        }
 224
 0225        public override int GetClassId() { return (int) CLASS_ID.UI_TEXT_SHAPE; }
 226
 227        public override void Cleanup()
 228        {
 0229            text.text = string.Empty;
 0230            base.Cleanup();
 0231        }
 232
 233        private void OnDestroy()
 234        {
 10235            base.Cleanup();
 10236            Destroy(cachedFontMaterial);
 10237        }
 238    }
 239}