< Summary

Class:DCL.Huds.QuestsPanel.QuestsPanelHUDView
Assembly:QuestsPanelHUD
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/QuestsPanelHUD/QuestsPanelHUDView.cs
Covered lines:89
Uncovered lines:14
Coverable lines:103
Total lines:221
Line coverage:86.4% (89 of 103)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
QuestsPanelHUDView()0%110100%
QuestsPanelHUDView()0%110100%
Create()0%110100%
Awake()0%220100%
RequestAddOrUpdateQuest(...)0%220100%
AddOrUpdateQuest(...)0%5.145082.35%
RemoveQuest(...)0%3.013091.67%
ClearQuests()0%2.062075%
ShowQuestPopup(...)0%220100%
Update()0%6.846071.43%
OrderQuests()0%12120100%
SetVisibility(...)0%220100%
Dispose()0%220100%
OnDestroy()0%110100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/QuestsPanelHUD/QuestsPanelHUDView.cs

#LineLine coverage
 1using System;
 2using DCL.Helpers;
 3using System.Collections.Generic;
 4using System.Linq;
 5using UnityEngine;
 6using UnityEngine.UI;
 7
 8namespace DCL.Huds.QuestsPanel
 9{
 10    public interface IQuestsPanelHUDView
 11    {
 12        void RequestAddOrUpdateQuest(string questId);
 13        void RemoveQuest(string questId);
 14        void ClearQuests();
 15        void SetVisibility(bool active);
 16        bool isVisible { get; }
 17        void Dispose();
 18    }
 19
 20    public class QuestsPanelHUDView : MonoBehaviour, IQuestsPanelHUDView
 21    {
 122        internal static int ENTRIES_PER_FRAME { get; set; } = 5;
 23        private const string VIEW_PATH = "QuestsPanelHUD";
 24
 25        [SerializeField] internal RectTransform availableQuestsContainer;
 26        [SerializeField] internal RectTransform completedQuestsContainer;
 27        [SerializeField] private GameObject questsContainerSeparators;
 28        [SerializeField] private GameObject questPrefab;
 29        [SerializeField] private GameObject noQuestsTitle;
 30        [SerializeField] internal QuestsPanelPopup questPopup;
 31        [SerializeField] private Button closeButton;
 32        [SerializeField] private DynamicScrollSensitivity dynamicScrollSensitivity;
 33
 034        private static BaseDictionary<string, QuestModel> quests => DataStore.i.Quests.quests;
 35
 2136        private string currentQuestInPopup = "";
 2137        internal readonly Dictionary<string, QuestsPanelEntry> questEntries =  new Dictionary<string, QuestsPanelEntry>(
 38        private bool orderQuestsRequested = false;
 39        private bool layoutRebuildRequested = false;
 2140        internal readonly List<string> questsToBeAdded = new List<string>();
 41        private bool isDestroyed = false;
 42
 43        internal static QuestsPanelHUDView Create()
 44        {
 145            var view = Instantiate(Resources.Load<GameObject>(VIEW_PATH)).GetComponent<QuestsPanelHUDView>();
 46#if UNITY_EDITOR
 147            view.gameObject.name = "_QuestsPanelHUDView";
 48#endif
 149            return view;
 50        }
 51
 52        public void Awake()
 53        {
 1954            questPopup.gameObject.SetActive(false);
 1955            noQuestsTitle.SetActive(false);
 1956            closeButton.onClick.AddListener(() =>
 57            {
 058                QuestsUIAnalytics.SendQuestLogVisibiltyChanged(false, "quest_log_close_button");
 059                DataStore.i.HUDs.questsPanelVisible.Set(false);
 060            });
 1961        }
 62
 63        public void RequestAddOrUpdateQuest(string questId)
 64        {
 465            if (questsToBeAdded.Contains(questId))
 66            {
 167                AddOrUpdateQuest(questId);
 168                return;
 69            }
 70
 371            questsToBeAdded.Add(questId);
 372        }
 73
 74        internal void AddOrUpdateQuest(string questId)
 75        {
 1876            if (!quests.TryGetValue(questId, out QuestModel quest))
 77            {
 178                Debug.LogError($"Couldn't find quest with ID {questId} in DataStore");
 179                return;
 80            }
 81
 82            //Quest has no available tasks, we remove it.
 1783            if (!quest.hasAvailableTasks)
 84            {
 085                RemoveQuest(questId);
 086                return;
 87            }
 88
 1789            if (!questEntries.TryGetValue(questId, out QuestsPanelEntry questEntry))
 90            {
 1691                questEntry = Instantiate(questPrefab).GetComponent<QuestsPanelEntry>();
 1692                questEntry.OnReadMoreClicked += ShowQuestPopup;
 1693                questEntries.Add(questId, questEntry);
 94            }
 95
 1796            questEntry.transform.localScale = Vector3.one;
 1797            questEntry.Populate(quest);
 1798            if (currentQuestInPopup == questId)
 099                questPopup.Populate(quest);
 100
 17101            orderQuestsRequested = true;
 17102            layoutRebuildRequested = true;
 17103        }
 104
 105        public void RemoveQuest(string questId)
 106        {
 2107            questsToBeAdded.Remove(questId);
 108
 2109            if (!questEntries.TryGetValue(questId, out QuestsPanelEntry questEntry))
 1110                return;
 1111            questEntries.Remove(questId);
 1112            questEntry.Unparent();
 1113            questEntry.SelfDestroy();
 114
 1115            if (currentQuestInPopup == questId)
 0116                questPopup.Close();
 117
 1118            questsContainerSeparators.SetActive(completedQuestsContainer.childCount > 0);
 1119            noQuestsTitle.SetActive(availableQuestsContainer.childCount == 0 );
 1120            layoutRebuildRequested = true;
 1121        }
 122
 123        public void ClearQuests()
 124        {
 1125            questPopup.Close();
 2126            foreach (QuestsPanelEntry questEntry in questEntries.Values)
 127            {
 0128                questEntry.transform.SetParent(null);
 0129                Destroy(questEntry.gameObject);
 130            }
 131
 1132            questEntries.Clear();
 1133            questsToBeAdded.Clear();
 1134            questsContainerSeparators.SetActive(completedQuestsContainer.childCount > 0);
 1135            noQuestsTitle.SetActive(availableQuestsContainer.childCount == 0 );
 1136            layoutRebuildRequested = true;
 1137        }
 138
 139        internal void ShowQuestPopup(string questId)
 140        {
 8141            if (!quests.TryGetValue(questId, out QuestModel quest))
 142            {
 1143                Debug.Log($"Couldnt find quest with id {questId}");
 1144                return;
 145            }
 146
 7147            questPopup.SetPositionToReadMoreButton(questEntries[questId].readMorePosition);
 148
 7149            currentQuestInPopup = questId;
 7150            questPopup.Populate(quest);
 7151            questPopup.Show();
 7152        }
 153
 154        internal void Update()
 155        {
 4156            if (layoutRebuildRequested)
 157            {
 2158                layoutRebuildRequested = false;
 2159                Utils.ForceRebuildLayoutImmediate(GetComponent<RectTransform>());
 2160                dynamicScrollSensitivity?.RecalculateSensitivity();
 161            }
 162
 4163            if (orderQuestsRequested)
 164            {
 1165                orderQuestsRequested = false;
 1166                OrderQuests();
 167            }
 168
 8169            for (int i = 0; i < ENTRIES_PER_FRAME && questsToBeAdded.Count > 0; i++)
 170            {
 0171                string questId = questsToBeAdded.First();
 0172                questsToBeAdded.RemoveAt(0);
 0173                AddOrUpdateQuest(questId);
 174            }
 4175        }
 176
 177        private void OrderQuests()
 178        {
 9179            var questModels = questEntries.Keys.Select(x => quests.Get(x));
 180
 14181            string[] availableIdsSorted = questModels.Where(x => !x.isCompleted).OrderBy(x => x.assignmentTime).ThenBy(x
 8182            for (int i = 0; i < availableIdsSorted.Length; i++)
 183            {
 3184                questEntries[availableIdsSorted[i]].transform.SetParent(availableQuestsContainer);
 3185                questEntries[availableIdsSorted[i]].transform.localScale = Vector3.one;
 3186                questEntries[availableIdsSorted[i]].transform.SetSiblingIndex(i);
 187            }
 188
 8189            string[] completedQuestsSorted = questModels.Where(x => x.isCompleted).OrderBy(x => x.completionTime).ThenBy
 4190            for (int i = 0; i < completedQuestsSorted.Length; i++)
 191            {
 1192                questEntries[completedQuestsSorted[i]].transform.SetParent(completedQuestsContainer);
 1193                questEntries[completedQuestsSorted[i]].transform.localScale = Vector3.one;
 1194                questEntries[completedQuestsSorted[i]].transform.SetSiblingIndex(i);
 195            }
 196
 1197            questsContainerSeparators.SetActive(completedQuestsContainer.childCount > 0);
 1198            noQuestsTitle.SetActive(availableQuestsContainer.childCount == 0 );
 1199        }
 200
 201        public void SetVisibility(bool active)
 202        {
 2203            gameObject.SetActive(active);
 204
 2205            if (active)
 1206                AudioScriptableObjects.dialogOpen.Play();
 207            else
 1208                AudioScriptableObjects.dialogClose.Play();
 1209        }
 210
 0211        public bool isVisible => gameObject.activeSelf;
 212
 213        public void Dispose()
 214        {
 1215            if (!isDestroyed)
 1216                Destroy(gameObject);
 1217        }
 218
 38219        private void OnDestroy() { isDestroyed = true; }
 220    }
 221}