< Summary

Class:ImageComponentView
Assembly:UIComponents
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/UIComponents/Scripts/Components/Image/ImageComponentView.cs
Covered lines:89
Uncovered lines:8
Coverable lines:97
Total lines:251
Line coverage:91.7% (89 of 97)
Covered branches:0
Total branches:0

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%2.042077.78%
SetImage(...)0%5.125083.33%
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 System;
 3using UnityEngine;
 4using UnityEngine.UI;
 5using Object = UnityEngine.Object;
 6
 7public interface IImageComponentView
 8{
 9    /// <summary>
 10    /// It will be triggered when the sprite has been loaded.
 11    /// </summary>
 12    event Action<Sprite> OnLoaded;
 13
 14    /// <summary>
 15    /// Set an image directly from a sprite.
 16    /// </summary>
 17    /// <param name="sprite">A sprite.</param>
 18    void SetImage(Sprite sprite, bool cleanLastLoadedUri = true);
 19
 20    /// <summary>
 21    /// Set an image from a 2D texture,
 22    /// </summary>
 23    /// <param name="texture">2D texture.</param>
 24    void SetImage(Texture2D texture);
 25
 26    /// <summary>
 27    /// Set an image from an uri.
 28    /// </summary>
 29    /// <param name="uri">Url of the image.</param>
 30    void SetImage(string uri);
 31
 32    /// <summary>
 33    /// Indicates if we want to cache the last uri request.
 34    /// </summary>
 35    /// <param name="isEnabled">True for caching the last uri request.</param>
 36    void SetLastUriRequestCached(bool isEnabled);
 37
 38    /// <summary>
 39    /// Resize the image size to fit into the parent.
 40    /// </summary>
 41    /// <param name="fitParent">True to fit the size.</param>
 42    void SetFitParent(bool fitParent);
 43
 44    /// <summary>
 45    /// Active or deactive the loading indicator.
 46    /// </summary>
 47    /// <param name="isVisible">True for showing the loading indicator and hiding the image.</param>
 48    void SetLoadingIndicatorVisible(bool isVisible);
 49}
 50
 51public class ImageComponentView : BaseComponentView, IImageComponentView, IComponentModelConfig<ImageComponentModel>
 52{
 331753    private readonly Vector2 vector2oneHalf = new Vector2(0.5f, 0.5f);
 54
 55    [Header("Prefab References")]
 56    [SerializeField] internal Image image;
 57    [SerializeField] internal GameObject loadingIndicator;
 58
 59    [Header("Configuration")]
 60    [SerializeField] internal ImageComponentModel model;
 61
 62    public event Action<Sprite> OnLoaded;
 63
 64    internal Sprite currentSprite;
 331765    internal ILazyTextureObserver imageObserver = new LazyTextureObserver();
 66    internal Vector2 lastParentSize;
 67    internal string currentUriLoading = null;
 68    internal string lastLoadedUri = null;
 69
 70    public override void Start()
 71    {
 62672        image.useSpriteMesh = false;
 62673        imageObserver.AddListener(OnImageObserverUpdated);
 62674    }
 75
 76    private void LateUpdate()
 77    {
 87278        if (model.fitParent && HasParentSizeChanged())
 29579            SetFitParent(model.fitParent);
 87280    }
 81
 82    public virtual void Configure(ImageComponentModel newModel)
 83    {
 4384        model = newModel;
 4385        RefreshControl();
 4386    }
 87
 88    public override void RefreshControl()
 89    {
 4390        if (model == null)
 091            return;
 92
 4393        SetLastUriRequestCached(model.lastUriCached);
 4394        if (model.sprite != null)
 195            SetImage(model.sprite);
 4296        else if (model.texture != null)
 097            SetImage(model.texture);
 4298        else if (!string.IsNullOrEmpty(model.uri))
 099            SetImage(model.uri);
 100        else
 42101            SetImage(sprite: null);
 42102    }
 103
 104    public override void Dispose()
 105    {
 5422106        currentUriLoading = null;
 5422107        lastLoadedUri = null;
 5422108        imageObserver.RemoveListener(OnImageObserverUpdated);
 109
 5422110        DestroyInterntally(currentSprite);
 111
 5422112        base.Dispose();
 5422113    }
 114
 115    private static void DestroyInterntally(Object obj)
 116    {
 117#if UNITY_EDITOR
 5442118        DestroyImmediate(obj);
 119#else
 120        Destroy(obj);
 121#endif
 5442122    }
 123
 124    public void SetImage(Sprite sprite, bool cleanLastLoadedUri = true)
 125    {
 3973126        model.sprite = sprite;
 127
 3973128        if (image == null)
 0129            return;
 130
 3973131        image.sprite = sprite;
 132
 3973133        if (cleanLastLoadedUri)
 3953134            lastLoadedUri = null;
 135
 3973136        SetFitParent(model.fitParent);
 3973137    }
 138
 139    public void SetImage(Texture2D texture)
 140    {
 5141        model.texture = texture;
 142
 5143        if (!Application.isPlaying)
 144        {
 0145            OnImageObserverUpdated(texture);
 0146            return;
 147        }
 148
 5149        SetLoadingIndicatorVisible(true);
 5150        imageObserver.RefreshWithTexture(texture);
 151
 5152        lastLoadedUri = null;
 5153        SetFitParent(model.fitParent);
 5154    }
 155
 156    public virtual void SetImage(string uri)
 157    {
 38158        if (model.lastUriCached && uri == lastLoadedUri)
 0159            return;
 160
 38161        model.uri = uri;
 162
 38163        if (!Application.isPlaying)
 0164            return;
 165
 38166        SetLoadingIndicatorVisible(true);
 38167        if (!string.IsNullOrEmpty(uri))
 168        {
 19169            currentUriLoading = uri;
 19170            imageObserver.RefreshWithUri(uri);
 171        }
 172        else
 173        {
 19174            lastLoadedUri = null;
 19175            OnImageObserverUpdated(null);
 176        }
 19177    }
 178
 86179    public void SetLastUriRequestCached(bool isEnabled) { model.lastUriCached = isEnabled; }
 180
 181    public void SetFitParent(bool fitParent)
 182    {
 4275183        model.fitParent = fitParent;
 184
 4275185        if (fitParent)
 370186            ResizeFillParent();
 4275187    }
 188
 189    public void SetLoadingIndicatorVisible(bool isVisible)
 190    {
 68191        image.enabled = !isVisible;
 68192        loadingIndicator.SetActive(isVisible);
 68193    }
 194
 195    internal void OnImageObserverUpdated(Texture2D texture)
 196    {
 20197        DestroyInterntally(currentSprite);
 198
 20199        currentSprite = texture != null ? Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), vector2o
 200
 20201        SetImage(currentSprite, false);
 20202        SetLoadingIndicatorVisible(false);
 20203        lastLoadedUri = currentUriLoading;
 20204        currentUriLoading = null;
 20205        OnLoaded?.Invoke(currentSprite);
 1206    }
 207
 208    internal void ResizeFillParent()
 209    {
 370210        RectTransform imageRectTransform = (RectTransform)image.transform;
 211
 370212        imageRectTransform.anchorMin = vector2oneHalf;
 370213        imageRectTransform.anchorMax = vector2oneHalf;
 370214        imageRectTransform.pivot = vector2oneHalf;
 370215        imageRectTransform.localPosition = Vector2.zero;
 216
 370217        if (transform.parent == null)
 1218            return;
 219
 369220        RectTransform parent = transform.parent as RectTransform;
 221
 222        float h, w;
 369223        h = parent.rect.height;
 369224        w = h * (image.mainTexture != null ? (image.mainTexture.width / (float)image.mainTexture.height) : 1);
 225
 369226        if ((parent.rect.width - w) > 0)
 227        {
 247228            w = parent.rect.width;
 247229            h = w * (image.mainTexture != null ? (image.mainTexture.height / (float)image.mainTexture.width) : 1);
 230        }
 231
 369232        imageRectTransform.sizeDelta = new Vector2(w, h);
 369233    }
 234
 235    internal bool HasParentSizeChanged()
 236    {
 461237        Transform imageParent = transform.parent;
 461238        if (imageParent != null)
 239        {
 461240            Vector2 currentParentSize = ((RectTransform)imageParent).rect.size;
 241
 461242            if (lastParentSize != currentParentSize)
 243            {
 295244                lastParentSize = currentParentSize;
 295245                return true;
 246            }
 247        }
 248
 166249        return false;
 250    }
 251}