< Summary

Class:TaskbarHUDView
Assembly:TaskbarHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/TaskbarHUD/TaskbarHUDView.cs
Covered lines:115
Uncovered lines:14
Coverable lines:129
Total lines:297
Line coverage:89.1% (115 of 129)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
TaskbarHUDView()0%110100%
GetButtonList()0%2.012088.89%
Create(...)0%110100%
Initialize(...)0%110100%
OnWindowToggleOff(...)0%8.638078.57%
AllButtonsToggledOff()0%3.023087.5%
OnWindowToggleOn(...)0%7.777075%
SelectButton(...)0%330100%
OnAddChatWindow()0%110100%
OnAddFriendsWindow()0%110100%
OnAddVoiceChat()0%2100%
ShowBar(...)0%2.032080%
SetVisibility(...)0%110100%
OnDestroy()0%440100%
AddPortableExperienceElement(...)0%22093.33%
RemovePortableExperienceElement(...)0%3.013090.91%
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    [SerializeField] internal PortableExperienceTaskbarItem portableExperienceItem;
 28
 29    [SerializeField] internal RectTransform socialTooltipReference;
 30
 31    [Header("Old TaskbarCompatibility (temporal)")]
 32    [SerializeField] internal RectTransform taskbarPanelTransf;
 33
 34    [SerializeField] internal Image taskbarPanelImage;
 35    [SerializeField] internal GameObject rightButtonsContainer;
 36
 37    internal TaskbarHUDController controller;
 838    internal bool isBarVisible = true;
 839    internal Dictionary<string, PortableExperienceTaskbarItem> activePortableExperienceItems = new Dictionary<string, Po
 840    internal Dictionary<string, PoolableObject> activePortableExperiencesPoolables = new Dictionary<string, PoolableObje
 41    internal Pool portableExperiencesPool = null;
 42
 43    public event System.Action OnChatToggleOn;
 44    public event System.Action OnChatToggleOff;
 45    public event System.Action OnFriendsToggleOn;
 46    public event System.Action OnFriendsToggleOff;
 47
 48    internal List<TaskbarButton> GetButtonList()
 49    {
 1450        var taskbarButtonList = new List<TaskbarButton>();
 1451        taskbarButtonList.Add(chatButton);
 1452        taskbarButtonList.Add(friendsButton);
 1453        taskbarButtonList.AddRange(chatHeadsGroup.chatHeads);
 54
 1455        using (var iterator = activePortableExperienceItems.GetEnumerator())
 56        {
 1457            while (iterator.MoveNext())
 58            {
 059                taskbarButtonList.Add(iterator.Current.Value.mainButton);
 60            }
 1461        }
 62
 1463        return taskbarButtonList;
 64    }
 65
 66    internal static TaskbarHUDView Create(TaskbarHUDController controller, IChatController chatController,
 67        IFriendsController friendsController)
 68    {
 669        var view = Instantiate(Resources.Load<GameObject>(VIEW_PATH)).GetComponent<TaskbarHUDView>();
 670        view.Initialize(controller, chatController, friendsController);
 671        return view;
 72    }
 73
 74    public void Initialize(TaskbarHUDController controller, IChatController chatController,
 75        IFriendsController friendsController)
 76    {
 677        this.controller = controller;
 78
 679        ShowBar(true, true);
 680        chatButton.transform.parent.gameObject.SetActive(false);
 681        friendsButton.transform.parent.gameObject.SetActive(false);
 682        voiceChatButtonPlaceholder.SetActive(false);
 683        voiceChatButton.gameObject.SetActive(false);
 84
 685        chatHeadsGroup.Initialize(chatController, friendsController);
 686        chatButton.Initialize();
 687        friendsButton.Initialize();
 88
 689        chatHeadsGroup.OnHeadToggleOn += OnWindowToggleOn;
 690        chatHeadsGroup.OnHeadToggleOff += OnWindowToggleOff;
 91
 692        chatButton.OnToggleOn += OnWindowToggleOn;
 693        chatButton.OnToggleOff += OnWindowToggleOff;
 94
 695        friendsButton.OnToggleOn += OnWindowToggleOn;
 696        friendsButton.OnToggleOff += OnWindowToggleOff;
 97
 698        portableExperiencesPool = PoolManager.i.AddPool(
 99            PORTABLE_EXPERIENCE_ITEMS_POOL,
 100            Instantiate(portableExperienceItem.gameObject),
 101            maxPrewarmCount: 5,
 102            isPersistent: true);
 103
 6104        portableExperiencesPool.ForcePrewarm();
 105
 6106        AdjustRightButtonsLayoutWidth();
 6107    }
 108
 109    private void OnWindowToggleOff(TaskbarButton obj)
 110    {
 5111        if (obj == friendsButton)
 2112            OnFriendsToggleOff?.Invoke();
 3113        else if (obj == chatButton)
 2114            OnChatToggleOff?.Invoke();
 115        else
 116        {
 1117            using (var iterator = activePortableExperienceItems.GetEnumerator())
 118            {
 1119                while (iterator.MoveNext())
 120                {
 0121                    if (iterator.Current.Value.mainButton == obj)
 122                    {
 0123                        iterator.Current.Value.ShowContextMenu(false);
 0124                        break;
 125                    }
 126                }
 1127            }
 128        }
 129
 5130        if (AllButtonsToggledOff())
 131        {
 5132            chatButton.SetToggleState(false, useCallback: false);
 5133            controller.worldChatWindowHud.SetVisibility(true);
 134        }
 5135    }
 136
 137    public bool AllButtonsToggledOff()
 138    {
 7139        var btns = GetButtonList();
 140
 7141        bool allToggledOff = true;
 142
 48143        foreach (var btn in btns)
 144        {
 17145            if (btn.toggledOn)
 0146                allToggledOff = false;
 147        }
 148
 7149        return allToggledOff;
 150    }
 151
 152    private void OnWindowToggleOn(TaskbarButton obj)
 153    {
 6154        if (obj == friendsButton)
 2155            OnFriendsToggleOn?.Invoke();
 4156        else if (obj == chatButton)
 3157            OnChatToggleOn?.Invoke();
 158        else
 159        {
 1160            using (var iterator = activePortableExperienceItems.GetEnumerator())
 161            {
 1162                while (iterator.MoveNext())
 163                {
 0164                    if (iterator.Current.Value.mainButton == obj)
 165                    {
 0166                        iterator.Current.Value.ShowContextMenu(true);
 0167                        break;
 168                    }
 169                }
 1170            }
 171        }
 172
 6173        SelectButton(obj);
 6174    }
 175
 176    public void SelectButton(TaskbarButton obj)
 177    {
 6178        var taskbarButtonList = GetButtonList();
 179
 44180        foreach (var btn in taskbarButtonList)
 181        {
 16182            if (btn != obj)
 10183                btn.SetToggleState(false, useCallback: true);
 184        }
 6185    }
 186
 4187    internal void OnAddChatWindow() { chatButton.transform.parent.gameObject.SetActive(true); }
 188
 6189    internal void OnAddFriendsWindow() { friendsButton.transform.parent.gameObject.SetActive(true); }
 190
 191    internal void OnAddVoiceChat()
 192    {
 0193        voiceChatButtonPlaceholder.SetActive(true);
 0194        voiceChatButton.gameObject.SetActive(true);
 0195    }
 196
 197    internal void ShowBar(bool visible, bool instant = false)
 198    {
 6199        if (visible)
 6200            taskbarAnimator.Show(instant);
 201        else
 0202            taskbarAnimator.Hide(instant);
 203
 6204        isBarVisible = visible;
 6205    }
 206
 2207    public void SetVisibility(bool visible) { gameObject.SetActive(visible); }
 208
 209    private void OnDestroy()
 210    {
 6211        if (chatHeadsGroup != null)
 212        {
 6213            chatHeadsGroup.OnHeadToggleOn -= OnWindowToggleOn;
 6214            chatHeadsGroup.OnHeadToggleOff -= OnWindowToggleOff;
 215        }
 216
 6217        if (chatButton != null)
 218        {
 6219            chatButton.OnToggleOn -= OnWindowToggleOn;
 6220            chatButton.OnToggleOff -= OnWindowToggleOff;
 221        }
 222
 6223        if (friendsButton != null)
 224        {
 6225            friendsButton.OnToggleOn -= OnWindowToggleOn;
 6226            friendsButton.OnToggleOff -= OnWindowToggleOff;
 227        }
 6228    }
 229
 230    internal void AddPortableExperienceElement(string id, string name, string iconUrl)
 231    {
 2232        if (portableExperiencesPool == null)
 0233            return;
 234
 2235        PoolableObject newPEPoolable = portableExperiencesPool.Get();
 2236        newPEPoolable.gameObject.name = $"PortableExperienceItem ({id})";
 2237        newPEPoolable.gameObject.transform.SetParent(rightButtonsContainer.transform);
 2238        newPEPoolable.gameObject.transform.localScale = Vector3.one;
 2239        newPEPoolable.gameObject.transform.SetAsFirstSibling();
 240
 2241        PortableExperienceTaskbarItem newPEItem = newPEPoolable.gameObject.GetComponent<PortableExperienceTaskbarItem>()
 2242        newPEItem.ConfigureItem(id, name, iconUrl, controller);
 2243        newPEItem.mainButton.OnToggleOn += OnWindowToggleOn;
 2244        newPEItem.mainButton.OnToggleOff += OnWindowToggleOff;
 245
 2246        activePortableExperienceItems.Add(id, newPEItem);
 2247        activePortableExperiencesPoolables.Add(id, newPEPoolable);
 248
 2249        AdjustRightButtonsLayoutWidth();
 2250    }
 251
 252    internal void RemovePortableExperienceElement(string id)
 253    {
 1254        if (portableExperiencesPool == null)
 0255            return;
 256
 1257        if (activePortableExperienceItems.ContainsKey(id))
 258        {
 1259            PortableExperienceTaskbarItem peToRemove = activePortableExperienceItems[id];
 260
 1261            peToRemove.mainButton.OnToggleOn -= OnWindowToggleOn;
 1262            peToRemove.mainButton.OnToggleOff -= OnWindowToggleOff;
 263
 1264            activePortableExperienceItems.Remove(id);
 1265            portableExperiencesPool.Release(activePortableExperiencesPoolables[id]);
 1266            activePortableExperiencesPoolables.Remove(id);
 267        }
 268
 1269        AdjustRightButtonsLayoutWidth();
 1270    }
 271
 272    [ContextMenu("AdjustRightButtonsLayoutWidth")]
 273    private void AdjustRightButtonsLayoutWidth()
 274    {
 9275        float totalWidth = 0f;
 9276        int numActiveChild = 0;
 9277        RectTransform rightButtonsContainerRT = (RectTransform)rightButtonsContainer.transform;
 278
 22279        for (int i = 0; i < rightButtonsContainerRT.childCount; i++)
 280        {
 2281            RectTransform child = (RectTransform)rightButtonsContainerRT.GetChild(i);
 282
 2283            if (!child.gameObject.activeSelf)
 284                continue;
 285
 2286            totalWidth += child.sizeDelta.x;
 2287            numActiveChild++;
 288        }
 289
 9290        totalWidth +=
 291            ((numActiveChild - 1) * rightButtonsHorizontalLayout.spacing) +
 292            rightButtonsHorizontalLayout.padding.left +
 293            rightButtonsHorizontalLayout.padding.right;
 294
 9295        ((RectTransform)rightButtonsContainer.transform).sizeDelta = new Vector2(totalWidth, ((RectTransform)rightButton
 9296    }
 297}