< Summary

Class:TaskbarHUDView
Assembly:TaskbarHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/TaskbarHUD/TaskbarHUDView.cs
Covered lines:187
Uncovered lines:22
Coverable lines:209
Total lines:443
Line coverage:89.4% (187 of 209)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
TaskbarHUDView()0%110100%
GetButtonList()0%22092.86%
Create(...)0%110100%
Initialize(...)0%110100%
SetBuilderInWorldStatus(...)0%110100%
SetQuestsPanelStatus(...)0%2100%
OnWindowToggleOff(...)0%24.1717070.83%
AllButtonsToggledOff()0%330100%
OnWindowToggleOn(...)0%28.3116063.64%
SelectButton(...)0%11110100%
OnAddChatWindow()0%110100%
OnAddFriendsWindow()0%110100%
OnAddSettingsWindow()0%110100%
OnAddExploreWindow()0%110100%
OnAddHelpAndSupportWindow()0%110100%
OnAddControlsMoreOption()0%110100%
OnAddVoiceChat()0%2100%
ShowBar(...)0%220100%
SetVisibility(...)0%110100%
OnDestroy()0%990100%
AddPortableExperienceElement(...)0%22093.75%
RemovePortableExperienceElement(...)0%4.014092.31%
AdjustRightButtonsLayoutWidth()0%330100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/TaskbarHUD/TaskbarHUDView.cs

#LineLine coverage
 1using DCL;
 2using System.Collections.Generic;
 3using UnityEngine;
 4using UnityEngine.UI;
 5
 6public class TaskbarHUDView : MonoBehaviour
 7{
 8    const string VIEW_PATH = "Taskbar";
 9    const string PORTABLE_EXPERIENCE_ITEMS_POOL = "PortableExperienceItems";
 10
 11    [Header("Taskbar Animation")]
 12    [SerializeField] internal ShowHideAnimator taskbarAnimator;
 13
 14    [Header("Left Side Config")]
 15    [SerializeField] internal RectTransform leftWindowContainer;
 16
 17    [SerializeField] internal ShowHideAnimator leftWindowContainerAnimator;
 18    [SerializeField] internal LayoutGroup leftWindowContainerLayout;
 19    [SerializeField] internal GameObject voiceChatButtonPlaceholder;
 20    [SerializeField] internal VoiceChatButton voiceChatButton;
 21    [SerializeField] internal TaskbarButton chatButton;
 22    [SerializeField] internal TaskbarButton friendsButton;
 23    [SerializeField] internal ChatHeadGroupView chatHeadsGroup;
 24
 25    [Header("Right Side Config")]
 26    [SerializeField] internal HorizontalLayoutGroup rightButtonsHorizontalLayout;
 27
 28    [SerializeField] internal TaskbarButton settingsButton;
 29    [SerializeField] internal TaskbarButton exploreButton;
 30    [SerializeField] internal TaskbarButton builderInWorldButton;
 31    [SerializeField] internal GameObject portableExperiencesDiv;
 32    [SerializeField] internal PortableExperienceTaskbarItem portableExperienceItem;
 33    [SerializeField] internal TaskbarButton questPanelButton;
 34
 35    [Header("More Button Config")]
 36    [SerializeField] internal TaskbarButton moreButton;
 37
 38    [SerializeField] internal TaskbarMoreMenu moreMenu;
 39
 40    [Header("Tutorial Config")]
 41    [SerializeField] internal RectTransform exploreTooltipReference;
 42
 43    [SerializeField] internal RectTransform moreTooltipReference;
 44    [SerializeField] internal RectTransform socialTooltipReference;
 45
 46    [Header("Old TaskbarCompatibility (temporal)")]
 47    [SerializeField] internal RectTransform taskbarPanelTransf;
 48
 49    [SerializeField] internal Image taskbarPanelImage;
 50    [SerializeField] internal GameObject rightButtonsContainer;
 51
 52    internal TaskbarHUDController controller;
 2253    internal bool isBarVisible = true;
 2254    internal Dictionary<string, PortableExperienceTaskbarItem> activePortableExperienceItems = new Dictionary<string, Po
 2255    internal Dictionary<string, PoolableObject> activePortableExperiencesPoolables = new Dictionary<string, PoolableObje
 56    internal Pool portableExperiencesPool = null;
 57
 58    public event System.Action OnChatToggleOn;
 59    public event System.Action OnChatToggleOff;
 60    public event System.Action OnFriendsToggleOn;
 61    public event System.Action OnFriendsToggleOff;
 62    public event System.Action OnSettingsToggleOn;
 63    public event System.Action OnSettingsToggleOff;
 64    public event System.Action OnBuilderInWorldToggleOn;
 65    public event System.Action OnBuilderInWorldToggleOff;
 66    public event System.Action OnExploreToggleOn;
 67    public event System.Action OnExploreToggleOff;
 68    public event System.Action OnMoreToggleOn;
 69    public event System.Action OnMoreToggleOff;
 70    public event System.Action<bool> OnQuestPanelToggled;
 71
 72    internal List<TaskbarButton> GetButtonList()
 73    {
 1674        var taskbarButtonList = new List<TaskbarButton>();
 1675        taskbarButtonList.Add(chatButton);
 1676        taskbarButtonList.Add(friendsButton);
 1677        taskbarButtonList.AddRange(chatHeadsGroup.chatHeads);
 1678        taskbarButtonList.Add(builderInWorldButton);
 1679        taskbarButtonList.Add(settingsButton);
 1680        taskbarButtonList.Add(exploreButton);
 1681        taskbarButtonList.Add(moreButton);
 1682        taskbarButtonList.Add(questPanelButton);
 83
 1684        using (var iterator = activePortableExperienceItems.GetEnumerator())
 85        {
 1686            while (iterator.MoveNext())
 87            {
 088                taskbarButtonList.Add(iterator.Current.Value.mainButton);
 89            }
 1690        }
 91
 1692        return taskbarButtonList;
 93    }
 94
 95    internal static TaskbarHUDView Create(TaskbarHUDController controller, IChatController chatController,
 96        IFriendsController friendsController)
 97    {
 1198        var view = Instantiate(Resources.Load<GameObject>(VIEW_PATH)).GetComponent<TaskbarHUDView>();
 1199        view.Initialize(controller, chatController, friendsController);
 11100        return view;
 101    }
 102
 103    public void Initialize(TaskbarHUDController controller, IChatController chatController,
 104        IFriendsController friendsController)
 105    {
 11106        this.controller = controller;
 107
 11108        ShowBar(true, true);
 11109        chatButton.transform.parent.gameObject.SetActive(false);
 11110        friendsButton.transform.parent.gameObject.SetActive(false);
 11111        builderInWorldButton.transform.parent.gameObject.SetActive(false);
 11112        settingsButton.transform.parent.gameObject.SetActive(false);
 11113        exploreButton.transform.parent.gameObject.SetActive(false);
 11114        voiceChatButtonPlaceholder.SetActive(false);
 11115        voiceChatButton.gameObject.SetActive(false);
 116
 11117        moreButton.gameObject.SetActive(true);
 11118        moreMenu.Initialize(this);
 11119        moreMenu.ShowMoreMenu(false, true);
 120
 11121        chatHeadsGroup.Initialize(chatController, friendsController);
 11122        chatButton.Initialize();
 11123        friendsButton.Initialize();
 11124        builderInWorldButton.Initialize();
 11125        settingsButton.Initialize();
 11126        exploreButton.Initialize();
 11127        moreButton.Initialize();
 11128        questPanelButton.Initialize();
 129
 11130        chatHeadsGroup.OnHeadToggleOn += OnWindowToggleOn;
 11131        chatHeadsGroup.OnHeadToggleOff += OnWindowToggleOff;
 132
 11133        chatButton.OnToggleOn += OnWindowToggleOn;
 11134        chatButton.OnToggleOff += OnWindowToggleOff;
 135
 11136        friendsButton.OnToggleOn += OnWindowToggleOn;
 11137        friendsButton.OnToggleOff += OnWindowToggleOff;
 138
 11139        builderInWorldButton.OnToggleOn += OnWindowToggleOn;
 11140        builderInWorldButton.OnToggleOff += OnWindowToggleOff;
 141
 11142        settingsButton.OnToggleOn += OnWindowToggleOn;
 11143        settingsButton.OnToggleOff += OnWindowToggleOff;
 144
 11145        exploreButton.OnToggleOn += OnWindowToggleOn;
 11146        exploreButton.OnToggleOff += OnWindowToggleOff;
 147
 11148        moreButton.OnToggleOn += OnWindowToggleOn;
 11149        moreButton.OnToggleOff += OnWindowToggleOff;
 150
 11151        questPanelButton.OnToggleOn -= OnWindowToggleOn;
 11152        questPanelButton.OnToggleOff -= OnWindowToggleOff;
 11153        questPanelButton.OnToggleOn += OnWindowToggleOn;
 11154        questPanelButton.OnToggleOff += OnWindowToggleOff;
 155
 11156        portableExperiencesDiv.SetActive(false);
 157
 11158        portableExperiencesPool = PoolManager.i.AddPool(
 159            PORTABLE_EXPERIENCE_ITEMS_POOL,
 160            Instantiate(portableExperienceItem.gameObject),
 161            maxPrewarmCount: 5,
 162            isPersistent: true);
 163
 11164        portableExperiencesPool.ForcePrewarm();
 165
 11166        AdjustRightButtonsLayoutWidth();
 11167    }
 168
 169    public void SetBuilderInWorldStatus(bool isActive)
 170    {
 1171        builderInWorldButton.transform.parent.gameObject.SetActive(isActive);
 1172        AdjustRightButtonsLayoutWidth();
 1173    }
 174
 0175    public void SetQuestsPanelStatus(bool isActive) { questPanelButton.transform.parent.gameObject.SetActive(isActive); 
 176
 177    private void OnWindowToggleOff(TaskbarButton obj)
 178    {
 6179        if (obj == friendsButton)
 2180            OnFriendsToggleOff?.Invoke();
 4181        else if (obj == chatButton)
 2182            OnChatToggleOff?.Invoke();
 2183        else if (obj == settingsButton)
 0184            OnSettingsToggleOff?.Invoke();
 2185        else if (obj == builderInWorldButton)
 0186            OnBuilderInWorldToggleOff?.Invoke();
 2187        else if (obj == exploreButton)
 1188            OnExploreToggleOff?.Invoke();
 1189        else if (obj == moreButton)
 0190            moreMenu.ShowMoreMenu(false);
 1191        else if (obj == questPanelButton)
 0192            OnQuestPanelToggled?.Invoke(false);
 193        else
 194        {
 1195            using (var iterator = activePortableExperienceItems.GetEnumerator())
 196            {
 1197                while (iterator.MoveNext())
 198                {
 0199                    if (iterator.Current.Value.mainButton == obj)
 200                    {
 0201                        iterator.Current.Value.ShowContextMenu(false);
 0202                        break;
 203                    }
 204                }
 1205            }
 206        }
 207
 6208        if (AllButtonsToggledOff())
 209        {
 5210            chatButton.SetToggleState(false, useCallback: false);
 5211            controller.worldChatWindowHud.SetVisibility(true);
 212        }
 6213    }
 214
 215    public bool AllButtonsToggledOff()
 216    {
 8217        var btns = GetButtonList();
 218
 8219        bool allToggledOff = true;
 220
 134221        foreach (var btn in btns)
 222        {
 59223            if (btn.toggledOn)
 1224                allToggledOff = false;
 225        }
 226
 8227        return allToggledOff;
 228    }
 229
 230    private void OnWindowToggleOn(TaskbarButton obj)
 231    {
 6232        if (obj == friendsButton)
 2233            OnFriendsToggleOn?.Invoke();
 4234        else if (obj == chatButton)
 3235            OnChatToggleOn?.Invoke();
 1236        else if (obj == settingsButton)
 0237            OnSettingsToggleOn?.Invoke();
 1238        else if (obj == builderInWorldButton)
 0239            OnBuilderInWorldToggleOn?.Invoke();
 1240        else if (obj == exploreButton)
 0241            OnExploreToggleOn?.Invoke();
 1242        else if (obj == moreButton)
 0243            moreMenu.ShowMoreMenu(true);
 1244        else if (obj == questPanelButton)
 0245            OnQuestPanelToggled?.Invoke(true);
 246        else
 247        {
 1248            using (var iterator = activePortableExperienceItems.GetEnumerator())
 249            {
 1250                while (iterator.MoveNext())
 251                {
 0252                    if (iterator.Current.Value.mainButton == obj)
 253                    {
 0254                        iterator.Current.Value.ShowContextMenu(true);
 0255                        break;
 256                    }
 257                }
 1258            }
 259        }
 260
 6261        SelectButton(obj);
 6262    }
 263
 264    public void SelectButton(TaskbarButton obj)
 265    {
 7266        var taskbarButtonList = GetButtonList();
 267
 120268        foreach (var btn in taskbarButtonList)
 269        {
 53270            if (btn != obj)
 271            {
 272                // We let the use of the chat and friends windows while we are using the explore at the same time
 46273                if ((btn == exploreButton && (obj == chatButton || obj == friendsButton || obj is ChatHeadButton)) ||
 274                    ((btn == chatButton || btn == friendsButton || btn is ChatHeadButton) && obj == exploreButton))
 275                    continue;
 276
 40277                btn.SetToggleState(false, useCallback: true);
 278            }
 279        }
 7280    }
 281
 4282    internal void OnAddChatWindow() { chatButton.transform.parent.gameObject.SetActive(true); }
 283
 6284    internal void OnAddFriendsWindow() { friendsButton.transform.parent.gameObject.SetActive(true); }
 285
 286    internal void OnAddSettingsWindow()
 287    {
 2288        settingsButton.transform.parent.gameObject.SetActive(true);
 2289        AdjustRightButtonsLayoutWidth();
 2290    }
 291
 292    internal void OnAddExploreWindow()
 293    {
 2294        exploreButton.transform.parent.gameObject.SetActive(true);
 2295        AdjustRightButtonsLayoutWidth();
 2296    }
 297
 4298    internal void OnAddHelpAndSupportWindow() { moreMenu.ActivateHelpAndSupportButton(); }
 299
 4300    internal void OnAddControlsMoreOption() { moreMenu.ActivateControlsButton(); }
 301
 302    internal void OnAddVoiceChat()
 303    {
 0304        voiceChatButtonPlaceholder.SetActive(true);
 0305        voiceChatButton.gameObject.SetActive(true);
 0306    }
 307
 308    internal void ShowBar(bool visible, bool instant = false)
 309    {
 13310        if (visible)
 12311            taskbarAnimator.Show(instant);
 312        else
 1313            taskbarAnimator.Hide(instant);
 314
 13315        isBarVisible = visible;
 13316    }
 317
 2318    public void SetVisibility(bool visible) { gameObject.SetActive(visible); }
 319
 320    private void OnDestroy()
 321    {
 11322        if (chatHeadsGroup != null)
 323        {
 11324            chatHeadsGroup.OnHeadToggleOn -= OnWindowToggleOn;
 11325            chatHeadsGroup.OnHeadToggleOff -= OnWindowToggleOff;
 326        }
 327
 11328        if (chatButton != null)
 329        {
 11330            chatButton.OnToggleOn -= OnWindowToggleOn;
 11331            chatButton.OnToggleOff -= OnWindowToggleOff;
 332        }
 333
 11334        if (friendsButton != null)
 335        {
 11336            friendsButton.OnToggleOn -= OnWindowToggleOn;
 11337            friendsButton.OnToggleOff -= OnWindowToggleOff;
 338        }
 339
 11340        if (settingsButton != null)
 341        {
 11342            settingsButton.OnToggleOn -= OnWindowToggleOn;
 11343            settingsButton.OnToggleOff -= OnWindowToggleOff;
 344        }
 345
 11346        if (builderInWorldButton != null)
 347        {
 11348            builderInWorldButton.OnToggleOn -= OnWindowToggleOn;
 11349            builderInWorldButton.OnToggleOff -= OnWindowToggleOff;
 350        }
 351
 11352        if (exploreButton != null)
 353        {
 11354            exploreButton.OnToggleOn -= OnWindowToggleOn;
 11355            exploreButton.OnToggleOff -= OnWindowToggleOff;
 356        }
 357
 11358        if (moreButton != null)
 359        {
 11360            moreButton.OnToggleOn -= OnWindowToggleOn;
 11361            moreButton.OnToggleOff -= OnWindowToggleOff;
 362        }
 363
 11364        if (questPanelButton != null)
 365        {
 11366            questPanelButton.OnToggleOn -= OnWindowToggleOn;
 11367            questPanelButton.OnToggleOff -= OnWindowToggleOff;
 368        }
 11369    }
 370
 371    internal void AddPortableExperienceElement(string id, string name, string iconUrl)
 372    {
 2373        if (portableExperiencesPool == null)
 0374            return;
 375
 2376        portableExperiencesDiv.SetActive(true);
 377
 2378        PoolableObject newPEPoolable = portableExperiencesPool.Get();
 2379        newPEPoolable.gameObject.name = $"PortableExperienceItem ({id})";
 2380        newPEPoolable.gameObject.transform.SetParent(rightButtonsContainer.transform);
 2381        newPEPoolable.gameObject.transform.localScale = Vector3.one;
 2382        newPEPoolable.gameObject.transform.SetAsFirstSibling();
 383
 2384        PortableExperienceTaskbarItem newPEItem = newPEPoolable.gameObject.GetComponent<PortableExperienceTaskbarItem>()
 2385        newPEItem.ConfigureItem(id, name, iconUrl, controller);
 2386        newPEItem.mainButton.OnToggleOn += OnWindowToggleOn;
 2387        newPEItem.mainButton.OnToggleOff += OnWindowToggleOff;
 388
 2389        activePortableExperienceItems.Add(id, newPEItem);
 2390        activePortableExperiencesPoolables.Add(id, newPEPoolable);
 391
 2392        AdjustRightButtonsLayoutWidth();
 2393    }
 394
 395    internal void RemovePortableExperienceElement(string id)
 396    {
 1397        if (portableExperiencesPool == null)
 0398            return;
 399
 1400        if (activePortableExperienceItems.ContainsKey(id))
 401        {
 1402            PortableExperienceTaskbarItem peToRemove = activePortableExperienceItems[id];
 403
 1404            peToRemove.mainButton.OnToggleOn -= OnWindowToggleOn;
 1405            peToRemove.mainButton.OnToggleOff -= OnWindowToggleOff;
 406
 1407            activePortableExperienceItems.Remove(id);
 1408            portableExperiencesPool.Release(activePortableExperiencesPoolables[id]);
 1409            activePortableExperiencesPoolables.Remove(id);
 410        }
 411
 1412        if (activePortableExperienceItems.Count == 0)
 1413            portableExperiencesDiv.SetActive(false);
 414
 1415        AdjustRightButtonsLayoutWidth();
 1416    }
 417
 418    [ContextMenu("AdjustRightButtonsLayoutWidth")]
 419    private void AdjustRightButtonsLayoutWidth()
 420    {
 19421        float totalWidth = 0f;
 19422        int numActiveChild = 0;
 19423        RectTransform rightButtonsContainerRT = (RectTransform)rightButtonsContainer.transform;
 424
 270425        for (int i = 0; i < rightButtonsContainerRT.childCount; i++)
 426        {
 116427            RectTransform child = (RectTransform)rightButtonsContainerRT.GetChild(i);
 428
 116429            if (!child.gameObject.activeSelf)
 430                continue;
 431
 50432            totalWidth += child.sizeDelta.x;
 50433            numActiveChild++;
 434        }
 435
 19436        totalWidth +=
 437            ((numActiveChild - 1) * rightButtonsHorizontalLayout.spacing) +
 438            rightButtonsHorizontalLayout.padding.left +
 439            rightButtonsHorizontalLayout.padding.right;
 440
 19441        ((RectTransform)rightButtonsContainer.transform).sizeDelta = new Vector2(totalWidth, ((RectTransform)rightButton
 19442    }
 443}