using System; using System.Collections.Generic; using Unity.Multiplayer.Center.Recommendations; using UnityEngine; using UnityEngine.UIElements; namespace Unity.Multiplayer.Center.Window.UI.RecommendationView { /// /// View to show one option to the user /// Option can be shown as a radio button or as a checkbox. /// internal class RecommendationItemView : VisualElement { string m_DocsUrl; BaseBoolField m_RadioButton; Label m_PackageNameLabel = new(); Label m_Catchphrase = new(); RecommendationBadge m_RecommendedBadge; PreReleaseBadge m_PreReleaseBadge; Image m_PackageManagerIcon; Image m_HelpIcon; Image m_InstalledIcon; /// /// Feature Id stores a unique identifier that identifies the feature. /// Usually this is the title of the solution or the package id. /// public string FeatureId { get; set; } /// /// Triggered when the user changes the selection. /// public Action OnUserChangedSelection; public RecommendationItemView(bool isRadio = true) { AddToClassList("recommendation-item"); var topContainer = new VisualElement(); topContainer.name = "header"; m_RadioButton = isRadio ? new RadioButton() : new Toggle(); m_RadioButton.RegisterValueChangedCallback(evt => { if (OnUserChangedSelection != null) OnUserChangedSelection(this, evt.newValue); }); var topContainerLeft = new VisualElement(); m_RecommendedBadge = new RecommendationBadge(); m_PreReleaseBadge = new PreReleaseBadge(); m_InstalledIcon = new Image() { name = "icon-package-installed" }; m_InstalledIcon.AddToClassList("icon"); m_InstalledIcon.AddToClassList("icon-package-installed"); m_InstalledIcon.tooltip = "Package is installed"; topContainerLeft.Add(m_RadioButton); topContainerLeft.Add(m_PackageNameLabel); topContainerLeft.Add(m_RecommendedBadge); topContainerLeft.Add(m_PreReleaseBadge); topContainerLeft.Add(m_InstalledIcon); topContainerLeft.AddToClassList("recommendation-item-top-left-container"); topContainer.Add(topContainerLeft); var topContainerRight = new VisualElement(); topContainerRight.AddToClassList("recommendation-item-top-right-container"); m_HelpIcon = new Image() { name = "info-icon"}; m_HelpIcon.AddToClassList("icon"); m_HelpIcon.AddToClassList("icon-questionmark"); m_HelpIcon.tooltip = "Open documentation"; m_HelpIcon.RegisterCallback(OpenInBrowser); topContainerRight.Add(m_HelpIcon); m_PackageManagerIcon = new Image() { name = "package-manager-icon" }; m_PackageManagerIcon.AddToClassList("icon"); m_PackageManagerIcon.AddToClassList("icon-package-manager"); m_PackageManagerIcon.tooltip = "Open Package Manager"; m_PackageManagerIcon.RegisterCallback(_ => PackageManagement.OpenPackageManager(FeatureId)); topContainerRight.Add(m_PackageManagerIcon); topContainer.Add(topContainerRight); Add(topContainer); var bottomContainer = new VisualElement(); bottomContainer.Add(m_Catchphrase); bottomContainer.name = "sub-info-text"; Add(bottomContainer); } public void UpdateData(RecommendedPackageViewData package) { var featureName = package.Name; m_PreReleaseBadge.style.display = string.IsNullOrEmpty(package.PreReleaseVersion)? DisplayStyle.None : DisplayStyle.Flex; var featureId = package.PackageId; FeatureId = featureId; SetFeatureName(featureName); SetIsSelected(package.Selected); SetRecommendationType(package.RecommendationType); SetReasonText(package.Reason); SetDocUrl(package.DocsUrl); SetCatchPhrase(package.ShortDescription); SetupInstalledIcon(package, featureId); SetupPackageManagerIcon(featureId); } void SetupPackageManagerIcon(string featureId) { m_PackageManagerIcon.SetEnabled(!string.IsNullOrEmpty(featureId)); } internal void SetIsSelected(bool value) { m_RadioButton.SetValueWithoutNotify(value); } internal void SetCheckboxEnabled(bool value) { m_RadioButton.SetEnabled(value); } void SetupInstalledIcon(RecommendedItemViewData item, string featureId) { if (!item.IsInstalledAsProjectDependency) { m_InstalledIcon.style.display = DisplayStyle.None; return; } m_InstalledIcon.style.display = DisplayStyle.Flex; m_InstalledIcon.tooltip = $"Installed version: {item.InstalledVersion}\nClick to open Package Manager"; } void SetFeatureName(string value) { m_PackageNameLabel.text = value; } void SetRecommendationType(RecommendationType value) { m_RecommendedBadge.SetRecommendationType(value); m_RadioButton.SetEnabled(true); style.opacity = 1f; if (!value.IsInstallableAsDirectDependency()) { style.opacity = 0.8f; m_RadioButton.SetEnabled(false); m_RadioButton.SetValueWithoutNotify(false); } } public void SetRecommendedBadgeVisible(bool value) { m_RecommendedBadge.style.display = value ? DisplayStyle.Flex : DisplayStyle.None; } void SetReasonText(string value) { m_PackageNameLabel.tooltip = value; m_RecommendedBadge.tooltip = value; } void SetCatchPhrase(string value) { m_Catchphrase.text = value; // Deleted the reason text for now m_Catchphrase.style.display = DisplayStyle.Flex; if (string.IsNullOrEmpty(value)) m_Catchphrase.style.display = DisplayStyle.None; } void SetDocUrl(string url) { m_DocsUrl = url; m_HelpIcon.SetEnabled(!string.IsNullOrEmpty(url)); } void OpenInBrowser(ClickEvent evt) { // For a better solution look at PackageLinkButton.cs in PackageManagerUI, there seems to be a version with analytics etc. Application.OpenURL(m_DocsUrl); } } internal class RecommendationBadge : Label { List m_PossibleLabelStyles = new () { "color-grey", "color-recommendation-badge", }; public void SetRecommendationType(RecommendationType value) { style.display = DisplayStyle.Flex; m_PossibleLabelStyles.ForEach(RemoveFromClassList); switch (value) { case RecommendationType.NetcodeFeatured or RecommendationType.HostingFeatured or RecommendationType.OptionalStandard: AddToClassList("color-recommendation-badge"); text = "Recommended"; break; case RecommendationType.NotRecommended: AddToClassList("color-grey"); text = "Not Recommended"; break; case RecommendationType.Incompatible: AddToClassList("color-grey"); text = "Incompatible"; break; default: style.display = DisplayStyle.None; break; } } public RecommendationBadge() { AddToClassList("badge"); } } internal class PreReleaseBadge : Label { public PreReleaseBadge() : base ("Pre") { AddToClassList("badge"); AddToClassList("pre-release-badge"); } } }