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.DefaultConnection.FromConfig(); Cfg = Config.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 = ConfigWindow.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); GUILayout.EndVertical(); EditorGUILayout.BeginHorizontal(); GUI.SetNextControlName("password"); _newPassword = EditorGUILayout.PasswordField(_newPassword, _pwStyle); GUILayout.EndHorizontal(); 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 (ConfigWindow.ConnectionWizardShowing) { ConnectionWizard.Window.Focus(); } else { Config.DefaultConnection.FromConfig(); Config.Valid = Config.CheckSettings(Config.DefaultConnection); ConfigWindow.Refresh(); } return true; } return false; } } }