< Summary

Class:ItemToggle
Assembly:AvatarEditorHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/AvatarEditorHUD/Scripts/ItemToggle.cs
Covered lines:37
Uncovered lines:27
Coverable lines:64
Total lines:151
Line coverage:57.8% (37 of 64)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ItemToggle()0%110100%
SetSelection(...)0%220100%
SetLoadingSpinner(...)0%220100%
Awake()0%2.022083.33%
OnClick()0%6200%
Initialize(...)0%220100%
OnPointerEnter(...)0%30500%
OnPointerExit(...)0%2100%
OnThumbnailReady(...)0%20400%
OnEnable()0%110100%
OnDisable()0%110100%
OnDestroy()0%110100%
CallOnSellClicked()0%6200%
GetThumbnail()0%6.176083.33%
ForgetThumbnail()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/AvatarEditorHUD/Scripts/ItemToggle.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using DCL;
 4using DCL.Configuration;
 5using TMPro;
 6using UnityEngine;
 7using UnityEngine.EventSystems;
 8using UnityEngine.UI;
 9
 10public class ItemToggle : UIButton, IPointerEnterHandler, IPointerExitHandler
 11{
 112    private static readonly int LOADING_ANIMATOR_TRIGGER_LOADED = Animator.StringToHash("Loaded");
 13
 14    public event System.Action<ItemToggle> OnClicked;
 15    public event System.Action<ItemToggle> OnSellClicked;
 16
 017    public WearableItem wearableItem { get; private set; }
 18
 19    public Image thumbnail;
 20    public Image selectionHighlight;
 21    [SerializeField] private GameObject warningPanel;
 22    [SerializeField] private GameObject loadingSpinner;
 23    [SerializeField] internal RectTransform amountContainer;
 24    [SerializeField] internal Animator loadingAnimator;
 25    [SerializeField] internal TextMeshProUGUI amountText;
 26
 27    private bool selectedValue;
 28
 29    private string loadedThumbnailURL;
 30    private AssetPromise_Texture loadedThumbnailPromise;
 31
 32    private AvatarEditorHUDView view;
 33
 34    //Todo change this for a confirmation popup or implement it in a more elegant way
 35    public static Func<WearableItem, List<WearableItem>> getEquippedWearablesReplacedByFunc;
 36
 37    public bool selected
 38    {
 039        get { return selectedValue; }
 40        set
 41        {
 729342            selectedValue = value;
 729343            SetSelection(selectedValue);
 729344        }
 45    }
 46
 47    protected virtual void SetSelection(bool isSelected)
 48    {
 729349        if (selectionHighlight != null)
 729350            selectionHighlight.enabled = isSelected;
 729351    }
 52
 265053    public void SetLoadingSpinner(bool isActive) { loadingSpinner?.SetActive(isActive); }
 54
 55    protected new virtual void Awake()
 56    {
 25457        base.Awake();
 25458        thumbnail.sprite = null;
 25459        warningPanel.SetActive(false);
 60
 25461        if (!EnvironmentSettings.RUNNING_TESTS)
 062            view = GetComponentInParent<AvatarEditorHUDView>();
 25463    }
 64
 65    protected override void OnClick()
 66    {
 067        OnClicked?.Invoke(this);
 068        warningPanel.SetActive(false);
 069    }
 70
 71    public virtual void Initialize(WearableItem w, bool isSelected, int amount)
 72    {
 358873        wearableItem = w;
 358874        selected = isSelected;
 358875        amountContainer.gameObject.SetActive(amount > 1);
 358876        amountText.text = $"x{amount.ToString()}";
 77
 358878        if (gameObject.activeInHierarchy)
 25479            GetThumbnail();
 358880    }
 81
 82    public void OnPointerEnter(PointerEventData eventData)
 83    {
 084        List<WearableItem> toReplace = getEquippedWearablesReplacedByFunc(wearableItem);
 085        if (wearableItem == null || toReplace.Count == 0)
 086            return;
 087        if (toReplace.Count == 1)
 88        {
 089            WearableItem w = toReplace[0];
 090            if (w.data.category == wearableItem.data.category)
 091                return;
 92        }
 93
 094        warningPanel.SetActive(true);
 095    }
 96
 097    public void OnPointerExit(PointerEventData eventData) { warningPanel.SetActive(false); }
 98
 99    private void OnThumbnailReady(Asset_Texture texture)
 100    {
 0101        loadingAnimator.SetTrigger(LOADING_ANIMATOR_TRIGGER_LOADED);
 102
 0103        if (thumbnail.sprite != null)
 0104            Destroy(thumbnail.sprite);
 105
 0106        thumbnail.sprite = ThumbnailsManager.CreateSpriteFromTexture(texture.texture);
 107
 0108        if (view != null)
 109        {
 0110            if (view.avatarEditorCanvas.enabled)
 0111                AudioScriptableObjects.listItemAppear.Play(true);
 112        }
 0113    }
 114
 508115    private void OnEnable() { GetThumbnail(); }
 116
 508117    private void OnDisable() { ForgetThumbnail(); }
 118
 508119    protected virtual void OnDestroy() { OnClicked = null; }
 120
 0121    protected void CallOnSellClicked() { OnSellClicked?.Invoke(this); }
 122
 123    private void GetThumbnail()
 124    {
 508125        string url = wearableItem?.ComposeThumbnailUrl();
 126
 508127        if (url == loadedThumbnailURL)
 128        {
 254129            loadingAnimator.SetTrigger(LOADING_ANIMATOR_TRIGGER_LOADED);
 254130            return;
 131        }
 132
 254133        if (wearableItem == null || string.IsNullOrEmpty(url))
 134        {
 0135            loadingAnimator.SetTrigger(LOADING_ANIMATOR_TRIGGER_LOADED);
 0136            return;
 137        }
 138
 254139        loadedThumbnailURL = url;
 254140        var newLoadedThumbnailPromise = ThumbnailsManager.GetThumbnail(url, OnThumbnailReady);
 254141        ThumbnailsManager.ForgetThumbnail(loadedThumbnailPromise);
 254142        loadedThumbnailPromise = newLoadedThumbnailPromise;
 254143    }
 144
 145    private void ForgetThumbnail()
 146    {
 254147        ThumbnailsManager.ForgetThumbnail(loadedThumbnailPromise);
 254148        loadedThumbnailURL = null;
 254149        loadedThumbnailPromise = null;
 254150    }
 151}