123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411 |
- using System;
- using System.Collections.Generic;
-
- using UnityEditor;
- using UnityEngine;
-
- using PlasticGui;
-
- namespace Unity.PlasticSCM.Editor.UI
- {
- internal abstract class PlasticDialog : EditorWindow, IPlasticDialogCloser
- {
- protected virtual Rect DefaultRect
- {
- get
- {
- int pixelWidth = Screen.currentResolution.width;
- float x = (pixelWidth - DEFAULT_WIDTH) / 2;
- return new Rect(x, 200, DEFAULT_WIDTH, DEFAULT_HEIGHT);
- }
- }
-
- protected virtual bool IsResizable { get; set; }
-
- internal void OkButtonAction()
- {
- CompleteModal(ResponseType.Ok);
- }
-
- internal void CancelButtonAction()
- {
- CompleteModal(ResponseType.Cancel);
- }
-
- internal void CloseButtonAction()
- {
- CompleteModal(ResponseType.None);
- }
-
- internal void ApplyButtonAction()
- {
- CompleteModal(ResponseType.Apply);
- }
-
- internal ResponseType RunModal(EditorWindow parentWindow)
- {
- InitializeVars(parentWindow);
-
- if (!IsResizable)
- MakeNonResizable();
-
- if (UI.RunModal.IsAvailable())
- {
- UI.RunModal.Dialog(this);
- return mAnswer;
- }
-
- EditorUtility.DisplayDialog(
- PlasticLocalization.GetString(PlasticLocalization.Name.UnityVersionControl),
- PlasticLocalization.GetString(PlasticLocalization.Name.PluginModalInformation),
- PlasticLocalization.GetString(PlasticLocalization.Name.CloseButton));
- return ResponseType.None;
- }
-
- protected void OnGUI()
- {
- try
- {
- // If the Dialog has been saved into the Unity editor layout and persisted between restarts, the methods
- // to configure the dialogs will be skipped. Simple fix here is to close it when this state is detected.
- // Fixes a NPE loop when the state mentioned above is occurring.
- if (!mIsConfigured)
- {
- mIsClosed = true;
- Close();
- return;
- }
-
- if (Event.current.type == EventType.Layout)
- {
- EditorDispatcher.Update();
- }
-
- if (!mFocusedOnce)
- {
- // Somehow the prevents the dialog from jumping when dragged
- // NOTE(rafa): We cannot do every frame because the modal kidnaps focus for all processes (in mac at least)
- Focus();
- mFocusedOnce = true;
- }
-
- ProcessKeyActions();
-
- if (mIsClosed)
- return;
-
- GUI.Box(new Rect(0, 0, position.width, position.height), GUIContent.none, EditorStyles.label);
-
- float margin = 25;
- float marginTop = 25;
- using (new EditorGUILayout.HorizontalScope(GUILayout.Height(position.height)))
- {
- GUILayout.Space(margin);
- using (new EditorGUILayout.VerticalScope(GUILayout.Height(position.height)))
- {
- GUILayout.Space(marginTop);
- OnModalGUI();
- GUILayout.Space(margin);
- }
- GUILayout.Space(margin);
- }
-
- var lastRect = GUILayoutUtility.GetLastRect();
- float desiredHeight = lastRect.yMax;
- Rect newPos = position;
- newPos.height = desiredHeight;
- if (position.height < desiredHeight)
- position = newPos;
-
- if (Event.current.type == EventType.Repaint)
- {
- if (mIsCompleted)
- {
- mIsClosed = true;
- Close();
- }
- }
- }
- finally
- {
- if (mIsClosed)
- EditorGUIUtility.ExitGUI();
- }
- }
-
- void OnDestroy()
- {
- if (!mIsConfigured)
- return;
-
- SaveSettings();
-
- if (mParentWindow == null)
- return;
-
- mParentWindow.Focus();
- }
-
- protected virtual void SaveSettings() { }
- protected abstract void OnModalGUI();
- protected abstract string GetTitle();
-
- protected void Paragraph(string text)
- {
- GUILayout.Label(text, UnityStyles.Paragraph);
- GUILayout.Space(DEFAULT_PARAGRAPH_SPACING);
- }
-
- protected void TextBlockWithEndLink(
- string url, string formattedExplanation,
- GUIStyle textblockStyle)
- {
- DrawTextBlockWithEndLink.For(url, formattedExplanation, textblockStyle);
- }
-
- protected static void Title(string text)
- {
- GUILayout.Label(text, UnityStyles.Dialog.Toggle);
- }
-
- protected static bool TitleToggle(string text, bool isOn)
- {
- return EditorGUILayout.ToggleLeft(text, isOn, UnityStyles.Dialog.Toggle);
- }
-
- protected static bool TitleToggle(string text, bool isOn, GUIStyle style)
- {
- return EditorGUILayout.ToggleLeft(text, isOn, style);
- }
-
- protected static string TextEntry(
- string label,
- string value,
- float width,
- float x)
- {
- return TextEntry(
- label,
- value,
- null,
- width,
- x);
- }
-
- protected static string TextEntry(
- string label, string value, string controlName, float width, float x)
- {
- using (new EditorGUILayout.HorizontalScope())
- {
- EntryLabel(label);
-
- GUILayout.FlexibleSpace();
-
- var rt = GUILayoutUtility.GetRect(
- new GUIContent(value), UnityStyles.Dialog.EntryLabel);
- rt.width = width;
- rt.x = x;
-
- if (!string.IsNullOrEmpty(controlName))
- GUI.SetNextControlName(controlName);
-
- return GUI.TextField(rt, value);
- }
- }
-
- protected static string ComboBox(
- string label,
- string value,
- string controlName,
- List<string> dropDownOptions,
- GenericMenu.MenuFunction2 optionSelected,
- float width,
- float x)
- {
- using (new EditorGUILayout.HorizontalScope())
- {
- EntryLabel(label);
-
- GUILayout.FlexibleSpace();
-
- var rt = GUILayoutUtility.GetRect(
- new GUIContent(value), UnityStyles.Dialog.EntryLabel);
- rt.width = width;
- rt.x = x;
-
- return DropDownTextField.DoDropDownTextField(
- value,
- label,
- dropDownOptions,
- optionSelected,
- rt);
- }
- }
-
- protected static string PasswordEntry(
- string label, string value, float width, float x)
- {
- using (new EditorGUILayout.HorizontalScope())
- {
- EntryLabel(label);
-
- GUILayout.FlexibleSpace();
-
- var rt = GUILayoutUtility.GetRect(
- new GUIContent(value), UnityStyles.Dialog.EntryLabel);
- rt.width = width;
- rt.x = x;
-
- return GUI.PasswordField(rt, value, '*');
- }
- }
-
- protected static bool ToggleEntry(
- string label, bool value, float width, float x)
- {
- var rt = GUILayoutUtility.GetRect(
- new GUIContent(label), UnityStyles.Dialog.EntryLabel);
- rt.width = width;
- rt.x = x;
-
- return GUI.Toggle(rt, value, label);
- }
-
- protected static bool NormalButton(string text)
- {
- return GUILayout.Button(
- text, UnityStyles.Dialog.NormalButton,
- GUILayout.MinWidth(80),
- GUILayout.Height(25));
- }
-
- void IPlasticDialogCloser.CloseDialog()
- {
- OkButtonAction();
- }
-
- void ProcessKeyActions()
- {
- Event e = Event.current;
-
- if (mEnterKeyAction != null &&
- Keyboard.IsReturnOrEnterKeyPressed(e))
- {
- mEnterKeyAction.Invoke();
- e.Use();
- return;
- }
-
- if (mEscapeKeyAction != null &&
- Keyboard.IsKeyPressed(e, KeyCode.Escape))
- {
- mEscapeKeyAction.Invoke();
- e.Use();
- return;
- }
- }
-
- protected static bool AcceptButton(string text, int extraWidth = 10)
- {
- GUI.color = new Color(0.098f, 0.502f, 0.965f, .8f);
-
- int textWidth = (int)((GUIStyle)UnityStyles.Dialog.AcceptButtonText)
- .CalcSize(new GUIContent(text)).x;
-
- bool pressed = GUILayout.Button(
- string.Empty, GetEditorSkin().button,
- GUILayout.MinWidth(Math.Max(80, textWidth + extraWidth)),
- GUILayout.Height(25));
-
- GUI.color = Color.white;
-
- Rect buttonRect = GUILayoutUtility.GetLastRect();
- GUI.Label(buttonRect, text, UnityStyles.Dialog.AcceptButtonText);
-
- return pressed;
- }
-
- void CompleteModal(ResponseType answer)
- {
- mIsCompleted = true;
- mAnswer = answer;
- }
-
- void InitializeVars(EditorWindow parentWindow)
- {
- mIsConfigured = true;
- mIsCompleted = false;
- mIsClosed = false;
- mAnswer = ResponseType.Cancel;
-
- titleContent = new GUIContent(GetTitle());
-
- mFocusedOnce = false;
-
- position = DefaultRect;
- mParentWindow = parentWindow;
- }
-
- void MakeNonResizable()
- {
- maxSize = DefaultRect.size;
- minSize = maxSize;
- }
-
- static void EntryLabel(string labelText)
- {
- GUIContent labelContent = new GUIContent(labelText);
- GUIStyle labelStyle = UnityStyles.Dialog.EntryLabel;
-
- Rect rt = GUILayoutUtility.GetRect(labelContent, labelStyle);
-
- GUI.Label(rt, labelText, EditorStyles.label);
- }
-
- static GUISkin GetEditorSkin()
- {
- return EditorGUIUtility.isProSkin ?
- EditorGUIUtility.GetBuiltinSkin(EditorSkin.Scene) :
- EditorGUIUtility.GetBuiltinSkin(EditorSkin.Inspector);
- }
-
- bool mIsConfigured;
- bool mIsCompleted;
- bool mIsClosed;
- ResponseType mAnswer;
-
- protected Action mEnterKeyAction = null;
- protected Action mEscapeKeyAction = null;
-
- bool mFocusedOnce;
-
- Dictionary<string, string[]> mWrappedTextLines =
- new Dictionary<string, string[]>();
-
- EditorWindow mParentWindow;
-
- protected const float DEFAULT_LINE_SPACING = -5f;
- const float DEFAULT_WIDTH = 500f;
- const float DEFAULT_HEIGHT = 180f;
- const float DEFAULT_PARAGRAPH_SPACING = 10f;
-
- static class BuildLine
- {
- internal static string ForIndex(string text, int index)
- {
- if (index < 0 || index > text.Length)
- return string.Empty;
-
- return text.Substring(index).Trim();
- }
-
- internal static string ForIndexAndLenght(string text, int index, int lenght)
- {
- if (index < 0 || index > text.Length)
- return string.Empty;
-
- return text.Substring(index, lenght);
- }
- }
- }
- }
|