< Summary

Class:ImageComponentView
Assembly:UIComponents
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/UIComponents/Scripts/Components/Image/ImageComponentView.cs
Covered lines:92
Uncovered lines:8
Coverable lines:100
Total lines:257
Line coverage:92% (92 of 100)
Covered branches:0
Total branches:0
Covered methods:19
Total methods:19
Method coverage:100% (19 of 19)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ImageComponentView()0%110100%
Start()0%110100%
LateUpdate()0%330100%
Configure(...)0%110100%
RefreshControl()0%5.515072.73%
Dispose()0%110100%
DestroyInterntally(...)0%110100%
SetImage(...)0%3.023087.5%
SetImage(...)0%3.073080%
SetImage(...)0%6.136084.62%
SetLastUriRequestCached(...)0%110100%
SetFitParent(...)0%220100%
SetLoadingIndicatorVisible(...)0%110100%
OnImageObserverUpdated(...)0%440100%
ResizeFillParent()0%770100%
HasParentSizeChanged()0%330100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/UIComponents/Scripts/Components/Image/ImageComponentView.cs

#LineLine coverage
 1using DCL.Helpers;
 2using MainScripts.DCL.Helpers.Utils;
 3using System;
 4using UnityEngine;
 5using UnityEngine.UI;
 6using Object = UnityEngine.Object;
 7
 8public interface IImageComponentView
 9{
 10    /// <summary>
 11    /// It will be triggered when the sprite has been loaded.
 12    /// </summary>
 13    event Action<Sprite> OnLoaded;
 14
 15    /// <summary>
 16    /// Set an image directly from a sprite.
 17    /// </summary>
 18    /// <param name="sprite">A sprite.</param>
 19    void SetImage(Sprite sprite, bool cleanLastLoadedUri = true);
 20
 21    /// <summary>
 22    /// Set an image from a 2D texture,
 23    /// </summary>
 24    /// <param name="texture">2D texture.</param>
 25    void SetImage(Texture2D texture);
 26
 27    /// <summary>
 28    /// Set an image from an uri.
 29    /// </summary>
 30    /// <param name="uri">Url of the image.</param>
 31    void SetImage(string uri);
 32
 33    /// <summary>
 34    /// Indicates if we want to cache the last uri request.
 35    /// </summary>
 36    /// <param name="isEnabled">True for caching the last uri request.</param>
 37    void SetLastUriRequestCached(bool isEnabled);
 38
 39    /// <summary>
 40    /// Resize the image size to fit into the parent.
 41    /// </summary>
 42    /// <param name="fitParent">True to fit the size.</param>
 43    void SetFitParent(bool fitParent);
 44
 45    /// <summary>
 46    /// Active or deactive the loading indicator.
 47    /// </summary>
 48    /// <param name="isVisible">True for showing the loading indicator and hiding the image.</param>
 49    void SetLoadingIndicatorVisible(bool isVisible);
 50}
 51
 52public class ImageComponentView : BaseComponentView, IImageComponentView, IComponentModelConfig<ImageComponentModel>
 53{
 54    [Header("Prefab References")]
 55    [SerializeField] internal Image image;
 56    [SerializeField] internal GameObject loadingIndicator;
 57
 58    [Header("Configuration")]
 59    [SerializeField] internal ImageComponentModel model;
 60
 61    public event Action<Sprite> OnLoaded;
 62
 63    internal Sprite currentSprite;
 380764    internal ILazyTextureObserver imageObserver = new LazyTextureObserver();
 65    internal Vector2 lastParentSize;
 66    internal string currentUriLoading = null;
 67    internal string lastLoadedUri = null;
 68
 11769    public Image ImageComponent => image;
 391670    public bool UseLoadingIndicator { get; set; } = true;
 71
 72    public void Start()
 73    {
 50174        image.useSpriteMesh = false;
 50175        imageObserver.AddListener(OnImageObserverUpdated);
 50176    }
 77
 78    private void LateUpdate()
 79    {
 242880        if (model.fitParent && HasParentSizeChanged())
 14281            SetFitParent(model.fitParent);
 242882    }
 83
 84    public virtual void Configure(ImageComponentModel newModel)
 85    {
 4386        model = newModel;
 4387        RefreshControl();
 4388    }
 89
 90    public override void RefreshControl()
 91    {
 4392        if (model == null)
 093            return;
 94
 4395        SetLastUriRequestCached(model.lastUriCached);
 4396        if (model.sprite != null)
 197            SetImage(model.sprite);
 4298        else if (model.texture != null)
 099            SetImage(model.texture);
 42100        else if (!string.IsNullOrEmpty(model.uri))
 0101            SetImage(model.uri);
 102        else
 42103            SetImage(sprite: null);
 42104    }
 105
 106    public override void Dispose()
 107    {
 4324108        currentUriLoading = null;
 4324109        lastLoadedUri = null;
 4324110        imageObserver.RemoveListener(OnImageObserverUpdated);
 111
 4324112        DestroyInterntally(currentSprite);
 113
 4324114        base.Dispose();
 4324115    }
 116
 117    private static void DestroyInterntally(Object obj)
 118    {
 119#if UNITY_EDITOR
 4363120        DestroyImmediate(obj);
 121#else
 122        Destroy(obj);
 123#endif
 4363124    }
 125
 126    public void SetImage(Sprite sprite, bool cleanLastLoadedUri = true)
 127    {
 176128        model.sprite = sprite;
 129
 176130        if (image == null)
 0131            return;
 132
 176133        image.sprite = sprite;
 134
 176135        if (cleanLastLoadedUri)
 137136            lastLoadedUri = null;
 137
 176138        SetFitParent(model.fitParent);
 176139    }
 140
 141    public void SetImage(Texture2D texture)
 142    {
 27143        model.texture = texture;
 144
 27145        if (!Application.isPlaying)
 146        {
 0147            OnImageObserverUpdated(texture);
 0148            return;
 149        }
 150
 27151        if (UseLoadingIndicator)
 27152            SetLoadingIndicatorVisible(true);
 153
 27154        imageObserver.RefreshWithTexture(texture);
 155
 27156        lastLoadedUri = null;
 27157        SetFitParent(model.fitParent);
 27158    }
 159
 160    public virtual void SetImage(string uri)
 161    {
 82162        if (model.lastUriCached && uri == lastLoadedUri)
 0163            return;
 164
 82165        model.uri = uri;
 166
 82167        if (!Application.isPlaying)
 0168            return;
 169
 82170        if (UseLoadingIndicator)
 82171            SetLoadingIndicatorVisible(true);
 172
 82173        if (!string.IsNullOrEmpty(uri))
 174        {
 52175            currentUriLoading = uri;
 52176            imageObserver.RefreshWithUri(uri);
 177        }
 178        else
 179        {
 30180            lastLoadedUri = null;
 30181            OnImageObserverUpdated(null);
 182        }
 30183    }
 184
 86185    public void SetLastUriRequestCached(bool isEnabled) { model.lastUriCached = isEnabled; }
 186
 187    public void SetFitParent(bool fitParent)
 188    {
 347189        model.fitParent = fitParent;
 190
 347191        if (fitParent)
 211192            ResizeFillParent();
 347193    }
 194
 195    public void SetLoadingIndicatorVisible(bool isVisible)
 196    {
 174197        image.enabled = !isVisible;
 174198        loadingIndicator.SetActive(isVisible);
 174199    }
 200
 201    internal void OnImageObserverUpdated(Texture2D texture)
 202    {
 39203        DestroyInterntally(currentSprite);
 204
 39205        currentSprite = texture != null ? Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2E
 206
 39207        SetImage(currentSprite, false);
 39208        SetLoadingIndicatorVisible(false);
 39209        lastLoadedUri = currentUriLoading;
 39210        currentUriLoading = null;
 39211        OnLoaded?.Invoke(currentSprite);
 1212    }
 213
 214    internal void ResizeFillParent()
 215    {
 211216        RectTransform imageRectTransform = (RectTransform)image.transform;
 217
 211218        imageRectTransform.anchorMin = Vector2Ext.OneHalf;
 211219        imageRectTransform.anchorMax = Vector2Ext.OneHalf;
 211220        imageRectTransform.pivot = Vector2Ext.OneHalf;
 211221        imageRectTransform.localPosition = Vector2.zero;
 222
 211223        if (transform.parent == null)
 1224            return;
 225
 210226        RectTransform parent = transform.parent as RectTransform;
 227
 228        float h, w;
 210229        h = parent.rect.height;
 210230        w = h * (image.mainTexture != null ? (image.mainTexture.width / (float)image.mainTexture.height) : 1);
 231
 210232        if ((parent.rect.width - w) > 0)
 233        {
 153234            w = parent.rect.width;
 153235            h = w * (image.mainTexture != null ? (image.mainTexture.height / (float)image.mainTexture.width) : 1);
 236        }
 237
 210238        imageRectTransform.sizeDelta = new Vector2(w, h);
 210239    }
 240
 241    internal bool HasParentSizeChanged()
 242    {
 394243        Transform imageParent = transform.parent;
 394244        if (imageParent != null)
 245        {
 394246            Vector2 currentParentSize = ((RectTransform)imageParent).rect.size;
 247
 394248            if (lastParentSize != currentParentSize)
 249            {
 142250                lastParentSize = currentParentSize;
 142251                return true;
 252            }
 253        }
 254
 252255        return false;
 256    }
 257}