< Summary

Class:ECSTextShapeComponentHandler
Assembly:DCL.ECSComponents.TextShape
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/ECS7/ECSComponents/TextShape/ECSTextShapeComponentHandler.cs
Covered lines:72
Uncovered lines:14
Coverable lines:86
Total lines:184
Line coverage:83.7% (72 of 86)
Covered branches:0
Total branches:0
Covered methods:10
Total methods:10
Method coverage:100% (10 of 10)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ECSTextShapeComponentHandler()0%110100%
ECSTextShapeComponentHandler(...)0%110100%
OnComponentCreated(...)0%110100%
OnComponentRemoved(...)0%110100%
OnTextRendererUpdated(...)0%6.984042.86%
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    private readonly IInternalECSComponent<InternalSceneBoundsCheck> sbcInternalComponent;
 20
 21    internal TextMeshPro textComponent;
 22    internal AssetPromise_Font fontPromise;
 23
 24    private IParcelScene scene;
 25    private IDCLEntity entity;
 26    private GameObject textGameObject;
 27    private RectTransform rectTransform;
 28    private Renderer textRenderer;
 29    private PBTextShape currentModel;
 30
 2231    public ECSTextShapeComponentHandler(AssetPromiseKeeper_Font fontPromiseKeeper, IInternalECSComponent<InternalRendere
 32    {
 2233        this.fontPromiseKeeper = fontPromiseKeeper;
 2234        this.renderersInternalComponent = renderersInternalComponent;
 2235        this.sbcInternalComponent = sbcInternalComponent;
 2236    }
 37
 38    public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 39    {
 2240        this.scene = scene;
 2241        this.entity = entity;
 42
 2243        textGameObject = new GameObject("TextShape");
 44
 2245        rectTransform = textGameObject.AddComponent<RectTransform>();
 2246        textComponent = textGameObject.AddComponent<TextMeshPro>();
 2247        textRenderer = textComponent.renderer;
 2248        rectTransform.SetParent(entity.gameObject.transform, false);
 49
 2250        textComponent.text = string.Empty;
 2251        textComponent.richText = true;
 2252        textComponent.overflowMode = TextOverflowModes.Overflow;
 2253        textComponent.OnPreRenderText += OnTextRendererUpdated;
 2254        renderersInternalComponent.AddRenderer(scene, entity, textRenderer);
 2255    }
 56
 57    public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 58    {
 2459        textComponent.OnPreRenderText -= OnTextRendererUpdated;
 2460        renderersInternalComponent.RemoveRenderer(scene, entity, textRenderer);
 61
 2462        fontPromiseKeeper.Forget(fontPromise);
 63
 2464        Object.Destroy(textGameObject);
 2465    }
 66
 67    private void OnTextRendererUpdated(TMP_TextInfo tmproInfo)
 68    {
 169        var model = sbcInternalComponent.GetFor(scene, entity)?.model;
 270        if (model == null) return;
 71
 072        InternalSceneBoundsCheck finalModel = model.Value;
 073        finalModel.meshesDirty = true;
 74
 075        sbcInternalComponent.PutFor(scene, entity, finalModel);
 076    }
 77
 78    public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBTextShape model)
 79    {
 2180        if (model.Equals(currentModel))
 081            return;
 82
 2183        currentModel = model;
 84
 2185        SetRectTransform(rectTransform, model.GetTextWrapping() ? new Vector2(model.GetWidth(), model.GetHeight()) : Vec
 86
 2187        textComponent.text = model.Text;
 88
 2189        var color = model.GetTextColor().ToUnityColor();
 2190        textComponent.color = color;
 91
 2192        textComponent.fontSize = model.GetFontSize();
 2193        textComponent.enableAutoSizing = model.GetFontAutoSize();
 2194        textComponent.margin = model.GetPadding();
 2195        textComponent.alignment = GetAlignment(model.GetTextAlign());
 2196        textComponent.lineSpacing = model.GetLineSpacing();
 2197        textComponent.maxVisibleLines = model.GetLineCount() != 0 ? Mathf.Max(model.GetLineCount(), 1) : int.MaxValue;
 2198        textComponent.textWrappingMode = model.GetTextWrapping() && !model.GetFontAutoSize() ? TextWrappingModes.Normal 
 99
 21100        var prevPromise = fontPromise;
 21101        fontPromise = new AssetPromise_Font(model.GetFont().ToFontName());
 102
 21103        fontPromise.OnSuccessEvent += assetFont =>
 104        {
 20105            textComponent.font = assetFont.font;
 20106            SetShadow(textComponent.fontSharedMaterial, model.GetShadowOffsetX(), model.GetShadowOffsetY(), model.GetSha
 20107            SetOutline(textComponent, model.GetOutlineWidth(), model.GetOutlineColor());
 20108        };
 109
 21110        fontPromiseKeeper.Keep(fontPromise);
 21111        fontPromiseKeeper.Forget(prevPromise);
 21112    }
 113
 114    private static void SetRectTransform(RectTransform rectTransform, Vector2 sizeDelta)
 115    {
 21116        rectTransform.anchorMin = Vector2.zero;
 21117        rectTransform.anchorMax = Vector2.one;
 21118        rectTransform.offsetMin = Vector2.zero;
 21119        rectTransform.offsetMax = Vector2.zero;
 21120        rectTransform.sizeDelta = sizeDelta;
 21121    }
 122
 123    private static void SetShadow(Material fontMaterial, float shadowOffsetX, float shadowOffsetY,
 124        float shadowBlur, Color3 shadowColor)
 125    {
 126        const string UNDERLAY_ON_KERYWORD = "UNDERLAY_ON";
 127
 20128        if (shadowOffsetX != 0 || shadowOffsetY != 0)
 129        {
 0130            fontMaterial.EnableKeyword(UNDERLAY_ON_KERYWORD);
 0131            fontMaterial.SetColor(UNDERLAY_COLOR_SHADER_PROP, shadowColor.ToUnityColor());
 0132            fontMaterial.SetFloat(UNDERLAY_SOFTNESS_SHADER_PROP, shadowBlur);
 133        }
 20134        else if (fontMaterial.IsKeywordEnabled(UNDERLAY_ON_KERYWORD))
 135        {
 0136            fontMaterial.DisableKeyword(UNDERLAY_ON_KERYWORD);
 137        }
 20138    }
 139
 140    private static void SetOutline(TextMeshPro textComponent, float outlineWidth, Color3 outlineColor)
 141    {
 142        const string OUTLINE_ON_KERYWORD = "OUTLINE_ON";
 143
 20144        Material fontSharedMaterial = textComponent.fontSharedMaterial;
 145
 20146        if (outlineWidth > 0f)
 147        {
 1148            fontSharedMaterial.EnableKeyword(OUTLINE_ON_KERYWORD);
 1149            textComponent.outlineWidth = outlineWidth;
 1150            textComponent.outlineColor = outlineColor.ToUnityColor();
 151        }
 19152        else if (fontSharedMaterial.IsKeywordEnabled(OUTLINE_ON_KERYWORD))
 153        {
 1154            fontSharedMaterial.DisableKeyword(OUTLINE_ON_KERYWORD);
 155        }
 19156    }
 157
 158    private static TextAlignmentOptions GetAlignment(TextAlignMode value)
 159    {
 160        switch (value)
 161        {
 162            case TextAlignMode.TamTopLeft:
 1163                return TextAlignmentOptions.TopLeft;
 164            case TextAlignMode.TamTopRight:
 1165                return TextAlignmentOptions.TopRight;
 166            case TextAlignMode.TamTopCenter:
 0167                return TextAlignmentOptions.Top;
 168            case TextAlignMode.TamBottomLeft:
 1169                return TextAlignmentOptions.BottomLeft;
 170            case TextAlignMode.TamBottomRight:
 1171                return TextAlignmentOptions.BottomRight;
 172            case TextAlignMode.TamBottomCenter:
 0173                return TextAlignmentOptions.Bottom;
 174            case TextAlignMode.TamMiddleLeft:
 0175                return TextAlignmentOptions.Left;
 176            case TextAlignMode.TamMiddleCenter:
 17177                return TextAlignmentOptions.Center;
 178            case TextAlignMode.TamMiddleRight:
 0179                return TextAlignmentOptions.Right;
 180            default:
 0181                return TextAlignmentOptions.Center;
 182        }
 183    }
 184}