< Summary

Class:ScenesViewController
Assembly:BuilderProjectsPanel
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/BuilderInWorld/HUD/ProjectsPanelHUD/Scripts/ScenesController/ScenesViewController.cs
Covered lines:81
Uncovered lines:38
Coverable lines:119
Total lines:301
Line coverage:68% (81 of 119)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
ScenesViewController(...)0%110100%
SetScenes(...)0%12.6712083.33%
SelectScene(...)0%30500%
AddListener(...)0%2100%
AddListener(...)0%2100%
RemoveListener(...)0%2100%
RemoveListener(...)0%2100%
Dispose()0%3.013090.91%
SetScene(...)0%770100%
ChangeSceneDeployStatus(...)0%110100%
UpdateScene(...)0%110100%
CreateScene(...)0%110100%
RemoveScene(...)0%7.397080%
AddScene(...)0%8.098088.89%
CreateCardView()0%110100%
DestroyCardView(...)0%2100%
OnSceneSettingsPressed(...)0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/DCLPlugins/BuilderInWorld/HUD/ProjectsPanelHUD/Scripts/ScenesController/ScenesViewController.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using DCL.Builder;
 4using UnityEngine;
 5using Object = UnityEngine.Object;
 6
 7internal interface IScenesViewController : IDisposable
 8{
 9    event Action<Dictionary<string, ISceneCardView>> OnScenesSet;
 10    event Action<ISceneCardView> OnSceneAdded;
 11    event Action<ISceneCardView> OnSceneRemoved;
 12    event Action<Dictionary<string, ISceneCardView>> OnProjectScenesSet;
 13    event Action<ISceneCardView> OnProjectSceneAdded;
 14    event Action<ISceneCardView> OnProjectSceneRemoved;
 15    event Action<ISceneCardView> OnProjectSelected;
 16    event Action<Vector2Int> OnJumpInPressed;
 17    event Action<Vector2Int> OnEditorPressed;
 18    event Action<ISceneData, ISceneCardView> OnContextMenuPressed;
 19    event Action<string> OnRequestOpenUrl;
 20    void SetScenes(ISceneData[] scenesData);
 21    void SelectScene(string id);
 22    void AddListener(ISceneListener listener);
 23    void AddListener(ISelectSceneListener listener);
 24    void RemoveListener(ISceneListener listener);
 25    void RemoveListener(ISelectSceneListener listener);
 26}
 27
 28/// <summary>
 29/// This class is responsible for receiving a list of scenes and merge it with the previous list
 30/// discriminating deployed and project scenes and triggering events when a new set of scenes arrive or
 31/// when new scenes are added or removed.
 32/// It instantiate and hold all the SceneCardViews to make them re-utilizable in every menu section screen.
 33/// </summary>
 34internal class ScenesViewController : IScenesViewController
 35{
 36    public event Action<Dictionary<string, ISceneCardView>> OnScenesSet;
 37    public event Action<ISceneCardView> OnSceneAdded;
 38    public event Action<ISceneCardView> OnSceneRemoved;
 39    public event Action<Dictionary<string, ISceneCardView>> OnProjectScenesSet;
 40    public event Action<ISceneCardView> OnProjectSceneAdded;
 41    public event Action<ISceneCardView> OnProjectSceneRemoved;
 42    public event Action<ISceneCardView> OnProjectSelected;
 43    public event Action<Vector2Int> OnJumpInPressed;
 44    public event Action<Vector2Int> OnEditorPressed;
 45    public event Action<ISceneData, ISceneCardView> OnContextMenuPressed;
 46    public event Action<string> OnRequestOpenUrl;
 47
 148    private Dictionary<string, ISceneCardView> scenes = new Dictionary<string, ISceneCardView>();
 149    private Dictionary<string, ISceneCardView> projects = new Dictionary<string, ISceneCardView>();
 50
 51    private ISceneCardView selectedScene;
 52
 153    private readonly ScenesRefreshHelper scenesRefreshHelper = new ScenesRefreshHelper();
 54    private readonly SceneCardView sceneCardViewPrefab;
 55    private readonly Transform defaultParent;
 56
 57    /// <summary>
 58    /// Ctor
 59    /// </summary>
 60    /// <param name="sceneCardViewPrefab">prefab for scene's card</param>
 61    /// <param name="defaultParent">default parent for scene's card</param>
 162    public ScenesViewController(SceneCardView sceneCardViewPrefab, Transform defaultParent = null)
 63    {
 164        this.sceneCardViewPrefab = sceneCardViewPrefab;
 165        this.defaultParent = defaultParent;
 166    }
 67
 68    /// <summary>
 69    /// Set current user scenes (deployed and projects)
 70    /// </summary>
 71    /// <param name="scenesData">list of scenes</param>
 72    void IScenesViewController.SetScenes(ISceneData[] scenesData)
 73    {
 574        scenesRefreshHelper.Set(scenes, projects);
 75
 576        scenes = new Dictionary<string, ISceneCardView>();
 577        projects = new Dictionary<string, ISceneCardView>();
 78
 79        // update or create new scenes view
 2880        for (int i = 0; i < scenesData.Length; i++)
 81        {
 982            SetScene(scenesData[i]);
 83        }
 84
 85        // remove old deployed scenes
 586        if (scenesRefreshHelper.oldDeployedScenes != null)
 87        {
 588            using (var iterator = scenesRefreshHelper.oldDeployedScenes.GetEnumerator())
 89            {
 590                while (iterator.MoveNext())
 91                {
 092                    OnSceneRemoved?.Invoke(iterator.Current.Value);
 093                    DestroyCardView(iterator.Current.Value);
 94                }
 595            }
 96        }
 97
 98        // remove old project scenes
 599        if (scenesRefreshHelper.oldProjectsScenes != null)
 100        {
 5101            using (var iterator = scenesRefreshHelper.oldProjectsScenes.GetEnumerator())
 102            {
 5103                while (iterator.MoveNext())
 104                {
 0105                    OnProjectSceneRemoved?.Invoke(iterator.Current.Value);
 0106                    DestroyCardView(iterator.Current.Value);
 107                }
 5108            }
 109        }
 110
 111        // notify scenes set if needed
 5112        if (scenesRefreshHelper.isOldDeployedScenesEmpty)
 113        {
 1114            OnScenesSet?.Invoke(scenes);
 115        }
 116
 5117        if (scenesRefreshHelper.isOldProjectScenesEmpty)
 118        {
 3119            OnProjectScenesSet?.Invoke(projects);
 120        }
 2121    }
 122
 123    /// <summary>
 124    /// Set selected scene
 125    /// </summary>
 126    /// <param name="id">scene id</param>
 127    void IScenesViewController.SelectScene(string id)
 128    {
 0129        ISceneCardView sceneCardView = null;
 0130        if (scenes.TryGetValue(id, out ISceneCardView deployedSceneCardView))
 131        {
 0132            sceneCardView = deployedSceneCardView;
 0133        }
 0134        else if (projects.TryGetValue(id, out ISceneCardView projectSceneCardView))
 135        {
 0136            sceneCardView = projectSceneCardView;
 137        }
 138
 0139        selectedScene = sceneCardView;
 140
 0141        if (sceneCardView != null)
 142        {
 0143            OnProjectSelected?.Invoke(sceneCardView);
 144        }
 0145    }
 146
 147    void IScenesViewController.AddListener(ISceneListener listener)
 148    {
 0149        OnSceneAdded += listener.SceneAdded;
 0150        OnSceneRemoved += listener.SceneRemoved;
 0151        OnScenesSet += listener.SetScenes;
 0152        listener.SetScenes(scenes);
 0153    }
 154
 155    void IScenesViewController.AddListener(ISelectSceneListener listener)
 156    {
 0157        OnProjectSelected += listener.OnSelectScene;
 0158        listener.OnSelectScene(selectedScene);
 0159    }
 160
 161    void IScenesViewController.RemoveListener(ISceneListener listener)
 162    {
 0163        OnSceneAdded -= listener.SceneAdded;
 0164        OnSceneRemoved -= listener.SceneRemoved;
 0165        OnScenesSet -= listener.SetScenes;
 0166    }
 167
 0168    void IScenesViewController.RemoveListener(ISelectSceneListener listener) { OnProjectSelected -= listener.OnSelectSce
 169
 170    public void Dispose()
 171    {
 1172        using (var iterator = scenes.GetEnumerator())
 173        {
 1174            while (iterator.MoveNext())
 175            {
 0176                iterator.Current.Value.Dispose();
 177            }
 1178        }
 179
 1180        scenes.Clear();
 181
 1182        using (var iterator = projects.GetEnumerator())
 183        {
 3184            while (iterator.MoveNext())
 185            {
 2186                iterator.Current.Value.Dispose();
 187            }
 1188        }
 189
 1190        projects.Clear();
 1191    }
 192
 193    private void SetScene(ISceneData sceneData)
 194    {
 9195        bool shouldNotifyAdd = (sceneData.isDeployed && !scenesRefreshHelper.isOldDeployedScenesEmpty) ||
 196                               (!sceneData.isDeployed && !scenesRefreshHelper.isOldProjectScenesEmpty);
 197
 9198        if (scenesRefreshHelper.IsSceneDeployStatusChanged(sceneData))
 199        {
 2200            ChangeSceneDeployStatus(sceneData, shouldNotifyAdd);
 2201        }
 7202        else if (scenesRefreshHelper.IsSceneUpdate(sceneData))
 203        {
 5204            UpdateScene(sceneData);
 5205        }
 206        else
 207        {
 2208            CreateScene(sceneData, shouldNotifyAdd);
 209        }
 2210    }
 211
 212    private void ChangeSceneDeployStatus(ISceneData sceneData, bool shouldNotifyAdd)
 213    {
 2214        var cardView = RemoveScene(sceneData, true);
 2215        cardView.Setup(sceneData);
 2216        AddScene(sceneData, cardView, shouldNotifyAdd);
 2217    }
 218
 219    private void UpdateScene(ISceneData sceneData)
 220    {
 5221        var cardView = RemoveScene(sceneData, false);
 5222        cardView.Setup(sceneData);
 5223        AddScene(sceneData, cardView, false);
 5224    }
 225
 226    private void CreateScene(ISceneData sceneData, bool shouldNotifyAdd)
 227    {
 2228        var cardView = CreateCardView();
 2229        cardView.Setup(sceneData);
 2230        AddScene(sceneData, cardView, shouldNotifyAdd);
 2231    }
 232
 233    private ISceneCardView RemoveScene(ISceneData sceneData, bool notify)
 234    {
 7235        bool wasDeployed = scenesRefreshHelper.WasDeployedScene(sceneData);
 7236        var dictionary = wasDeployed ? scenesRefreshHelper.oldDeployedScenes : scenesRefreshHelper.oldProjectsScenes;
 237
 7238        if (dictionary.TryGetValue(sceneData.id, out ISceneCardView sceneCardView))
 239        {
 7240            dictionary.Remove(sceneData.id);
 241
 7242            if (notify)
 243            {
 2244                if (wasDeployed)
 2245                    OnSceneRemoved?.Invoke(sceneCardView);
 246                else
 0247                    OnProjectSceneRemoved?.Invoke(sceneCardView);
 248            }
 249
 7250            return sceneCardView;
 251        }
 252
 0253        return null;
 254    }
 255
 256    private void AddScene(ISceneData sceneData, ISceneCardView sceneCardView, bool notify)
 257    {
 9258        var dictionary = sceneData.isDeployed ? scenes : projects;
 9259        if (dictionary.ContainsKey(sceneData.id))
 0260            return;
 9261        dictionary.Add(sceneData.id, sceneCardView);
 262
 9263        if (notify)
 264        {
 2265            if (sceneData.isDeployed)
 1266                OnSceneAdded?.Invoke(sceneCardView);
 267            else
 1268                OnProjectSceneAdded?.Invoke(sceneCardView);
 269        }
 7270    }
 271
 272    private ISceneCardView CreateCardView()
 273    {
 2274        SceneCardView sceneCardView = Object.Instantiate(sceneCardViewPrefab);
 275        ISceneCardView view = sceneCardView;
 276
 2277        view.SetActive(false);
 2278        view.ConfigureDefaultParent(defaultParent);
 2279        view.SetToDefaultParent();
 280
 2281        view.OnEditorPressed += OnEditorPressed;
 2282        view.OnContextMenuPressed += OnContextMenuPressed;
 2283        view.OnJumpInPressed += OnJumpInPressed;
 2284        view.OnSettingsPressed += OnSceneSettingsPressed;
 285
 2286        return view;
 287    }
 288
 289    private void DestroyCardView(ISceneCardView sceneCardView)
 290    {
 291        // NOTE: there is actually no need to unsubscribe here, but, just in case...
 0292        sceneCardView.OnEditorPressed -= OnEditorPressed;
 0293        sceneCardView.OnContextMenuPressed -= OnContextMenuPressed;
 0294        sceneCardView.OnJumpInPressed -= OnJumpInPressed;
 0295        sceneCardView.OnSettingsPressed -= OnSceneSettingsPressed;
 296
 0297        sceneCardView.Dispose();
 0298    }
 299
 0300    private void OnSceneSettingsPressed(ISceneData sceneData) { OnRequestOpenUrl?.Invoke($"https://builder.decentraland.
 301}