using System; using System.Collections.Generic; using Unity.Multiplayer.Center.Recommendations; using UnityEngine; using UnityEngine.UIElements; namespace Unity.Multiplayer.Center.Window.UI.RecommendationView { internal class SectionHeader : VisualElement { readonly DropdownField m_MainDropdown; readonly Label m_MainPackageDescription; readonly VisualElement m_PosterImageIcon; public event Action OnSolutionSelected; const string k_ItemIsRecommendedAppend = " - Recommended"; RecommendedSolutionViewData[] m_Solutions; public SectionHeader(string headlineLabel) { var posterImageContainer = new VisualElement(){name = "card-poster-image"}; m_PosterImageIcon = new VisualElement(); posterImageContainer.Add(m_PosterImageIcon); m_MainDropdown = new DropdownField(); m_MainPackageDescription = new Label(); var headline = new Label(){text = headlineLabel, name = "card-headline"}; Add(posterImageContainer); Add(headline); Add(m_MainDropdown); Add(m_MainPackageDescription); m_MainDropdown.RegisterValueChangedCallback(OnItemSelected); } public void UpdateData(RecommendedSolutionViewData[] availableSolutions) { m_Solutions = availableSolutions; m_MainDropdown.choices = GenerateChoices(availableSolutions, out var selectedSolution, out var solutionTitleWithAppend); var iconClass = "icon-" + selectedSolution.Solution; m_PosterImageIcon.ClearClassList(); m_PosterImageIcon.AddToClassList(iconClass); m_MainDropdown.SetValueWithoutNotify(solutionTitleWithAppend); m_MainPackageDescription.text = selectedSolution.Reason; } /// /// Returns a list of choices for the dropdown and appends k_ItemIsRecommendedAppend to the recommended choice. /// /// All available Solutions /// The solution that is selected. /// The title of the selection solution with appended k_ItemIsRecommendedAppend /// List of Choices to be used with Dropdown static List GenerateChoices(RecommendedSolutionViewData[] availableSolutions, out RecommendedSolutionViewData selectedSolution, out string selectedSolutionTitleAppended) { var choices = new List(availableSolutions.Length); selectedSolutionTitleAppended = null; selectedSolution = null; foreach (var sol in availableSolutions) { if(sol.RecommendationType == RecommendationType.Incompatible) continue; var isRecommended = sol.RecommendationType == RecommendationType.MainArchitectureChoice; choices.Add(isRecommended ? sol.Title + k_ItemIsRecommendedAppend : sol.Title); if (sol.Selected) { selectedSolutionTitleAppended = choices[^1]; selectedSolution = sol; } } return choices; } static string RemoveRecommendationString(string choice) { return choice.Replace(k_ItemIsRecommendedAppend, ""); } void OnItemSelected(ChangeEvent evt) { foreach (var solution in m_Solutions) { solution.Selected = RemoveRecommendationString(evt.newValue) == solution.Title; } OnSolutionSelected?.Invoke(); } } }