using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEditor;
using UnityEngine;
namespace P4Connect
{
///
/// Enter Password Dialog
///
public class PasswordPrompt : EditorWindow
{
public static ConnectionConfig Cfg { set; get; }
public static bool Active { get; set; }
public static PasswordPrompt Instance
{
get { return _instance; }
}
private static string _newPassword;
private static PasswordPrompt _instance;
public static void Init()
{
if (Active)
{
Instance.Focus();
return;
}
Active = true;
_instance = ScriptableObject.CreateInstance(typeof(PasswordPrompt)) as PasswordPrompt;
if (Instance != null)
{
Config.Instance.DefaultConnection.FromConfig();
Cfg = Config.Instance.DefaultConnection;
_newPassword = Cfg.Password;
Instance.minSize = new UnityEngine.Vector2(300.0f, 200.0f);
#if UNITY_5
Instance.titleContent = new GUIContent("Password Entry");
#else
Instance.title = "Password Entry";
#endif
Instance.ShowUtility();
}
}
// Close PasswordPrompt Windows if any exist (after restart or run/ pause)
public static void CloseWindows()
{
PasswordPrompt[] windows = Resources.FindObjectsOfTypeAll();
if (windows != null)
{
foreach (var win in windows)
{
win.Close();
}
}
}
private static GUIStyle _pwStyle;
private static GUIStyle _labelStyle;
private static GUIStyle _boldLabelStyle;
private static GUIStyle _fatButtonStyle;
private static GUIStyle _rButtonStyle;
private static GUIStyle _gButtonStyle;
static readonly GUILayoutOption ButtonWidth = GUILayout.Width(100.0f);
static bool _stylesInitialized = false;
// Static initializer called ONCE from OnGUI() after initialization
private static void InitializeStyles()
{
GUI.skin = Config.GetP4Skin();
_fatButtonStyle = GUI.skin.GetStyle("fatButton");
_rButtonStyle = GUI.skin.GetStyle("redFatButton");
_gButtonStyle = GUI.skin.GetStyle("greenFatButton");
_pwStyle = new GUIStyle(GUI.skin.textField)
{
alignment = TextAnchor.MiddleLeft,
fontSize = 20,
border = new RectOffset(2, 2, 2, 2),
fixedHeight = 30,
};
_labelStyle = new GUIStyle(GUI.skin.label)
{
alignment = TextAnchor.MiddleCenter,
richText = true,
fontSize = 16,
};
_boldLabelStyle = new GUIStyle("boldLabel")
{
alignment = TextAnchor.MiddleCenter,
fontSize = 20,
};
_newPassword = "";
}
void OnFocus()
{
EditorGUI.FocusTextInControl("password");
}
void OnGUI()
{
if (!_stylesInitialized)
{
InitializeStyles();
_stylesInitialized = true;
}
if (Event.current.type == EventType.KeyDown &&
(Event.current.keyCode == KeyCode.KeypadEnter || Event.current.keyCode == KeyCode.Return))
{
if (tryNewPassword())
CloseWindows();
}
GUILayout.Label("Perforce Password Needed", _boldLabelStyle);
EditorGUILayout.BeginVertical("Box");
GUILayout.Label("Server: " + Cfg.Server + "", _labelStyle);
GUILayout.Label("Perforce User: " + Cfg.User + "", _labelStyle);
GUILayout.Label("", _labelStyle);
EditorGUILayout.BeginHorizontal();
GUI.SetNextControlName("password");
_newPassword = EditorGUILayout.PasswordField(_newPassword, _pwStyle);
GUILayout.EndHorizontal();
GUILayout.EndVertical();
GUILayout.FlexibleSpace();
EditorGUILayout.BeginHorizontal();
{
GUILayout.FlexibleSpace();
if (GUILayout.Button("Cancel", _rButtonStyle, ButtonWidth))
{
Active = false;
CloseWindows();
}
if (GUILayout.Button("Ok", Cfg.Password != _newPassword ? _gButtonStyle : _fatButtonStyle, ButtonWidth))
{
tryNewPassword();
Active = false;
CloseWindows();
}
}
GUILayout.EndHorizontal();
}
public void OnDestroy()
{
Active = false;
if (ConnectionWizard.Window != null)
{
ConnectionWizard.Window.Focus();
}
}
///
/// Try a new Password.
/// If the Connection Wizard is showing, focus there.
/// Copy test settings back to the Config
///
/// true, if User/Password combination verified
private bool tryNewPassword()
{
if (!_newPassword.Equals(Cfg.Password))
{
// Password was changed
Cfg.Password = _newPassword;
Cfg.PasswordChanged = true;
Cfg.PasswordValid = false;
Cfg.ToConfig();
Active = false;
if (Config.ConnectionWizardShowing)
{
ConnectionWizard.Window.Focus();
}
else
{
Config.Instance.DefaultConnection.FromConfig();
Config.Valid = Config.CheckSettings(Config.Instance.DefaultConnection);
Config.Refresh();
}
return true;
}
return false;
}
}
}