< Summary

Class:DCL.Components.UIImage
Assembly:DCL.Components.UI
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/UI/UIImage/UIImage.cs
Covered lines:51
Uncovered lines:30
Coverable lines:81
Total lines:182
Line coverage:62.9% (51 of 81)
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
Model()0%110100%
GetDataFromJSON(...)0%110100%
GetDataFromPb(...)0%6002400%
UIImage()0%110100%
GetClassId()0%2100%
AttachTo(...)0%2100%
DetachFrom(...)0%2100%
ApplyChanges(...)0%660100%
ConfigureImage()0%550100%
ConfigureUVRect(...)0%440100%
Dispose()0%330100%

File(s)

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

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL.Helpers;
 3using DCL.Models;
 4using System.Collections;
 5using UnityEngine;
 6using Decentraland.Sdk.Ecs6;
 7using MainScripts.DCL.Components;
 8
 9namespace DCL.Components
 10{
 11    public class UIImage : UIShape<UIImageReferencesContainer, UIImage.Model>
 12    {
 13        [System.Serializable]
 14        public new class Model : UIShape.Model
 15        {
 16            public string source;
 17            public float sourceLeft = 0f;
 18            public float sourceTop = 0f;
 7619            public float sourceWidth = 1f;
 7620            public float sourceHeight = 1f;
 21            public float paddingTop = 0f;
 22            public float paddingRight = 0f;
 23            public float paddingBottom = 0f;
 24            public float paddingLeft = 0f;
 7625            public bool sizeInPixels = true;
 26
 27            public override BaseModel GetDataFromJSON(string json) =>
 2128                Utils.SafeFromJson<Model>(json);
 29
 30            public override BaseModel GetDataFromPb(ComponentBodyPayload pbModel)
 31            {
 032                if (pbModel.PayloadCase != ComponentBodyPayload.PayloadOneofCase.UiImage)
 033                    return Utils.SafeUnimplemented<UIImage, Model>(expected: ComponentBodyPayload.PayloadOneofCase.UiIma
 34
 035                var pb = new Model();
 036                if (pbModel.UiImage.HasName) pb.name = pbModel.UiImage.Name;
 037                if (pbModel.UiImage.HasParentComponent) pb.parentComponent = pbModel.UiImage.ParentComponent;
 038                if (pbModel.UiImage.HasVisible) pb.visible = pbModel.UiImage.Visible;
 039                if (pbModel.UiImage.HasOpacity) pb.opacity = pbModel.UiImage.Opacity;
 040                if (pbModel.UiImage.HasHAlign) pb.hAlign = pbModel.UiImage.HAlign;
 041                if (pbModel.UiImage.HasVAlign) pb.vAlign = pbModel.UiImage.VAlign;
 042                if (pbModel.UiImage.Width != null) pb.width = SDK6DataMapExtensions.FromProtobuf(pb.width, pbModel.UiIma
 043                if (pbModel.UiImage.Height != null) pb.height = SDK6DataMapExtensions.FromProtobuf(pb.height, pbModel.Ui
 044                if (pbModel.UiImage.PositionX != null) pb.positionX = SDK6DataMapExtensions.FromProtobuf(pb.positionX, p
 045                if (pbModel.UiImage.PositionY != null) pb.positionY = SDK6DataMapExtensions.FromProtobuf(pb.positionY, p
 046                if (pbModel.UiImage.HasIsPointerBlocker) pb.isPointerBlocker = pbModel.UiImage.IsPointerBlocker;
 47
 048                if (pbModel.UiImage.HasSource) pb.source = pbModel.UiImage.Source;
 049                if (pbModel.UiImage.HasSourceLeft) pb.sourceLeft = pbModel.UiImage.SourceLeft;
 050                if (pbModel.UiImage.HasSourceTop) pb.sourceTop = pbModel.UiImage.SourceTop;
 051                if (pbModel.UiImage.HasSourceWidth) pb.sourceWidth = pbModel.UiImage.SourceWidth;
 052                if (pbModel.UiImage.HasSourceHeight) pb.sourceHeight = pbModel.UiImage.SourceHeight;
 053                if (pbModel.UiImage.HasPaddingTop) pb.paddingTop = pbModel.UiImage.PaddingTop;
 054                if (pbModel.UiImage.HasPaddingRight) pb.paddingRight = pbModel.UiImage.PaddingRight;
 055                if (pbModel.UiImage.HasPaddingBottom) pb.paddingBottom = pbModel.UiImage.PaddingBottom;
 056                if (pbModel.UiImage.HasPaddingLeft) pb.paddingLeft = pbModel.UiImage.PaddingLeft;
 057                if (pbModel.UiImage.HasSizeInPixels) pb.sizeInPixels = pbModel.UiImage.SizeInPixels;
 58
 059                if (pbModel.UiImage.HasOnClick) pb.onClick = pbModel.UiImage.OnClick;
 60
 61
 062                return pb;
 63            }
 64        }
 65
 1766        public override string referencesContainerPrefabName => "UIImage";
 67
 68        DCLTexture dclTexture = null;
 1769        private readonly DCLTexture.Fetcher dclTextureFetcher = new DCLTexture.Fetcher();
 70        private bool isDisposed;
 71
 1772        public UIImage()
 73        {
 1774            model = new Model();
 1775        }
 76
 77        public override int GetClassId() =>
 078            (int) CLASS_ID.UI_IMAGE_SHAPE;
 79
 80        public override void AttachTo(IDCLEntity entity, System.Type overridenAttachedType = null) =>
 081            Debug.LogError("Aborted UIImageShape attachment to an entity. UIShapes shouldn't be attached to entities.");
 82
 083        public override void DetachFrom(IDCLEntity entity, System.Type overridenAttachedType = null) { }
 84
 85        public override IEnumerator ApplyChanges(BaseModel newModel)
 86        {
 87            // Fetch texture
 3788            if (!string.IsNullOrEmpty(model.source))
 89            {
 2190                if (dclTexture == null || (dclTexture != null && dclTexture.id != model.source))
 91                {
 1392                    dclTextureFetcher.Fetch(scene, model.source,
 93                                          fetchedDCLTexture =>
 94                                          {
 1295                                              if (isDisposed)
 096                                                  return false;
 97
 1298                                              referencesContainer.image.texture = fetchedDCLTexture.texture;
 1299                                              dclTexture?.DetachFrom(this);
 12100                                              dclTexture = fetchedDCLTexture;
 12101                                              dclTexture.AttachTo(this);
 102
 12103                                              ConfigureImage();
 12104                                              return true;
 105                                          })
 106                                     .Forget();
 107
 13108                    return null;
 109                }
 110            }
 111            else
 112            {
 16113                referencesContainer.image.texture = null;
 16114                dclTexture?.DetachFrom(this);
 16115                dclTexture = null;
 116            }
 117
 24118            ConfigureImage();
 24119            return null;
 120        }
 121
 122        private void ConfigureImage()
 123        {
 36124            RectTransform parentRecTransform = referencesContainer.GetComponentInParent<RectTransform>();
 125
 36126            ConfigureUVRect(parentRecTransform, dclTexture?.resizingFactor ?? 1);
 127
 36128            referencesContainer.image.enabled = model.visible;
 36129            referencesContainer.image.color = Color.white;
 130
 36131            ConfigureUVRect(parentRecTransform, dclTexture?.resizingFactor ?? 1);
 132
 133            // Apply padding
 36134            referencesContainer.paddingLayoutGroup.padding.bottom = Mathf.RoundToInt(model.paddingBottom);
 36135            referencesContainer.paddingLayoutGroup.padding.top = Mathf.RoundToInt(model.paddingTop);
 36136            referencesContainer.paddingLayoutGroup.padding.left = Mathf.RoundToInt(model.paddingLeft);
 36137            referencesContainer.paddingLayoutGroup.padding.right = Mathf.RoundToInt(model.paddingRight);
 138
 36139            Utils.ForceRebuildLayoutImmediate(parentRecTransform);
 36140        }
 141
 142        private void ConfigureUVRect(RectTransform parentRecTransform, float resizingFactor)
 143        {
 72144            if (referencesContainer.image.texture == null)
 32145                return;
 146
 147            // Configure uv rect
 40148            Vector2 normalizedSourceCoordinates = new Vector2(
 149                model.sourceLeft * resizingFactor / referencesContainer.image.texture.width,
 150                -model.sourceTop * resizingFactor / referencesContainer.image.texture.height);
 151
 40152            Vector2 normalizedSourceSize = new Vector2(
 153                model.sourceWidth * resizingFactor * (model.sizeInPixels ? 1f : parentRecTransform.rect.width) /
 154                referencesContainer.image.texture.width ,
 155                model.sourceHeight * resizingFactor * (model.sizeInPixels ? 1f : parentRecTransform.rect.height) /
 156                referencesContainer.image.texture.height);
 157
 40158            referencesContainer.image.uvRect = new Rect(normalizedSourceCoordinates.x,
 159                normalizedSourceCoordinates.y + (1 - normalizedSourceSize.y),
 160                normalizedSourceSize.x,
 161                normalizedSourceSize.y);
 40162        }
 163
 164        public override void Dispose()
 165        {
 2166            isDisposed = true;
 167
 2168            dclTextureFetcher.Dispose();
 169
 2170            dclTexture?.DetachFrom(this);
 171
 2172            if (referencesContainer != null)
 173            {
 2174                referencesContainer.image.texture = null;
 2175                Utils.SafeDestroy(referencesContainer.gameObject);
 2176                referencesContainer = null;
 177            }
 178
 2179            base.Dispose();
 2180        }
 181    }
 182}