< Summary

Class:ProjectCardView
Assembly:BuilderProjectsPanel
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/BuilderInWorld/HUD/ProjectsPanelHUD/Scripts/Views/ProjectCardView.cs
Covered lines:101
Uncovered lines:24
Coverable lines:125
Total lines:375
Line coverage:80.8% (101 of 125)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ProjectCardView()0%110100%
ProjectCardView()0%110100%
get_projectData()0%2100%
get_searchInfo()0%110100%
get_contextMenuButtonPosition()0%2100%
Awake()0%110100%
OnDestroy()0%110100%
Dispose()0%220100%
Setup(...)0%110100%
SetScenes(...)0%550100%
ExpandButtonPressed()0%4.254075%
AddRectTransformHeight(...)0%110100%
ScenesVisiblitityChange(...)0%330100%
InstantiateScenesCards()0%220100%
EditorButtonClicked()0%220100%
SetThumbnail(...)0%9.855042.11%
SetThumbnail(...)0%220100%
SetParent(...)0%6200%
SetToDefaultParent()0%110100%
ConfigureDefaultParent(...)0%110100%
SetActive(...)0%110100%
SetSiblingIndex(...)0%2100%
SetName(...)0%110100%
SetSize(...)0%110100%
GetSizeText(...)0%110100%
ChangeHeightAnimation()0%4.024088.89%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/BuilderInWorld/HUD/ProjectsPanelHUD/Scripts/Views/ProjectCardView.cs

#LineLine coverage
 1using System;
 2using System.Collections;
 3using System.Collections.Generic;
 4using System.Configuration;
 5using DCL;
 6using DCL.Builder;
 7using DCL.Configuration;
 8using UnityEngine;
 9using DCL.Helpers;
 10using TMPro;
 11using UnityEngine.UI;
 12
 13internal interface IProjectCardView : IDisposable
 14{
 15    /// <summary>
 16    /// Edit project button pressed
 17    /// </summary>
 18    event Action<ProjectData> OnEditorPressed;
 19
 20    /// <summary>
 21    ///  Setting button pressed
 22    /// </summary>
 23    event Action<ProjectData> OnSettingsPressed;
 24
 25    /// <summary>
 26    /// Expand button pressed
 27    /// </summary>
 28    event Action OnExpandMenuPressed;
 29
 30    /// <summary>
 31    /// Data of the project card
 32    /// </summary>
 33    ProjectData projectData { get; }
 34
 35    /// <summary>
 36    /// Info for the search result
 37    /// </summary>
 38    ISearchInfo searchInfo { get; }
 39
 40    /// <summary>
 41    /// Position of the context menu button
 42    /// </summary>
 43    Vector3 contextMenuButtonPosition { get; }
 44
 45    /// <summary>
 46    /// Set the scenes of the project
 47    /// </summary>
 48    /// <param name="scenes"></param>
 49    void SetScenes(List<Scene> scenes);
 50
 51    /// <summary>
 52    /// This setup the project data
 53    /// </summary>
 54    /// <param name="projectData"></param>
 55    void Setup(ProjectData projectData);
 56
 57    /// <summary>
 58    /// Set Parent of the card
 59    /// </summary>
 60    /// <param name="parent"></param>
 61    void SetParent(Transform parent);
 62
 63    /// <summary>
 64    /// Reset to default parent
 65    /// </summary>
 66    void SetToDefaultParent();
 67
 68    /// <summary>
 69    /// Configure the default parent
 70    /// </summary>
 71    /// <param name="parent">default parent to apply</param>
 72    void ConfigureDefaultParent(Transform parent);
 73
 74    /// <summary>
 75    /// Active the card
 76    /// </summary>
 77    /// <param name="active"></param>
 78    void SetActive(bool active);
 79
 80    /// <summary>
 81    /// This set the order of the card
 82    /// </summary>
 83    /// <param name="index"></param>
 84    void SetSiblingIndex(int index);
 85
 86    void SetName(string name);
 87    void SetSize(int rows, int columns);
 88    void SetThumbnail(string thumbnailUrl, string filename);
 89    void SetThumbnail(Texture2D thumbnailTexture);
 90}
 91
 92internal class ProjectCardView : MonoBehaviour, IProjectCardView
 93{
 194    static readonly Vector3 CONTEXT_MENU_OFFSET = new Vector3(6.24f, 12f, 0);
 95
 96    internal const string NOT_PUBLISHED = "NOT PUBLISHED";
 97    internal const string PUBLISHED_IN = "PUBLISHED IN";
 98
 99    internal const float SCENE_CARD_SIZE = 84;
 100    internal const float SCENE_CARD_ITEM_PADDING = 18;
 101    internal const float SCENE_CARD_TOTAL_PADDING = 36;
 102
 103    public event Action<ProjectData> OnEditorPressed;
 104    public event Action<ProjectData> OnSettingsPressed;
 105    public event Action OnExpandMenuPressed;
 106
 107    [Header("Design Variables")]
 108
 8109    [SerializeField] private  float animationSpeed = 6f;
 110
 111    [Header("Project References")]
 112    [SerializeField] internal Color syncColor;
 113    [SerializeField] internal Color desyncColor;
 114    [SerializeField] private Texture2D defaultThumbnail;
 115    [SerializeField] private GameObject projectSceneCardViewPrefab;
 116
 117
 118    [Header("Prefab references")]
 119    [SerializeField] internal Image syncImage;
 120
 121    [SerializeField] internal Button contextMenuButton;
 122    [SerializeField] internal Button expandButton;
 123    [SerializeField] internal Button editorButton;
 124
 125    [SerializeField] internal RectTransform scenesContainer;
 126    [SerializeField] internal VerticalLayoutGroup layoutGroup;
 127
 128    [SerializeField] private GameObject loadingImgGameObject;
 129    [SerializeField] private GameObject publishedGameObject;
 130    [SerializeField] private RectTransform downButtonTransform;
 131    [SerializeField] internal TextMeshProUGUI projectNameTxt;
 132    [SerializeField] internal TextMeshProUGUI projectSizeTxt;
 133    [SerializeField] internal TextMeshProUGUI projectSyncTxt;
 134
 135    [Space]
 136    [SerializeField] private RawImageFillParent thumbnail;
 137
 0138    ProjectData IProjectCardView.projectData => projectData;
 30139    ISearchInfo IProjectCardView.searchInfo { get; } = new SearchInfo();
 0140    Vector3 IProjectCardView.contextMenuButtonPosition => contextMenuButton.transform.position + CONTEXT_MENU_OFFSET;
 141
 142    private ProjectData projectData;
 143    private ISearchInfo searchInfo;
 144    private Vector3 contextMenuButtonPosition;
 145
 146    private string thumbnailId = null;
 147    private Transform defaultParent;
 148    private AssetPromise_Texture thumbnailPromise;
 149    private bool scenesAreVisible = false;
 150    private bool isDestroyed = false;
 151
 152    private RectTransform rectTransform;
 153
 8154    internal List<Scene> scenesDeployedFromProject = new List<Scene>();
 8155    internal List<IProjectSceneCardView> sceneCardViews = new List<IProjectSceneCardView>();
 156
 157    private void Awake()
 158    {
 7159        editorButton.onClick.AddListener(EditorButtonClicked);
 7160        expandButton.onClick.AddListener(ExpandButtonPressed);
 7161        contextMenuButton.onClick.AddListener(EditorButtonClicked);
 162
 7163        rectTransform = GetComponent<RectTransform>();
 7164    }
 165
 166    private void OnDestroy()
 167    {
 7168        isDestroyed = true;
 7169        Dispose();
 7170    }
 171
 172    public void Dispose()
 173    {
 8174        AssetPromiseKeeper_Texture.i.Forget(thumbnailPromise);
 8175        editorButton.onClick.RemoveAllListeners();
 8176        if(!isDestroyed)
 1177            Destroy(gameObject);
 8178    }
 179
 180    public void Setup(ProjectData projectData)
 181    {
 7182        this.projectData = projectData;
 7183        SetName(projectData.title);
 7184        SetSize(projectData.rows,projectData.cols);
 185
 7186        SetThumbnail(projectData.id,projectData.thumbnail);
 187
 7188        ((IProjectCardView)this).searchInfo.SetId(projectData.id);
 7189    }
 190
 191    public void SetScenes(List<Scene> scenes)
 192    {
 4193        scenesDeployedFromProject = scenes;
 4194        publishedGameObject.gameObject.SetActive(true);
 4195        if (scenes.Count == 0)
 196        {
 1197            syncImage.enabled = false;
 1198            projectSyncTxt.text = NOT_PUBLISHED;
 1199            downButtonTransform.gameObject.SetActive(false);
 1200        }
 201        else
 202        {
 3203            downButtonTransform.gameObject.SetActive(true);
 3204            bool isSync = true;
 3205            long projectTimestamp = BIWUtils.ConvertToMilisecondsTimestamp(projectData.updated_at);
 11206            foreach (Scene scene in scenes)
 207            {
 3208                if (scene.deployTimestamp < projectTimestamp)
 209                {
 1210                    isSync = false;
 1211                    break;
 212                }
 213            }
 3214            if (isSync)
 2215                syncImage.color = syncColor;
 216            else
 1217                syncImage.color = desyncColor;
 218
 3219            projectSyncTxt.text = PUBLISHED_IN;
 220        }
 3221    }
 222
 223    internal void ExpandButtonPressed()
 224    {
 1225        if(scenesDeployedFromProject.Count == 0 )
 0226            return;
 227
 1228        downButtonTransform.Rotate(Vector3.forward,180);
 229
 1230        scenesAreVisible = !scenesAreVisible;
 1231        ScenesVisiblitityChange(scenesAreVisible);
 232
 1233        float amountToIncrease = sceneCardViews.Count * SCENE_CARD_SIZE + SCENE_CARD_TOTAL_PADDING + SCENE_CARD_ITEM_PAD
 234
 1235        if (scenesAreVisible)
 236        {
 1237            layoutGroup.padding.bottom = 18;
 1238            AddRectTransformHeight(rectTransform,amountToIncrease);
 1239            AddRectTransformHeight(scenesContainer,amountToIncrease);
 1240        }
 241        else
 242        {
 0243            layoutGroup.padding.bottom = 0;
 0244            AddRectTransformHeight(rectTransform, -amountToIncrease);
 0245            AddRectTransformHeight(scenesContainer, -amountToIncrease);
 246        }
 247
 1248        OnExpandMenuPressed?.Invoke();
 1249    }
 250
 251    private void AddRectTransformHeight(RectTransform rectTransform, float height)
 252    {
 2253        CoroutineStarter.Start(ChangeHeightAnimation(rectTransform, height));
 2254    }
 255
 256    private void ScenesVisiblitityChange(bool isVisible)
 257    {
 1258        if(sceneCardViews.Count == 0)
 1259            InstantiateScenesCards();
 260
 4261        foreach (IProjectSceneCardView scene in sceneCardViews)
 262        {
 1263            scene.SetActive(isVisible);
 264        }
 1265    }
 266
 267    private void InstantiateScenesCards()
 268    {
 1269        long projectTimestamp = BIWUtils.ConvertToMilisecondsTimestamp(projectData.updated_at);
 4270        foreach (Scene scene in scenesDeployedFromProject)
 271        {
 1272            bool isSync = scene.deployTimestamp < projectTimestamp;
 273
 1274            IProjectSceneCardView cardView = Instantiate(projectSceneCardViewPrefab, scenesContainer).GetComponent<Proje
 1275            cardView.Setup(scene,isSync);
 1276            sceneCardViews.Add(cardView);
 277        }
 1278    }
 279
 280    internal void EditorButtonClicked()
 281    {
 1282        OnEditorPressed?.Invoke(projectData);
 1283    }
 284
 285    public void SetThumbnail(string thumbnailId,string thumbnailEndpoint)
 286    {
 7287        if (this.thumbnailId == thumbnailId)
 0288            return;
 289
 7290        string projectThumbnailUrl = "";
 7291        if (!string.IsNullOrEmpty(thumbnailId))
 292        {
 0293            projectThumbnailUrl = BIWUrlUtils.GetBuilderProjecThumbnailUrl(thumbnailId,thumbnailEndpoint);
 294        }
 295
 7296        this.thumbnailId = thumbnailId;
 297
 7298        if (thumbnailPromise != null)
 299        {
 0300            AssetPromiseKeeper_Texture.i.Forget(thumbnailPromise);
 0301            thumbnailPromise = null;
 302        }
 303
 7304        if (string.IsNullOrEmpty(projectThumbnailUrl))
 305        {
 7306            SetThumbnail((Texture2D) null);
 7307            return;
 308        }
 309
 0310        thumbnailPromise = new AssetPromise_Texture(projectThumbnailUrl);
 0311        thumbnailPromise.OnSuccessEvent += texture => SetThumbnail(texture.texture);
 0312        thumbnailPromise.OnFailEvent += texture => SetThumbnail((Texture2D) null);
 313
 0314        loadingImgGameObject.SetActive(true);
 0315        thumbnail.enabled = false;
 0316        AssetPromiseKeeper_Texture.i.Keep(thumbnailPromise);
 0317    }
 318
 319    public void SetThumbnail(Texture2D thumbnailTexture)
 320    {
 7321        loadingImgGameObject.SetActive(false);
 7322        thumbnail.texture = thumbnailTexture ?? defaultThumbnail;
 7323        thumbnail.enabled = true;
 7324    }
 325
 326    public void SetParent(Transform parent)
 327    {
 0328        if (transform.parent == parent)
 0329            return;
 330
 0331        transform.SetParent(parent);
 0332        transform.ResetLocalTRS();
 0333    }
 334
 2335    public void SetToDefaultParent() { transform.SetParent(defaultParent); }
 336
 2337    public void ConfigureDefaultParent(Transform parent) { defaultParent = parent; }
 338
 2339    public void SetActive(bool active) { gameObject.SetActive(active); }
 340
 0341    public void SetSiblingIndex(int index) { transform.SetSiblingIndex(index); }
 342
 343    public void SetName(string name)
 344    {
 7345        projectNameTxt.text = name;
 7346        ((IProjectCardView)this).searchInfo.SetName(name);
 7347    }
 348
 349    public void SetSize(int rows, int columns)
 350    {
 7351        projectSizeTxt.text = GetSizeText(rows,columns);
 7352        ((IProjectCardView)this).searchInfo.SetSize(rows * columns);
 7353    }
 354
 355    internal string GetSizeText(int rows, int columns)
 356    {
 8357        return (rows * ParcelSettings.PARCEL_SIZE) + "x" + (columns * ParcelSettings.PARCEL_SIZE)  + "m";
 358    }
 359
 360    IEnumerator ChangeHeightAnimation(RectTransform rectTransform, float height)
 361    {
 2362        float time = 0;
 363
 2364        Vector2 rect2 = rectTransform.sizeDelta;
 2365        float objective  = rect2.y + height;
 366
 4367        while (time < 1)
 368        {
 4369            time += Time.deltaTime * animationSpeed/scenesDeployedFromProject.Count;
 4370            rect2.y = Mathf.Lerp(rect2.y,objective,time);
 4371            rectTransform.sizeDelta = rect2;
 2372            yield return null;
 373        }
 0374    }
 375}