< 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:12
Coverable lines:78
Total lines:162
Line coverage:84.6% (66 of 78)
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%7.914037.5%
SetOutline(...)0%3.013088.89%
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 TMPro;
 8using UnityEngine;
 9using Vector2 = UnityEngine.Vector2;
 10
 11public class ECSTextShapeComponentHandler : IECSComponentHandler<PBTextShape>
 12{
 113    private static readonly int UNDERLAY_COLOR_SHADER_PROP = Shader.PropertyToID("_UnderlayColor");
 114    private static readonly int UNDERLAY_SOFTNESS_SHADER_PROP = Shader.PropertyToID("_UnderlaySoftness");
 15
 16    private readonly AssetPromiseKeeper_Font fontPromiseKeeper;
 17    private readonly IInternalECSComponent<InternalRenderers> renderersInternalComponent;
 18
 19    internal TextMeshPro textComponent;
 20    private GameObject textGameObject;
 21    private RectTransform rectTransform;
 22    private Renderer textRenderer;
 23
 24    internal AssetPromise_Font fontPromise;
 25
 26    private PBTextShape currentModel;
 27
 2228    public ECSTextShapeComponentHandler(AssetPromiseKeeper_Font fontPromiseKeeper, IInternalECSComponent<InternalRendere
 29    {
 2230        this.fontPromiseKeeper = fontPromiseKeeper;
 2231        this.renderersInternalComponent = renderersInternalComponent;
 2232    }
 33
 34    public void OnComponentCreated(IParcelScene scene, IDCLEntity entity)
 35    {
 2236        textGameObject = new GameObject("TextShape");
 37
 2238        textRenderer = textGameObject.AddComponent<MeshRenderer>();
 2239        rectTransform = textGameObject.AddComponent<RectTransform>();
 2240        textComponent = textGameObject.AddComponent<TextMeshPro>();
 2241        rectTransform.SetParent(entity.gameObject.transform, false);
 2242        rectTransform.localRotation = Quaternion.Euler(0, 180, 0);
 43
 2244        textComponent.text = string.Empty;
 2245        textComponent.richText = true;
 2246        textComponent.overflowMode = TextOverflowModes.Overflow;
 2247        renderersInternalComponent.AddRenderer(scene, entity, textRenderer);
 2248    }
 49
 50    public void OnComponentRemoved(IParcelScene scene, IDCLEntity entity)
 51    {
 2452        renderersInternalComponent.RemoveRenderer(scene, entity, textRenderer);
 2453        fontPromiseKeeper.Forget(fontPromise);
 54
 2455        Object.Destroy(textGameObject);
 2456    }
 57
 58    public void OnComponentModelUpdated(IParcelScene scene, IDCLEntity entity, PBTextShape model)
 59    {
 2260        if (model.Equals(currentModel))
 061            return;
 62
 2263        currentModel = model;
 64
 2265        SetRectTransform(rectTransform, model.GetTextWrapping() ? new Vector2(model.GetWidth(), model.GetHeight()) : Vec
 66
 2267        textComponent.text = model.Text;
 68
 2269        var color = model.GetTextColor().ToUnityColor();
 2270        textComponent.color = color;
 71
 2272        textComponent.fontSize = model.GetFontSize();
 2273        textComponent.enableAutoSizing = model.GetFontAutoSize();
 2274        textComponent.margin = model.GetPadding();
 2275        textComponent.alignment = GetAlignment(model.GetTextAlign());
 2276        textComponent.lineSpacing = model.GetLineSpacing();
 2277        textComponent.maxVisibleLines = model.GetLineCount() != 0 ? Mathf.Max(model.GetLineCount(), 1) : int.MaxValue;
 2278        textComponent.textWrappingMode = model.GetTextWrapping() && !model.GetFontAutoSize() ? TextWrappingModes.Normal 
 79
 2280        var prevPromise = fontPromise;
 2281        fontPromise = new AssetPromise_Font(model.GetFont().ToFontName());
 2282        fontPromise.OnSuccessEvent += assetFont =>
 83        {
 384            textComponent.font = assetFont.font;
 385            SetShadow(textComponent.fontSharedMaterial, model.GetShadowOffsetX(), model.GetShadowOffsetY(), model.GetSha
 386            SetOutline(textComponent, model.GetOutlineWidth(), model.GetOutlineColor());
 387        };
 2288        fontPromiseKeeper.Keep(fontPromise);
 2289        fontPromiseKeeper.Forget(prevPromise);
 2290    }
 91
 92    private static void SetRectTransform(RectTransform rectTransform, Vector2 sizeDelta)
 93    {
 2294        rectTransform.anchorMin = Vector2.zero;
 2295        rectTransform.anchorMax = Vector2.one;
 2296        rectTransform.offsetMin = Vector2.zero;
 2297        rectTransform.offsetMax = Vector2.zero;
 2298        rectTransform.sizeDelta = sizeDelta;
 2299    }
 100
 101    private static void SetShadow(Material fontMaterial, float shadowOffsetX, float shadowOffsetY,
 102        float shadowBlur, Color3 shadowColor)
 103    {
 104        const string UNDERLAY_ON_KERYWORD = "UNDERLAY_ON";
 105
 3106        if (shadowOffsetX != 0 || shadowOffsetY != 0)
 107        {
 0108            fontMaterial.EnableKeyword(UNDERLAY_ON_KERYWORD);
 0109            fontMaterial.SetColor(UNDERLAY_COLOR_SHADER_PROP, shadowColor.ToUnityColor());
 0110            fontMaterial.SetFloat(UNDERLAY_SOFTNESS_SHADER_PROP, shadowBlur);
 0111        }
 3112        else if (fontMaterial.IsKeywordEnabled(UNDERLAY_ON_KERYWORD))
 113        {
 0114            fontMaterial.DisableKeyword(UNDERLAY_ON_KERYWORD);
 115        }
 3116    }
 117
 118    private static void SetOutline(TextMeshPro textComponent, float outlineWidth, Color3 outlineColor)
 119    {
 120        const string OUTLINE_ON_KERYWORD = "OUTLINE_ON";
 121
 3122        Material fontSharedMaterial = textComponent.fontSharedMaterial;
 123
 3124        if (outlineWidth > 0f)
 125        {
 1126            fontSharedMaterial.EnableKeyword(OUTLINE_ON_KERYWORD);
 1127            textComponent.outlineWidth = outlineWidth;
 1128            textComponent.outlineColor = outlineColor.ToUnityColor();
 1129        }
 2130        else if (fontSharedMaterial.IsKeywordEnabled(OUTLINE_ON_KERYWORD))
 131        {
 0132            fontSharedMaterial.DisableKeyword(OUTLINE_ON_KERYWORD);
 133        }
 2134    }
 135
 136    private static TextAlignmentOptions GetAlignment(TextAlignMode value)
 137    {
 138        switch (value)
 139        {
 140            case TextAlignMode.TamTopLeft:
 1141                return TextAlignmentOptions.TopLeft;
 142            case TextAlignMode.TamTopRight:
 1143                return TextAlignmentOptions.TopRight;
 144            case TextAlignMode.TamTopCenter:
 0145                return TextAlignmentOptions.Top;
 146            case TextAlignMode.TamBottomLeft:
 1147                return TextAlignmentOptions.BottomLeft;
 148            case TextAlignMode.TamBottomRight:
 1149                return TextAlignmentOptions.BottomRight;
 150            case TextAlignMode.TamBottomCenter:
 0151                return TextAlignmentOptions.Bottom;
 152            case TextAlignMode.TamMiddleLeft:
 0153                return TextAlignmentOptions.Left;
 154            case TextAlignMode.TamMiddleCenter:
 18155                return TextAlignmentOptions.Center;
 156            case TextAlignMode.TamMiddleRight:
 0157                return TextAlignmentOptions.Right;
 158            default:
 0159                return TextAlignmentOptions.Center;
 160        }
 161    }
 162}