UnityGame/Library/PackageCache/com.unity.collab-proxy/Editor/PlasticSCM/Views/DownloadPlasticExeDialog.cs

258 lines
8.4 KiB
C#
Raw Normal View History

2024-10-27 10:53:47 +03:00
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using Codice.Client.Common;
using Codice.Client.Common.EventTracking;
using Codice.CM.Common;
using PlasticGui;
using Unity.PlasticSCM.Editor.Tool;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.UI.UIElements;
using Unity.PlasticSCM.Editor.Views.Welcome;
namespace Unity.PlasticSCM.Editor.Views
{
internal class DownloadPlasticExeDialog : PlasticDialog, DownloadAndInstallOperation.INotify
{
internal bool IsPlasticInstalling { get { return mIsPlasticInstalling; } }
protected override Rect DefaultRect
{
get
{
var baseRect = base.DefaultRect;
return new Rect(baseRect.x, baseRect.y, DIALOG_WIDTH, DIALOG_HEIGHT);
}
}
internal static ProgressControlsForDialogs.Data Show(
RepositorySpec repSpec,
bool isGluonMode,
string installCloudFrom,
string installEnterpriseFrom,
string cancelInstallFrom,
ProgressControlsForDialogs.Data progressData)
{
DownloadPlasticExeDialog dialog;
if (HasOpenInstances<DownloadPlasticExeDialog>())
{
dialog = GetWindow<DownloadPlasticExeDialog>(true);
}
else
{
dialog = Create(repSpec, isGluonMode, installCloudFrom, installEnterpriseFrom, cancelInstallFrom, progressData);
dialog.RunUtility(focusedWindow);
}
return progressData != null ? progressData : dialog.mProgressControls.ProgressData;
}
static DownloadPlasticExeDialog Create(
RepositorySpec repSpec,
bool isGluonMode,
string installCloudFrom,
string installEnterpriseFrom,
string cancelInstallFrom,
ProgressControlsForDialogs.Data progressData)
{
var instance = CreateInstance<DownloadPlasticExeDialog>();
instance.mRepSpec = repSpec;
instance.mInstallCloudFrom = installCloudFrom;
instance.mInstallEnterpriseFrom = installEnterpriseFrom;
instance.mCancelInstallFrom = cancelInstallFrom;
instance.mIsGluonMode = isGluonMode;
instance.mProgressData = progressData;
instance.mInstallerFile = GetInstallerTmpFileName.ForPlatform();
instance.mIsCloudEdition = EditionToken.IsCloudEdition();
instance.mTitle = PlasticLocalization.Name.UnityVersionControl.GetString();
return instance;
}
protected override string GetTitle()
{
return mTitle;
}
void OnEnable()
{
BuildComponents();
}
void OnDestroy()
{
Dispose();
}
protected override void OnModalGUI()
{
if (InstallationFinished())
{
mMessageLabel.text = PlasticLocalization.Name.UnityVersionControlInstalled.GetString();
mCancelButton.text = PlasticLocalization.Name.CloseButton.GetString();
mConfirmMessageLabel.Collapse();
mDownloadButton.Collapse();
maxSize = new Vector2(DIALOG_WIDTH, REDUCED_DIALOG_HEIGHT);
return;
}
if (mProgressData != null)
{
if (mProgressControlsContainer.Children().OfType<ProgressControlsForDialogs>().Any())
{
mProgressControlsContainer.RemoveAt(0);
mProgressLabel = new Label(GetMessageFromProgressData(mProgressData));
mProgressControlsContainer.Add(mProgressLabel);
}
mProgressLabel.text = GetMessageFromProgressData(mProgressData);
UpdateButtonsStatuses();
}
}
void CancelButton_Clicked()
{
if (!IsExeAvailable.ForMode(mIsGluonMode))
TrackFeatureUseEvent.For(mRepSpec, mCancelInstallFrom);
Close();
}
void DownloadButton_Clicked()
{
if (mIsCloudEdition)
{
TrackFeatureUseEvent.For(mRepSpec, mInstallCloudFrom);
DownloadAndInstallOperation.Run(
Edition.Cloud, mInstallerFile, mProgressControls, this);
}
else
{
TrackFeatureUseEvent.For(mRepSpec, mInstallEnterpriseFrom);
DownloadAndInstallOperation.Run(
Edition.Enterprise, mInstallerFile, mProgressControls, this);
}
}
void DownloadAndInstallOperation.INotify.InstallationStarted()
{
mIsPlasticInstalling = true;
}
void DownloadAndInstallOperation.INotify.InstallationFinished()
{
mIsPlasticInstalling = false;
}
bool InstallationFinished()
{
return mCancelButton.enabledSelf && IsExeAvailable.ForMode(mIsGluonMode);
}
void UpdateButtonsStatuses()
{
if (!string.IsNullOrEmpty(mProgressData.StatusMessage))
{
mCancelButton.SetEnabled(true);
mCancelButton.text = PlasticLocalization.Name.CloseButton.GetString();
mDownloadButton.Collapse();
return;
}
if (IsExeAvailable.ForMode(mIsGluonMode))
{
mCancelButton.SetEnabled(true);
return;
}
mDownloadButton.SetEnabled(false);
mCancelButton.SetEnabled(false);
}
static string GetMessageFromProgressData(ProgressControlsForDialogs.Data data)
{
if (!string.IsNullOrEmpty(data.StatusMessage))
{
return data.StatusMessage;
}
else
{
if (data.ProgressPercent >= 0)
return string.Format("{0} ({1}%)", data.ProgressMessage, (int)(data.ProgressPercent * 100));
else
return data.ProgressMessage;
}
}
void Dispose()
{
mDownloadButton.clicked -= DownloadButton_Clicked;
mCancelButton.clicked -= CancelButton_Clicked;
}
void BuildComponents()
{
VisualElement root = rootVisualElement;
root.Clear();
InitializeLayoutAndStyles();
mMessageLabel = root.Q<Label>("title");
mConfirmMessageLabel = root.Q<Label>("message");
mDownloadButton = root.Q<Button>("download");
mCancelButton = root.Q<Button>("cancel");
mProgressControlsContainer = root.Q<VisualElement>("progressControlsContainer");
mMessageLabel.text = PlasticLocalization.Name.InstallUnityVersionControl.GetString();
mConfirmMessageLabel.text = PlasticLocalization.Name.InstallConfirmationMessage.GetString();
mDownloadButton.text = PlasticLocalization.Name.YesButton.GetString();
mDownloadButton.clicked += DownloadButton_Clicked;
mCancelButton.text = PlasticLocalization.Name.NoButton.GetString();
mCancelButton.clicked += CancelButton_Clicked;
mProgressControls = new ProgressControlsForDialogs(
new VisualElement[] {
mDownloadButton,
mCancelButton
});
mProgressControlsContainer.Add(mProgressControls);
}
void InitializeLayoutAndStyles()
{
rootVisualElement.LoadLayout(typeof(DownloadPlasticExeDialog).Name);
rootVisualElement.LoadStyle(typeof(DownloadPlasticExeDialog).Name);
}
string mTitle;
Label mMessageLabel;
Label mConfirmMessageLabel;
Label mProgressLabel;
Button mDownloadButton;
Button mCancelButton;
ProgressControlsForDialogs mProgressControls;
VisualElement mProgressControlsContainer;
RepositorySpec mRepSpec;
string mInstallCloudFrom;
string mInstallEnterpriseFrom;
string mCancelInstallFrom;
string mInstallerFile;
bool mIsCloudEdition;
bool mIsGluonMode;
bool mIsPlasticInstalling;
ProgressControlsForDialogs.Data mProgressData;
const float DIALOG_WIDTH = 500;
const float DIALOG_HEIGHT = 250;
const float REDUCED_DIALOG_HEIGHT = 125;
}
}