A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using Unity.Multiplayer.Center.Common;
4using Unity.Multiplayer.Center.Questionnaire;
5using Unity.Multiplayer.Center.Recommendations;
6using UnityEngine;
7using UnityEngine.UIElements;
8
9namespace Unity.Multiplayer.Center.Window.UI
10{
11 internal class QuestionnaireView
12 {
13 public VisualElement Root { get; private set; }
14 readonly QuestionnaireData m_Questions;
15
16 public event Action OnQuestionnaireDataChanged;
17 public event Action<Preset> OnPresetSelected;
18
19 public QuestionnaireView(QuestionnaireData questions)
20 {
21 m_Questions = questions;
22 Root = new VisualElement();
23 Root.name = "questionnaire-view";
24 Refresh();
25 }
26
27 public void Refresh()
28 {
29 RefreshData();
30 ReCreateVisualElements();
31 }
32
33 void ReCreateVisualElements()
34 {
35 Root.Clear();
36
37 var existingAnswers = UserChoicesObject.instance.UserAnswers.Answers;
38 var questions = m_Questions.Questions;
39
40
41 var gameSpecs = new QuestionSection(questions, existingAnswers, "Game Specifications", true);
42 gameSpecs.AddPresetView();
43 gameSpecs.OnPresetSelected += RaisePresetSelected;
44 gameSpecs.QuestionUpdated += QuestionUpdated;
45 Root.Add(gameSpecs);
46 gameSpecs.CreateAdvancedFoldout(questions, existingAnswers, "Detailed Game Specifications");
47 EvaluateAdvancedSectionVisibility();
48 }
49
50 void EvaluateAdvancedSectionVisibility()
51 {
52 var showAdvanced = UserChoicesObject.instance.Preset != Preset.None &&
53 Logic.AreMandatoryQuestionsFilled(QuestionnaireObject.instance.Questionnaire, UserChoicesObject.instance.UserAnswers);
54
55 Root.Q<QuestionSection>().SetAdvancedSectionVisible(showAdvanced);
56 }
57
58 public void Clear()
59 {
60 OnQuestionnaireDataChanged = null;
61 Root.Clear();
62 }
63
64 static void RefreshData()
65 {
66 UserChoicesObject.instance.UserAnswers.Answers ??= new List<AnsweredQuestion>();
67 }
68
69 internal void QuestionUpdated(AnsweredQuestion answeredQuestion)
70 {
71 Logic.Update(UserChoicesObject.instance.UserAnswers, answeredQuestion);
72 UserChoicesObject.instance.Save();
73 if (IsAllQuestionsAnswered())
74 {
75 OnQuestionnaireDataChanged?.Invoke();
76 }
77 EvaluateAdvancedSectionVisibility();
78 }
79
80 internal void RaisePresetSelected(Preset preset)
81 {
82 OnPresetSelected?.Invoke(preset);
83 }
84
85 bool IsAllQuestionsAnswered()
86 {
87 foreach (var question in m_Questions.Questions)
88 {
89 if (!RecommendationUtils.IsQuestionAnswered(question))
90 {
91 return false;
92 }
93 }
94
95 return true;
96 }
97 }
98}