< Summary

Class:ECSTextShapeComponentHandler
Assembly:DCL.ECSComponents.TextShape
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/TextShape/ECSTextShapeComponentHandler.cs
Covered lines:66
Uncovered lines:10
Coverable lines:76
Total lines:163
Line coverage:86.8% (66 of 76)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ECSTextShapeComponentHandler()0%110100%
ECSTextShapeComponentHandler(...)0%110100%
OnComponentCreated(...)0%110100%
OnComponentRemoved(...)0%110100%
OnComponentModelUpdated(...)0%8.018095%
SetRectTransform(...)0%110100%
SetShadow(...)0%6.984042.86%
SetOutline(...)0%330100%
GetAlignment(...)0%26.1211050%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/TextShape/ECSTextShapeComponentHandler.cs

#LineLine coverage
 1using DCL;
 2using DCL.Controllers;
 3using DCL.ECS7.InternalComponents;
 4using DCL.ECSComponents;
 5using DCL.ECSRuntime;
 6using DCL.Models;
 7using Decentraland.Common;
 8using TMPro;
 9using UnityEngine;
 10using Vector2 = UnityEngine.Vector2;
 11
 12public class ECSTextShapeComponentHandler : IECSComponentHandler<PBTextShape>
 13{
 114    private static readonly int UNDERLAY_COLOR_SHADER_PROP = Shader.PropertyToID("_UnderlayColor");
 115    private static readonly int UNDERLAY_SOFTNESS_SHADER_PROP = Shader.PropertyToID("_UnderlaySoftness");
 16
 17    private readonly AssetPromiseKeeper_Font fontPromiseKeeper;
 18    private readonly IInternalECSComponent<InternalRenderers> renderersInternalComponent;
 19
 20    internal TextMeshPro textComponent;
 21    private GameObject textGameObject;
 22    private RectTransform rectTransform;
 23    private Renderer textRenderer;
 24
 25    internal AssetPromise_Font fontPromise;
 26
 27    private PBTextShape currentModel;
 28
 2229    public ECSTextShapeComponentHandler(AssetPromiseKeeper_Font fontPromiseKeeper, IInternalECSComponent<InternalRendere
 30    {
 2231        this.fontPromiseKeeper = fontPromiseKeeper;
 2232        this.renderersInternalComponent = renderersInternalComponent;
 2233    }
 34
 35    public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 36    {
 2237        textGameObject = new GameObject("TextShape");
 38
 2239        textRenderer = textGameObject.AddComponent<MeshRenderer>();
 2240        rectTransform = textGameObject.AddComponent<RectTransform>();
 2241        textComponent = textGameObject.AddComponent<TextMeshPro>();
 2242        rectTransform.SetParent(entity.gameObject.transform, false);
 2243        rectTransform.localRotation = Quaternion.Euler(0, 180, 0);
 44
 2245        textComponent.text = string.Empty;
 2246        textComponent.richText = true;
 2247        textComponent.overflowMode = TextOverflowModes.Overflow;
 2248        renderersInternalComponent.AddRenderer(scene, entity, textRenderer);
 2249    }
 50
 51    public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 52    {
 2453        renderersInternalComponent.RemoveRenderer(scene, entity, textRenderer);
 2454        fontPromiseKeeper.Forget(fontPromise);
 55
 2456        Object.Destroy(textGameObject);
 2457    }
 58
 59    public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBTextShape model)
 60    {
 2161        if (model.Equals(currentModel))
 062            return;
 63
 2164        currentModel = model;
 65
 2166        SetRectTransform(rectTransform, model.GetTextWrapping() ? new Vector2(model.GetWidth(), model.GetHeight()) : Vec
 67
 2168        textComponent.text = model.Text;
 69
 2170        var color = model.GetTextColor().ToUnityColor();
 2171        textComponent.color = color;
 72
 2173        textComponent.fontSize = model.GetFontSize();
 2174        textComponent.enableAutoSizing = model.GetFontAutoSize();
 2175        textComponent.margin = model.GetPadding();
 2176        textComponent.alignment = GetAlignment(model.GetTextAlign());
 2177        textComponent.lineSpacing = model.GetLineSpacing();
 2178        textComponent.maxVisibleLines = model.GetLineCount() != 0 ? Mathf.Max(model.GetLineCount(), 1) : int.MaxValue;
 2179        textComponent.textWrappingMode = model.GetTextWrapping() && !model.GetFontAutoSize() ? TextWrappingModes.Normal 
 80
 2181        var prevPromise = fontPromise;
 2182        fontPromise = new AssetPromise_Font(model.GetFont().ToFontName());
 2183        fontPromise.OnSuccessEvent += assetFont =>
 84        {
 2085            textComponent.font = assetFont.font;
 2086            SetShadow(textComponent.fontSharedMaterial, model.GetShadowOffsetX(), model.GetShadowOffsetY(), model.GetSha
 2087            SetOutline(textComponent, model.GetOutlineWidth(), model.GetOutlineColor());
 2088        };
 2189        fontPromiseKeeper.Keep(fontPromise);
 2190        fontPromiseKeeper.Forget(prevPromise);
 2191    }
 92
 93    private static void SetRectTransform(RectTransform rectTransform, Vector2 sizeDelta)
 94    {
 2195        rectTransform.anchorMin = Vector2.zero;
 2196        rectTransform.anchorMax = Vector2.one;
 2197        rectTransform.offsetMin = Vector2.zero;
 2198        rectTransform.offsetMax = Vector2.zero;
 2199        rectTransform.sizeDelta = sizeDelta;
 21100    }
 101
 102    private static void SetShadow(Material fontMaterial, float shadowOffsetX, float shadowOffsetY,
 103        float shadowBlur, Color3 shadowColor)
 104    {
 105        const string UNDERLAY_ON_KERYWORD = "UNDERLAY_ON";
 106
 20107        if (shadowOffsetX != 0 || shadowOffsetY != 0)
 108        {
 0109            fontMaterial.EnableKeyword(UNDERLAY_ON_KERYWORD);
 0110            fontMaterial.SetColor(UNDERLAY_COLOR_SHADER_PROP, shadowColor.ToUnityColor());
 0111            fontMaterial.SetFloat(UNDERLAY_SOFTNESS_SHADER_PROP, shadowBlur);
 112        }
 20113        else if (fontMaterial.IsKeywordEnabled(UNDERLAY_ON_KERYWORD))
 114        {
 0115            fontMaterial.DisableKeyword(UNDERLAY_ON_KERYWORD);
 116        }
 20117    }
 118
 119    private static void SetOutline(TextMeshPro textComponent, float outlineWidth, Color3 outlineColor)
 120    {
 121        const string OUTLINE_ON_KERYWORD = "OUTLINE_ON";
 122
 20123        Material fontSharedMaterial = textComponent.fontSharedMaterial;
 124
 20125        if (outlineWidth > 0f)
 126        {
 1127            fontSharedMaterial.EnableKeyword(OUTLINE_ON_KERYWORD);
 1128            textComponent.outlineWidth = outlineWidth;
 1129            textComponent.outlineColor = outlineColor.ToUnityColor();
 130        }
 19131        else if (fontSharedMaterial.IsKeywordEnabled(OUTLINE_ON_KERYWORD))
 132        {
 1133            fontSharedMaterial.DisableKeyword(OUTLINE_ON_KERYWORD);
 134        }
 19135    }
 136
 137    private static TextAlignmentOptions GetAlignment(TextAlignMode value)
 138    {
 139        switch (value)
 140        {
 141            case TextAlignMode.TamTopLeft:
 1142                return TextAlignmentOptions.TopLeft;
 143            case TextAlignMode.TamTopRight:
 1144                return TextAlignmentOptions.TopRight;
 145            case TextAlignMode.TamTopCenter:
 0146                return TextAlignmentOptions.Top;
 147            case TextAlignMode.TamBottomLeft:
 1148                return TextAlignmentOptions.BottomLeft;
 149            case TextAlignMode.TamBottomRight:
 1150                return TextAlignmentOptions.BottomRight;
 151            case TextAlignMode.TamBottomCenter:
 0152                return TextAlignmentOptions.Bottom;
 153            case TextAlignMode.TamMiddleLeft:
 0154                return TextAlignmentOptions.Left;
 155            case TextAlignMode.TamMiddleCenter:
 17156                return TextAlignmentOptions.Center;
 157            case TextAlignMode.TamMiddleRight:
 0158                return TextAlignmentOptions.Right;
 159            default:
 0160                return TextAlignmentOptions.Center;
 161        }
 162    }
 163}