Files

462 lines
14 KiB
C#
Raw Normal View History

2026-01-08 16:50:20 +00:00
using System.Threading;
using UnityEditor;
using UnityEngine;
using Codice.Client.BaseCommands;
using Codice.Client.Common;
using Codice.Client.Common.Threading;
using Codice.Client.Common.WebApi;
using Codice.CM.Common;
using PlasticGui;
using Unity.PlasticSCM.Editor.Configuration.CloudEdition.Welcome;
using Unity.PlasticSCM.Editor.Tool;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.UI.Progress;
using Unity.PlasticSCM.Editor.Views.Welcome;
namespace Unity.PlasticSCM.Editor.CloudDrive.CreateWorkspace.Welcome
{
internal class WelcomeView : DownloadAndInstallOperation.INotify, AutoLogin.IWelcomeView
{
AutoLogin.State AutoLogin.IWelcomeView.AutoLoginState { get; set; }
internal interface ICloudDriveWindow
{
void ShowWorkspacesView();
}
internal WelcomeView(
EditorWindow parentWindow,
CreateWorkspaceView.ICreateWorkspaceListener listener,
ICloudDriveWindow cloudDriveWindow,
IPlasticAPI plasticApi,
IPlasticWebRestApi plasticWebRestApi)
{
mParentWindow = parentWindow;
mCreateWorkspaceListener = listener;
mCloudDriveWindow = cloudDriveWindow;
mPlasticApi = plasticApi;
mPlasticWebRestApi = plasticWebRestApi;
mConfigureProgress = new ProgressControlsForViews();
((AutoLogin.IWelcomeView)this).AutoLoginState = AutoLogin.State.Off;
CheckCloudDrive();
if (mIsCloudDriveRunning)
return;
mCheckCloudDriveTimer = new UnityPlasticTimer(
UnityConstants.CHECK_CLOUD_DRIVE_EXE_DELAYED_INTERVAL_MS,
CheckCloudDrive);
mCheckCloudDriveTimer.Start();
}
internal void Update()
{
if (mCreateWorkspaceView != null)
mCreateWorkspaceView.Update();
if (mIsDownloading)
mConfigureProgress.UpdateProgress(mParentWindow);
}
internal void OnDisable()
{
if (mCheckCloudDriveTimer != null)
mCheckCloudDriveTimer.Stop();
}
internal void OnGUI(Rect rect, bool clientNeedsConfiguration)
{
GUILayout.BeginArea(rect);
GUILayout.BeginHorizontal();
GUILayout.Space(HORIZONTAL_MARGIN);
DoContentViewArea(
clientNeedsConfiguration,
mIsCreateWorkspaceButtonClicked);
GUILayout.Space(HORIZONTAL_MARGIN);
GUILayout.EndHorizontal();
GUILayout.EndArea();
}
void DownloadAndInstallOperation.INotify.InstallationStarted()
{
mIsInstalling = true;
}
void DownloadAndInstallOperation.INotify.InstallationFinished()
{
mIsInstalling = false;
}
void DownloadAndInstallOperation.INotify.DownloadStarted()
{
mIsDownloading = true;
}
void DownloadAndInstallOperation.INotify.DownloadFinished()
{
mIsDownloading = false;
}
void AutoLogin.IWelcomeView.OnUserClosedConfigurationWindow()
{
((IProgressControls)mConfigureProgress).HideProgress();
ClientConfig.Reset();
CmConnection.ResetForTesting();
ClientHandlers.Register();
}
void DoContentViewArea(
bool clientNeedsConfiguration,
bool isCreateWorkspaceButtonClicked)
{
GUILayout.BeginVertical();
GUILayout.Space(TOP_MARGIN);
if (isCreateWorkspaceButtonClicked ||
!PlasticGuiConfig.Get().Configuration.ShowCloudDriveWelcomeView)
GetCreateWorkspaceView().OnGUI();
else
DoSetupViewArea(
clientNeedsConfiguration,
mConfigureProgress);
GUILayout.EndVertical();
}
void DoSetupViewArea(
bool clientNeedsConfiguration,
ProgressControlsForViews configureProgress)
{
using (new GUILayout.VerticalScope(GUILayout.MaxWidth(MAX_WIDTH)))
{
DoTitleArea();
DoSubTitleArea();
if (!clientNeedsConfiguration)
mIsStep1Completed = true;
bool isStep2Completed = mIsCloudDriveExeAvailable && !mIsInstalling;
bool isStep3Completed = mIsCloudDriveRunning;
DoStepsArea(
mIsStep1Completed,
isStep2Completed,
isStep3Completed,
configureProgress.ProgressData);
GUILayout.Space(BUTTON_MARGIN);
using (new GUILayout.HorizontalScope())
{
GUI.enabled = !configureProgress.IsOperationRunning();
DoActionButton(
mIsStep1Completed,
isStep2Completed,
isStep3Completed,
configureProgress);
GUI.enabled = true;
GUILayout.Space(BUTTON_MARGIN);
DoNotificationArea(configureProgress.ProgressData, mIsDownloading);
}
}
}
void DoActionButton(
bool isStep1Completed,
bool isStep2Completed,
bool isStep3Completed,
ProgressControlsForViews configureProgress)
{
if (!isStep1Completed)
{
DoConfigureButton(configureProgress);
return;
}
if (!isStep2Completed)
{
if (GUILayout.Button(
PlasticLocalization.Name.InstallCloudDriveButton.GetString(),
GUILayout.Width(BUTTON_WIDTH)))
{
DownloadAndInstallOperation.Run(
Edition.Cloud,
configureProgress,
new CancellationToken(),
this);
}
return;
}
if (!isStep3Completed)
{
if (GUILayout.Button(
PlasticLocalization.Name.StartCloudDriveButton.GetString(),
GUILayout.Width(BUTTON_WIDTH)))
{
ProcessExecutor.Execute(
GetProcessName.ForUnityCloudDrive(),
string.Empty,
false,
false);
((IProgressControls)configureProgress).ShowProgress(
PlasticLocalization.Name.StartCloudDriveProgress.GetString());
}
return;
}
if (GUILayout.Button(
PlasticLocalization.Name.GetStartedButton.GetString(),
GUILayout.Width(BUTTON_WIDTH)))
{
PlasticGuiConfig.Get().Configuration.ShowCloudDriveWelcomeView = false;
PlasticGuiConfig.Get().Save();
if (CloudDriveWindow.HasCloudDriveWorkspaces())
{
mCloudDriveWindow.ShowWorkspacesView();
return;
}
mIsCreateWorkspaceButtonClicked = true;
}
}
void DoConfigureButton(ProgressControlsForViews configureProgress)
{
bool isAutoLoginRunning =
((AutoLogin.IWelcomeView)this).AutoLoginState >= AutoLogin.State.Running &&
((AutoLogin.IWelcomeView)this).AutoLoginState <= AutoLogin.State.ResponseSuccess;
GUI.enabled = !(configureProgress.IsOperationRunning() || isAutoLoginRunning);
if (GUILayout.Button(PlasticLocalization.GetString(
PlasticLocalization.Name.LoginOrSignUp),
GUILayout.Width(BUTTON_WIDTH)))
{
if (new AutoLogin().Run(this))
{
return;
}
// If AutoLogin failed with No Token the Login button opens the manual Cloud sign up
((IProgressControls)configureProgress).ShowProgress(string.Empty);
CloudEditionWelcomeWindow.ShowWindow(mPlasticWebRestApi, this);
GUIUtility.ExitGUI();
}
GUILayout.FlexibleSpace();
GUI.enabled = true;
}
void CheckCloudDrive()
{
mIsCloudDriveExeAvailable = IsExeAvailable.ForCloudDrive();
if (!mIsCloudDriveExeAvailable)
return;
mIsCloudDriveRunning = UnityCloudDriveProcess.IsRunning();
if (!mIsCloudDriveRunning)
return;
if (mCheckCloudDriveTimer != null)
mCheckCloudDriveTimer.Stop();
((IProgressControls)mConfigureProgress).HideProgress();
}
CreateWorkspaceView GetCreateWorkspaceView()
{
if (mCreateWorkspaceView != null)
return mCreateWorkspaceView;
mCreateWorkspaceView = new CreateWorkspaceView(
mPlasticWebRestApi,
mPlasticApi,
mCreateWorkspaceListener,
mParentWindow);
return mCreateWorkspaceView;
}
static void DoTitleArea()
{
using (new GUILayout.HorizontalScope())
{
Rect imageRect = GUILayoutUtility.GetRect(
32, 32, GUILayout.Width(32), GUILayout.Height(32));
GUI.DrawTexture(imageRect, Images.GetCloudIcon(), ScaleMode.ScaleToFit);
GUILayout.Label(
PlasticLocalization.Name.UnityCloudDriveTitle.GetString(),
UnityStyles.CloudDrive.Title);
GUILayout.FlexibleSpace();
}
GUILayout.Space(10);
Rect result = GUILayoutUtility.GetRect(MAX_WIDTH, 1);
EditorGUI.DrawRect(result, UnityStyles.Colors.BarBorder);
GUILayout.Space(10);
}
static void DoSubTitleArea()
{
GUILayout.Label(
PlasticLocalization.Name.GetStartedTitle.GetString(),
UnityStyles.Dialog.Title);
GUILayout.Space(5);
GUILayout.Label(
PlasticLocalization.Name.GetStartedExplanation.GetString(),
UnityStyles.Paragraph);
GUILayout.Space(10);
}
static void DoStepsArea(
bool isStep1Completed,
bool isStep2Completed,
bool isStep3Completed,
ProgressControlsForViews.Data configureProgressData)
{
DoStep(
isStep1Completed,
Images.GetStep1Icon(),
GetConfigurationStepText(
PlasticLocalization.Name.LoginCloudDriveStep.GetString(),
configureProgressData,
!isStep1Completed));
DoStep(
isStep2Completed,
Images.GetStep2Icon(),
GetConfigurationStepText(
PlasticLocalization.Name.DownloadCloudDriveStep.GetString(),
configureProgressData,
isStep1Completed && !isStep2Completed));
DoStep(
isStep3Completed,
Images.GetStep3Icon(),
GetConfigurationStepText(
PlasticLocalization.Name.StartCloudDriveStep.GetString(),
configureProgressData,
isStep2Completed && !isStep3Completed));
}
static void DoStep(
bool isStepCompleted,
Texture2D stepIcon,
string stepText)
{
Texture2D stepImage = isStepCompleted ? Images.GetStepOkIcon() : stepIcon;
GUIStyle style = new GUIStyle(EditorStyles.label);
style.richText = true;
GUILayout.BeginHorizontal();
DoStepLabel(stepText, stepImage, style);
GUILayout.EndHorizontal();
}
static void DoStepLabel(
string text,
Texture2D image,
GUIStyle style)
{
GUILayout.Space(STEPS_LEFT_MARGIN);
GUIContent stepLabelContent = new GUIContent(
string.Format(" {0}", text),
image);
GUILayout.Label(
stepLabelContent,
style,
GUILayout.Height(STEP_LABEL_HEIGHT));
}
static void DoNotificationArea(
ProgressControlsForViews.Data configureProgressData,
bool isDownloading)
{
if (!configureProgressData.IsOperationRunning)
return;
if (isDownloading)
{
DrawProgressForViews.ForDeterminateProgressBar(configureProgressData);
return;
}
DrawProgressForViews.ForIndeterminateProgressSpinner(configureProgressData);
}
static string GetConfigurationStepText(
string text,
ProgressControlsForViews.Data progressData,
bool isCurrentStep)
{
if (!isCurrentStep)
return text;
if (!progressData.IsOperationRunning)
return text;
return string.Format("<b>{0}</b>", text);
}
bool mIsCloudDriveRunning;
bool mIsCloudDriveExeAvailable;
bool mIsCreateWorkspaceButtonClicked;
bool mIsInstalling;
bool mIsDownloading;
bool mIsStep1Completed;
CreateWorkspaceView mCreateWorkspaceView;
readonly IPlasticTimer mCheckCloudDriveTimer;
readonly ProgressControlsForViews mConfigureProgress;
readonly IPlasticAPI mPlasticApi;
readonly IPlasticWebRestApi mPlasticWebRestApi;
readonly CreateWorkspaceView.ICreateWorkspaceListener mCreateWorkspaceListener;
readonly ICloudDriveWindow mCloudDriveWindow;
readonly EditorWindow mParentWindow;
const int HORIZONTAL_MARGIN = 30;
const int TOP_MARGIN = 20;
const int STEPS_LEFT_MARGIN = 12;
const int BUTTON_MARGIN = 10;
const int STEP_LABEL_HEIGHT = 20;
const int BUTTON_WIDTH = 170;
const float MAX_WIDTH = 800;
}
}