121 lines
5.0 KiB
C#
121 lines
5.0 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Unity.Multiplayer.Center.Analytics;
|
|
using Unity.Multiplayer.Center.Questionnaire;
|
|
using Unity.Multiplayer.Center.Recommendations;
|
|
using Unity.Multiplayer.Center.Window.UI;
|
|
using UnityEditor;
|
|
using UnityEngine.UIElements;
|
|
|
|
namespace Unity.Multiplayer.Center.Window
|
|
{
|
|
class RecommendationViewBottomBar : VisualElement
|
|
{
|
|
readonly Label m_PackageCount;
|
|
readonly Button m_InstallPackageButton;
|
|
readonly Label m_InfoLabel;
|
|
|
|
IMultiplayerCenterAnalytics m_Analytics;
|
|
|
|
MultiplayerCenterWindow m_Window = EditorWindow.GetWindow<MultiplayerCenterWindow>();
|
|
List<string> m_PackagesToInstallIds = new ();
|
|
List<string> m_PackagesToInstallNames = new ();
|
|
RecommendationViewData m_RecommendationViewData;
|
|
SolutionsToRecommendedPackageViewData m_SolutionToPackageData;
|
|
|
|
public RecommendationViewBottomBar(IMultiplayerCenterAnalytics analytics)
|
|
{
|
|
m_Analytics = analytics;
|
|
name = "bottom-bar";
|
|
m_PackageCount = new Label {name = "package-count"};
|
|
m_InfoLabel = new Label();
|
|
|
|
// Setup Install Button
|
|
m_InstallPackageButton = new Button(OnInstallButtonClicked) {text = "Install Packages"};
|
|
m_InstallPackageButton.AddToClassList(StyleClasses.NextStepButton);
|
|
|
|
// Put the button in a container
|
|
var installPackageContainer = new VisualElement() {name = "install-package-container"};
|
|
installPackageContainer.Add(m_InstallPackageButton);
|
|
|
|
Add(m_PackageCount);
|
|
Add(m_InfoLabel);
|
|
Add(installPackageContainer);
|
|
}
|
|
|
|
void OnInstallButtonClicked()
|
|
{
|
|
if (!PackageManagement.IsAnyMultiplayerPackageInstalled() || WarnDialogForPackageInstallation())
|
|
{
|
|
SendInstallationAnalyticsEvent();
|
|
InstallSelectedPackagesAndExtension();
|
|
}
|
|
}
|
|
|
|
void SendInstallationAnalyticsEvent()
|
|
{
|
|
var answerObject = UserChoicesObject.instance;
|
|
m_Analytics.SendInstallationEvent(answerObject.UserAnswers, answerObject.Preset,
|
|
AnalyticsUtils.GetPackagesWithAnalyticsFormat(m_RecommendationViewData, m_SolutionToPackageData));
|
|
}
|
|
|
|
bool WarnDialogForPackageInstallation()
|
|
{
|
|
var warningMessage =
|
|
"Ensure compatibility with your current multiplayer packages before installing or upgrading the following:\n" +
|
|
string.Join("\n", m_PackagesToInstallNames);
|
|
return EditorUtility.DisplayDialog("Install Packages", warningMessage, "OK", "Cancel");
|
|
}
|
|
|
|
void InstallSelectedPackagesAndExtension()
|
|
{
|
|
SetInfoTextForInstallation(isInstalling:true);
|
|
m_Window.DisableUiForInstallation();
|
|
PackageManagement.InstallPackages(m_PackagesToInstallIds, onAllInstalled: OnInstallationFinished);
|
|
}
|
|
|
|
void OnInstallationFinished(bool success)
|
|
{
|
|
SetInfoTextForInstallation(isInstalling:false);
|
|
m_Window.RequestShowGettingStartedTabAfterDomainReload();
|
|
m_Window.ReenableUiAfterInstallation();
|
|
}
|
|
|
|
public void UpdatePackagesToInstall(RecommendationViewData data, SolutionsToRecommendedPackageViewData packageViewData)
|
|
{
|
|
m_RecommendationViewData = data;
|
|
m_SolutionToPackageData = packageViewData;
|
|
var packages = RecommendationUtils.PackagesToInstall(data, packageViewData);
|
|
RecommendationUtils.GetPackagesWithAdditionalPackages(packages, out m_PackagesToInstallIds, out m_PackagesToInstallNames, out var toolTip);
|
|
m_PackageCount.tooltip = toolTip;
|
|
|
|
// Note: quickstart is counted in the list of packages to install, but not the names
|
|
m_PackageCount.text = $"Packages to install: {m_PackagesToInstallNames.Count}";
|
|
// if the list is empty, disable the button
|
|
m_InstallPackageButton.SetEnabled(m_PackagesToInstallNames.Count > 0);
|
|
}
|
|
|
|
internal void SetInfoTextForInstallation(bool isInstalling)
|
|
{
|
|
SetInfoLabelTextAndVisibility("Downloading packages, please wait ...", isInstalling);
|
|
}
|
|
|
|
internal void SetInfoTextForCheckingPackages(bool isChecking)
|
|
{
|
|
SetInfoLabelTextAndVisibility("Querying packages information ...", isChecking);
|
|
|
|
// Handle the case of reopening the window during the installation.
|
|
// When reopening the window, the packages are being checked. Once that check is done, we still want to
|
|
// display the installation package text if there is an ongoing installation.
|
|
if(!isChecking && !PackageManagement.IsInstallationFinished())
|
|
SetInfoTextForInstallation(isInstalling:true);
|
|
}
|
|
|
|
void SetInfoLabelTextAndVisibility(string text, bool isVisible)
|
|
{
|
|
m_InfoLabel.text = text;
|
|
m_InfoLabel.visible = isVisible;
|
|
}
|
|
}
|
|
}
|