Files
2025-11-30 08:35:03 +02:00

213 lines
6.2 KiB
C#

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using Codice.Client.Common;
using Codice.Client.Common.Authentication;
using Codice.Client.Common.Connection;
using Codice.Client.Common.WebApi;
using Codice.Client.Common.WebApi.Responses;
using Codice.CM.Common;
using Codice.LogWrapper;
using PlasticGui;
using Unity.PlasticSCM.Editor.UI.Progress;
using Unity.PlasticSCM.Editor.Views.Welcome;
namespace Unity.PlasticSCM.Editor.Configuration.CloudEdition.Welcome
{
internal interface IWelcomeWindowNotify
{
void ProcessLoginResponseWithOrganizations(Credentials credentials, List<string> cloudServers);
void Back();
}
internal class CloudEditionWelcomeWindow :
EditorWindow, IWelcomeWindowNotify, OAuthSignIn.INotify, GetCloudOrganizations.INotify
{
internal static void ShowWindow(
IPlasticWebRestApi restApi,
WelcomeView welcomeView,
bool autoLogin = false)
{
sRestApi = restApi;
sAutoLogin = autoLogin;
CloudEditionWelcomeWindow window = GetWindow<CloudEditionWelcomeWindow>();
window.titleContent = new GUIContent(
PlasticLocalization.GetString(PlasticLocalization.Name.SignInToUnityVCS));
window.minSize = window.maxSize = new Vector2(450, 300);
window.mWelcomeView = welcomeView;
window.Show();
}
internal static CloudEditionWelcomeWindow GetWelcomeWindow()
{
return GetWindow<CloudEditionWelcomeWindow>();
}
internal void CancelJoinOrganization()
{
if (sAutoLogin)
{
mLog.Debug("CancelJoinOrganization");
GetWindow<PlasticWindow>().GetWelcomeView().autoLoginState = AutoLogin.State.Started;
}
}
internal void ReplaceRootPanel(VisualElement panel)
{
rootVisualElement.Clear();
rootVisualElement.Add(panel);
}
internal SignInPanel GetSignInPanel()
{
return mSignInPanel;
}
internal void GetOrganizations(Credentials credentials)
{
mCredentials = credentials;
GetCloudOrganizations.GetOrganizationsInThreadWaiter(
mCredentials.User.Data,
mCredentials.User.Password,
new ProgressControlsForDialogs(),
this,
sRestApi,
CmConnection.Get());
}
void ShowOrganizationsPanel(
Credentials credentials, List<string> cloudServers, string errorMessage)
{
mLog.DebugFormat("ShowOrganizationsPanel({0}, {1} orgs) {2}",
credentials.Mode, cloudServers.Count, errorMessage);
mOrganizationPanel = new OrganizationPanel(
this,
cloudServers,
errorMessage,
GetWindowTitle(),
joinedOrganization =>
{
mLog.DebugFormat("JoinedOrganization: {0}", joinedOrganization);
ClientConfiguration.Save(
joinedOrganization,
credentials.Mode,
credentials.User.Data,
credentials.User.Password);
});
ReplaceRootPanel(mOrganizationPanel);
}
string GetWindowTitle()
{
return PlasticLocalization.Name.SignInToUnityVCS.GetString();
}
void OnEnable()
{
BuildComponents();
}
void OnDestroy()
{
Dispose();
if (mWelcomeView != null)
mWelcomeView.OnUserClosedConfigurationWindow();
}
void Dispose()
{
if (mSignInPanel != null)
mSignInPanel.Dispose();
if (mOrganizationPanel != null)
mOrganizationPanel.Dispose();
}
// Used by WaitingSignInPanel
void OAuthSignIn.INotify.SignedInForCloud(
string chosenProviderName, Credentials credentials)
{
mLog.Debug("SignedInForCloud");
GetOrganizations(credentials);
}
void OAuthSignIn.INotify.SignedInForOnPremise(
string server, string proxy, Credentials credentials)
{
// Won't run
}
void OAuthSignIn.INotify.Cancel(string message)
{
mLog.Debug("Cancel");
Focus();
}
void GetCloudOrganizations.INotify.CloudOrganizationsRetrieved(List<string> cloudServers)
{
ShowOrganizationsPanel(mCredentials, cloudServers, errorMessage: null);
}
void GetCloudOrganizations.INotify.Error(ErrorResponse.ErrorFields error)
{
ShowOrganizationsPanel(mCredentials, cloudServers: null, errorMessage: error.Message);
}
void IWelcomeWindowNotify.ProcessLoginResponseWithOrganizations(
Credentials credentials, List<string> cloudServers)
{
mLog.DebugFormat("ProcessLoginResponseWithOrganizations: {0} orgs", cloudServers.Count);
mCredentials = credentials;
ShowOrganizationsPanel(mCredentials, cloudServers, errorMessage: null);
}
void IWelcomeWindowNotify.Back()
{
rootVisualElement.Clear();
rootVisualElement.Add(mSignInPanel);
}
void BuildComponents()
{
VisualElement root = rootVisualElement;
root.Clear();
mSignInPanel = new SignInPanel(this, sRestApi);
titleContent = new GUIContent(GetWindowTitle());
root.Add(mSignInPanel);
if (sAutoLogin)
{
mSignInPanel.SignInWithUnityIdButtonAutoLogin();
}
}
string mUserName;
Credentials mCredentials;
OrganizationPanel mOrganizationPanel;
SignInPanel mSignInPanel;
WelcomeView mWelcomeView;
static IPlasticWebRestApi sRestApi;
static bool sAutoLogin = false;
static readonly ILog mLog = PlasticApp.GetLogger("CloudEditionWelcomeWindow");
}
}