using System; using UnityEditor; using UnityEngine; using Codice.Client.Common; using PlasticGui; namespace Unity.PlasticSCM.Editor.UI.Message { internal class PlasticQuestionAlert : PlasticDialog { protected override Rect DefaultRect { get { var baseRect = base.DefaultRect; string buttonsText = mFirst + mSecond + (mThird ?? string.Empty); int textWidth = (int)((GUIStyle)UnityStyles.Dialog.AcceptButtonText) .CalcSize(new GUIContent(buttonsText)).x; return new Rect( baseRect.x, baseRect.y, Math.Max(500, textWidth + 150), 180); } } internal static ResponseType Show( string title, string message, string first, string second, string third, bool isFirstButtonEnabled, GuiMessage.GuiMessageType alertType, EditorWindow parentWindow) { PlasticQuestionAlert alert = Create( title, message, first, second, third, isFirstButtonEnabled, alertType); return alert.RunModal(parentWindow); } protected override void OnModalGUI() { DoMessageArea(); GUILayout.FlexibleSpace(); GUILayout.Space(20); DoButtonsArea(); } protected override string GetTitle() { return PlasticLocalization.GetString( PlasticLocalization.Name.UnityVersionControl); } void DoMessageArea() { using (new EditorGUILayout.HorizontalScope()) { DrawDialogIcon.ForMessage(mAlertType); using (new EditorGUILayout.VerticalScope()) { GUILayout.Label(mTitle, UnityStyles.Dialog.MessageTitle); GUIContent message = new GUIContent(mMessage); Rect lastRect = GUILayoutUtility.GetLastRect(); GUIStyle scrollPlaceholder = new GUIStyle(UnityStyles.Dialog.MessageText); scrollPlaceholder.normal.textColor = Color.clear; scrollPlaceholder.clipping = TextClipping.Clip; if (Event.current.type == EventType.Repaint) { mMessageDesiredHeight = ((GUIStyle)UnityStyles.Dialog.MessageText) .CalcHeight(message, lastRect.width - 20) + 20; mMessageViewHeight = Mathf.Min(mMessageDesiredHeight, 60); } GUILayout.Space(mMessageViewHeight); Rect scrollPanelRect = new Rect( lastRect.xMin, lastRect.yMax, lastRect.width + 20, mMessageViewHeight); Rect contentRect = new Rect( scrollPanelRect.xMin, scrollPanelRect.yMin, scrollPanelRect.width - 20, mMessageDesiredHeight); mScroll = GUI.BeginScrollView(scrollPanelRect, mScroll, contentRect); GUI.Label(contentRect, mMessage, UnityStyles.Dialog.MessageText); GUI.EndScrollView(); } } } void DoButtonsArea() { using (new EditorGUILayout.HorizontalScope()) { GUILayout.FlexibleSpace(); if (Application.platform == RuntimePlatform.WindowsEditor) { DoFirstButton(); DoSecondButton(); DoThirdButton(); return; } DoThirdButton(); DoSecondButton(); DoFirstButton(); } } void DoFirstButton() { GUI.enabled = mIsFirstButtonEnabled; bool pressed = mIsFirstButtonEnabled ? AcceptButton(mFirst) : NormalButton(mFirst); GUI.enabled = true; if (!pressed) return; OkButtonAction(); } void DoSecondButton() { if (!NormalButton(mSecond)) return; CancelButtonAction(); } void DoThirdButton() { if (mThird == null) return; bool pressed = mIsFirstButtonEnabled ? NormalButton(mThird) : AcceptButton(mThird); if (!pressed) return; ApplyButtonAction(); } static PlasticQuestionAlert Create( string title, string message, string first, string second, string third, bool isFirstButtonEnabled, GuiMessage.GuiMessageType alertType) { var instance = CreateInstance(); instance.titleContent = new GUIContent(title); instance.mTitle = title; instance.mMessage = message; instance.mFirst = first; instance.mSecond = second; instance.mThird = third; instance.mIsFirstButtonEnabled = isFirstButtonEnabled; instance.mAlertType = alertType; instance.mEnterKeyAction = GetEnterKeyAction(isFirstButtonEnabled, instance); instance.mEscapeKeyAction = instance.CancelButtonAction; return instance; } static Action GetEnterKeyAction( bool isFirstButtonEnabled, PlasticQuestionAlert instance) { if (isFirstButtonEnabled) return instance.OkButtonAction; return instance.ApplyButtonAction; } string mTitle; string mMessage, mFirst, mSecond, mThird; bool mIsFirstButtonEnabled; GuiMessage.GuiMessageType mAlertType; Vector2 mScroll; float mMessageDesiredHeight; float mMessageViewHeight; } }