using System;
using UnityEditor;
using UnityEngine;
using Codice.Client.Common.WebApi;
using Codice.CM.Common;
using PlasticGui;
using PlasticGui.CloudDrive.Workspaces;
using Unity.PlasticSCM.Editor.UI;
using Unity.PlasticSCM.Editor.UI.Progress;
namespace Unity.PlasticSCM.Editor.CloudDrive.CreateWorkspace
{
internal class CreateWorkspaceView :
IPlasticDialogCloser
{
internal interface ICreateWorkspaceListener
{
void OnWorkspaceCreated(
WorkspaceCreationData wkCreationData, WorkspaceInfo createdWorkspace);
}
internal CreateWorkspaceView(
IPlasticWebRestApi restApi,
IPlasticAPI plasticApi,
ICreateWorkspaceListener listener,
EditorWindow parentWindow)
{
mPlasticApi = plasticApi;
mCreateWorkspaceListener = listener;
mParentWindow = parentWindow;
mProgressControls = new ProgressControlsForViews();
mCreateWorkspacePanel = new CreateWorkspacePanel(
string.Empty,
string.Empty,
restApi,
plasticApi,
parentWindow,
mProgressControls);
}
internal void Update()
{
mProgressControls.UpdateProgress(mParentWindow);
}
internal void OnGUI()
{
mCreateWorkspacePanel.OnGUI(mProgressControls.IsOperationRunning());
GUILayout.Space(15);
DoCreateWorkspaceArea(
mCreateWorkspacePanel.IsInputValid(),
mProgressControls,
CreateWorkspaceButtonValidationAction);
GUILayout.Space(15);
DoNotificationArea(mProgressControls.ProgressData);
}
void IPlasticDialogCloser.CloseDialog()
{
mWkCreationData.Result = true;
CreateWorkspaceOperation.CreateWorkspace(
mWkCreationData, mPlasticApi, mProgressControls,
(createdWorkspace) =>
{
mCreateWorkspaceListener.OnWorkspaceCreated(mWkCreationData, createdWorkspace);
});
}
void CreateWorkspaceButtonValidationAction()
{
mWkCreationData = mCreateWorkspacePanel.BuildCreationData();
// It calls IPlasticDialogCloser.CloseDialog() when the validation is OK
WorkspaceCreationValidation.AsyncValidation(
mWkCreationData, this, mProgressControls);
}
static void DoCreateWorkspaceArea(
bool isInputValid,
ProgressControlsForViews progressControls,
Action createWorkspaceButtonValidationAction)
{
Rect rect = EditorGUILayout.BeginHorizontal(GUILayout.Height(24));
bool isButtonEnabled = isInputValid && !progressControls.IsOperationRunning();
bool isButtonClicked = DoButton(
PlasticLocalization.Name.CreateCloudWorkspaceButton.GetString(),
GUI.skin.button,
isButtonEnabled,
CREATE_WORKSPACE_BUTTON_WIDTH,
CREATE_WORKSPACE_BUTTON_MARGIN,
rect.y + 2);
GUILayout.Space(5);
if (progressControls.IsOperationRunning())
DoProgress(progressControls.ProgressData);
EditorGUILayout.EndHorizontal();
if (isButtonClicked)
createWorkspaceButtonValidationAction();
}
static bool DoButton(
string text,
GUIStyle style,
bool isEnabled,
float width,
float x = -1,
float y = -1)
{
using (new GuiEnabled(isEnabled))
{
GUIContent buttonContent = new GUIContent(text);
Rect rect = GUILayoutUtility.GetRect(
buttonContent, style,
GUILayout.MinWidth(width),
GUILayout.MaxWidth(width));
if (x != -1)
rect.x = x;
if (y != -1)
rect.y = y;
bool result = GUI.Button(rect, buttonContent, style);
return result;
}
}
static void DoProgress(
ProgressControlsForViews.Data data)
{
if (string.IsNullOrEmpty(data.ProgressMessage))
return;
DrawProgressForViews.ForIndeterminateProgressSpinner(data);
}
static void DoNotificationArea(
ProgressControlsForViews.Data data)
{
if (string.IsNullOrEmpty(data.NotificationMessage))
return;
DrawProgressForViews.ForNotificationArea(data);
}
WorkspaceCreationData mWkCreationData;
readonly CreateWorkspacePanel mCreateWorkspacePanel;
readonly EditorWindow mParentWindow;
readonly ProgressControlsForViews mProgressControls;
readonly ICreateWorkspaceListener mCreateWorkspaceListener;
readonly IPlasticAPI mPlasticApi;
const float CREATE_WORKSPACE_BUTTON_MARGIN = 32;
const float CREATE_WORKSPACE_BUTTON_WIDTH = 160;
}
}