2021-06-25 07:50:12 -04:00

460 lines
14 KiB
C#

using UnityEditor;
using UnityEngine;
using Codice.Client.Common;
using Codice.CM.Common;
using PlasticGui;
using PlasticGui.WebApi;
using Unity.PlasticSCM.Editor.AssetUtils;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.Views.CreateWorkspace;
using Unity.PlasticSCM.Editor.UI.Progress;
namespace Unity.PlasticSCM.Editor.Views.Welcome
{
internal class WelcomeView
{
internal WelcomeView(
EditorWindow parentWindow,
CreateWorkspaceView.ICreateWorkspaceListener createWorkspaceListener,
PlasticAPI plasticApi,
IPlasticWebRestApi plasticWebRestApi)
{
mParentWindow = parentWindow;
mCreateWorkspaceListener = createWorkspaceListener;
mPlasticApi = plasticApi;
mPlasticWebRestApi = plasticWebRestApi;
mGuiMessage = new UnityPlasticGuiMessage(parentWindow);
mDownloadProgress = new ProgressControlsForViews();
mConfigureProgress = new ProgressControlsForViews();
mInstallerFile = GetInstallerTmpFileName.ForPlatform();
}
internal void Update()
{
if (mCreateWorkspaceView != null)
mCreateWorkspaceView.Update();
mDownloadProgress.UpdateDeterminateProgress(mParentWindow);
mConfigureProgress.UpdateDeterminateProgress(mParentWindow);
}
internal void OnGUI(
bool isPlasticExeAvailable,
bool clientNeedsConfiguration,
bool isGluonMode)
{
GUILayout.BeginHorizontal();
GUILayout.Space(LEFT_MARGIN);
DoContentViewArea(
isPlasticExeAvailable,
clientNeedsConfiguration,
isGluonMode,
mIsCreateWorkspaceButtonClicked,
mInstallerFile,
mGuiMessage,
mDownloadProgress,
mConfigureProgress);
GUILayout.EndHorizontal();
}
void DoContentViewArea(
bool isPlasticExeAvailable,
bool clientNeedsConfiguration,
bool isGluonMode,
bool isCreateWorkspaceButtonClicked,
string installerFile,
GuiMessage.IGuiMessage guiMessage,
ProgressControlsForViews downloadProgress,
ProgressControlsForViews configureProgress)
{
GUILayout.BeginVertical();
GUILayout.Space(TOP_MARGIN);
if (isCreateWorkspaceButtonClicked)
GetCreateWorkspaceView().OnGUI();
else
DoSetupViewArea(
isPlasticExeAvailable,
clientNeedsConfiguration,
isGluonMode,
mInstallerFile,
mGuiMessage,
mDownloadProgress,
mConfigureProgress);
GUILayout.EndVertical();
}
void DoSetupViewArea(
bool isPlasticExeAvailable,
bool clientNeedsConfiguration,
bool isGluonMode,
string installerFile,
GuiMessage.IGuiMessage guiMessage,
ProgressControlsForViews downloadProgress,
ProgressControlsForViews configureProgress)
{
DoTitleLabel();
GUILayout.Space(STEPS_TOP_MARGIN);
bool isStep1Completed =
isPlasticExeAvailable &
!downloadProgress.ProgressData.IsOperationRunning;
bool isStep2Completed =
isStep1Completed &
!clientNeedsConfiguration &
!configureProgress.ProgressData.IsOperationRunning;
DoStepsArea(
isStep1Completed,
isStep2Completed,
downloadProgress.ProgressData,
configureProgress.ProgressData);
GUILayout.Space(BUTTON_MARGIN);
DoActionButtonsArea(
isStep1Completed,
isStep2Completed,
isGluonMode,
installerFile,
guiMessage,
downloadProgress,
configureProgress);
DoNotificationArea(
downloadProgress.ProgressData,
configureProgress.ProgressData);
}
void DoActionButtonsArea(
bool isStep1Completed,
bool isStep2Completed,
bool isGluonMode,
string installerFile,
GuiMessage.IGuiMessage guiMessage,
ProgressControlsForViews downloadProgress,
ProgressControlsForViews configureProgress)
{
GUILayout.BeginHorizontal();
DoActionButton(
isStep1Completed,
isStep2Completed,
isGluonMode,
installerFile,
guiMessage,
downloadProgress,
configureProgress);
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
}
void DoActionButton(
bool isStep1Completed,
bool isStep2Completed,
bool isGluonMode,
string installerFile,
GuiMessage.IGuiMessage guiMessage,
ProgressControlsForViews downloadProgress,
ProgressControlsForViews configureProgress)
{
if (!isStep1Completed)
{
DoInstallButton(
downloadProgress, guiMessage, installerFile);
return;
}
if (!isStep2Completed)
{
DoConfigureButton(
isGluonMode, configureProgress);
return;
}
if (GUILayout.Button(PlasticLocalization.GetString(PlasticLocalization.Name.CreateWorkspace),
GUILayout.Width(BUTTON_WIDTH)))
mIsCreateWorkspaceButtonClicked = true;
}
static void DoInstallButton(
ProgressControlsForViews downloadProgress,
GuiMessage.IGuiMessage guiMessage,
string installerFile)
{
GUI.enabled = !downloadProgress.ProgressData.IsOperationRunning;
if (GUILayout.Button(PlasticLocalization.GetString(PlasticLocalization.Name.InstallPlasticSCM),
GUILayout.Width(BUTTON_WIDTH)))
{
Edition plasticEdition;
if (TryGetPlasticEditionToDownload(
guiMessage, out plasticEdition))
{
DownloadAndInstallOperation.Run(
plasticEdition, installerFile,
downloadProgress);
GUIUtility.ExitGUI();
}
}
GUI.enabled = true;
}
static void DoConfigureButton(
bool isGluonMode,
ProgressControlsForViews configureProgress)
{
GUI.enabled = !configureProgress.ProgressData.IsOperationRunning;
if (GUILayout.Button(PlasticLocalization.GetString(PlasticLocalization.Name.LoginOrSignUp),
GUILayout.Width(BUTTON_WIDTH)))
{
ConfigurePlasticOperation.Run(
isGluonMode,
configureProgress);
GUIUtility.ExitGUI();
}
GUI.enabled = true;
}
static void DoStepsArea(
bool isStep1Completed,
bool isStep2Completed,
ProgressControlsForViews.Data downloadProgressData,
ProgressControlsForViews.Data configureProgressData)
{
DoDownloadAndInstallStep(
isStep1Completed,
downloadProgressData);
DoLoginOrSignUpStep(
isStep2Completed,
configureProgressData);
DoCreatePlasticWorkspaceStep();
}
static void DoDownloadAndInstallStep(
bool isStep1Completed,
ProgressControlsForViews.Data progressData)
{
Images.Name stepImage = (isStep1Completed) ?
Images.Name.StepOk :
Images.Name.Step1;
string stepText = GetDownloadStepText(
progressData,
isStep1Completed);
GUIStyle style = new GUIStyle(EditorStyles.label);
style.richText = true;
GUILayout.BeginHorizontal();
DoStepLabel(
stepText,
stepImage,
style);
GUILayout.EndHorizontal();
}
static void DoLoginOrSignUpStep(
bool isStep2Completed,
ProgressControlsForViews.Data progressData)
{
Images.Name stepImage = (isStep2Completed) ?
Images.Name.StepOk :
Images.Name.Step2;
string stepText = GetConfigurationStepText(
progressData,
isStep2Completed);
GUIStyle style = new GUIStyle(EditorStyles.label);
style.richText = true;
GUILayout.BeginHorizontal();
DoStepLabel(
stepText,
stepImage,
style);
GUILayout.EndHorizontal();
}
static void DoCreatePlasticWorkspaceStep()
{
GUILayout.BeginHorizontal();
DoStepLabel(
PlasticLocalization.GetString(PlasticLocalization.Name.CreateAPlasticWorkspace),
Images.Name.Step3,
EditorStyles.label);
GUILayout.EndHorizontal();
}
static void DoStepLabel(
string text,
Images.Name imageName,
GUIStyle style)
{
GUILayout.Space(STEPS_LEFT_MARGIN);
GUIContent stepLabelContent = new GUIContent(
string.Format(" {0}", text),
Images.GetImage(imageName));
GUILayout.Label(
stepLabelContent,
style,
GUILayout.Height(STEP_LABEL_HEIGHT));
}
static void DoTitleLabel()
{
GUIContent labelContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.Name.NextStepsToSetup),
Images.GetInfoIcon());
GUILayout.Label(labelContent, EditorStyles.boldLabel);
}
static void DoNotificationArea(
ProgressControlsForViews.Data downloadProgressData,
ProgressControlsForViews.Data configureProgressData)
{
if (!string.IsNullOrEmpty(downloadProgressData.NotificationMessage))
DrawProgressForViews.ForNotificationArea(downloadProgressData);
if (!string.IsNullOrEmpty(configureProgressData.NotificationMessage))
DrawProgressForViews.ForNotificationArea(configureProgressData);
}
static string GetDownloadStepText(
ProgressControlsForViews.Data progressData,
bool isStep1Completed)
{
string result = PlasticLocalization.GetString(PlasticLocalization.Name.DownloadAndInstall);
if (isStep1Completed)
return result;
if (progressData.IsOperationRunning)
result = string.Format("<b>{0}</b> - ", result);
result += progressData.ProgressMessage;
if (progressData.IsOperationRunning && progressData.ProgressPercent >= 0)
{
result += string.Format(
" {0}%", progressData.ProgressPercent * 100);
}
return result;
}
static string GetConfigurationStepText(
ProgressControlsForViews.Data progressData,
bool isStep2Completed)
{
string result = PlasticLocalization.GetString(PlasticLocalization.Name.LoginOrSignUpPlastic);
if (isStep2Completed)
return result;
if (!progressData.IsOperationRunning)
return result;
return string.Format("<b>{0}</b>", result);
}
static bool TryGetPlasticEditionToDownload(
GuiMessage.IGuiMessage guiMessage,
out Edition plasticEdition)
{
plasticEdition = Edition.Cloud;
if (EditionToken.IsCloudEdition())
return true;
GuiMessage.GuiMessageResponseButton result = guiMessage.ShowQuestion(
PlasticLocalization.GetString(PlasticLocalization.Name.PlasticSCM),
PlasticLocalization.GetString(PlasticLocalization.Name.WhichVersionInstall),
PlasticLocalization.GetString(PlasticLocalization.Name.DownloadCloudEdition),
PlasticLocalization.GetString(PlasticLocalization.Name.DownloadEnterpriseEdition),
PlasticLocalization.GetString(PlasticLocalization.Name.CancelButton),
true);
if (result == GuiMessage.GuiMessageResponseButton.Third)
return false;
if (result == GuiMessage.GuiMessageResponseButton.First)
return true;
plasticEdition = Edition.Enterprise;
return true;
}
CreateWorkspaceView GetCreateWorkspaceView()
{
if (mCreateWorkspaceView != null)
return mCreateWorkspaceView;
string workspacePath = ProjectPath.FromApplicationDataPath(
Application.dataPath);
mCreateWorkspaceView = new CreateWorkspaceView(
mParentWindow,
mCreateWorkspaceListener,
mPlasticApi,
mPlasticWebRestApi,
workspacePath);
return mCreateWorkspaceView;
}
string mInstallerFile;
bool mIsCreateWorkspaceButtonClicked = false;
CreateWorkspaceView mCreateWorkspaceView;
readonly ProgressControlsForViews mDownloadProgress;
readonly ProgressControlsForViews mConfigureProgress;
readonly GuiMessage.IGuiMessage mGuiMessage;
readonly PlasticAPI mPlasticApi;
readonly IPlasticWebRestApi mPlasticWebRestApi;
readonly CreateWorkspaceView.ICreateWorkspaceListener mCreateWorkspaceListener;
readonly EditorWindow mParentWindow;
const int LEFT_MARGIN = 30;
const int TOP_MARGIN = 20;
const int STEPS_TOP_MARGIN = 5;
const int STEPS_LEFT_MARGIN = 12;
const int BUTTON_MARGIN = 10;
const int STEP_LABEL_HEIGHT = 20;
const int BUTTON_WIDTH = 170;
const string DOWNLOAD_URL = @"https://www.plasticscm.com/download";
}
}