123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- using System.Reflection;
-
- using UnityEditor;
- using UnityEngine;
-
- using PlasticGui;
- using Unity.PlasticSCM.Editor.UI;
-
- namespace Unity.PlasticSCM.Editor.Views.PendingChanges
- {
- internal static class DrawCommentTextArea
- {
- internal static void For(
- PendingChangesTab pendingChangesTab,
- float width,
- bool isOperationRunning)
- {
- using (new GuiEnabled(!isOperationRunning))
- {
- EditorGUILayout.BeginHorizontal();
-
- Rect textAreaRect = BuildTextAreaRect(
- pendingChangesTab.CommentText,
- width);
-
- EditorGUI.BeginChangeCheck();
-
- pendingChangesTab.CommentText = DoTextArea(
- pendingChangesTab.CommentText ?? string.Empty,
- pendingChangesTab.ForceToShowComment,
- textAreaRect);
-
- pendingChangesTab.ForceToShowComment = false;
-
- if (EditorGUI.EndChangeCheck())
- OnTextAreaChanged(pendingChangesTab);
-
- if (string.IsNullOrEmpty(pendingChangesTab.CommentText))
- {
- DoPlaceholderIfNeeded(PlasticLocalization.GetString(PlasticLocalization.Name.CheckinOnlyComment),
- textAreaRect);
- }
-
- EditorGUILayout.EndHorizontal();
- }
- }
-
- static void OnTextAreaChanged(PendingChangesTab pendingChangesTab)
- {
- pendingChangesTab.ClearIsCommentWarningNeeded();
- }
-
- static string DoTextArea(
- string text,
- bool forceToShowText,
- Rect textAreaRect)
- {
- // while the text area has the focus, the changes to
- // the source string will not be picked up by the text editor.
- // so, when we want to change the text programmatically
- // we have to remove the focus, set the text and then reset the focus.
-
- TextEditor textEditor = typeof(EditorGUI)
- .GetField("activeEditor", BindingFlags.Static | BindingFlags.NonPublic)
- .GetValue(null) as TextEditor;
-
- bool shouldBeFocusFixed = forceToShowText && textEditor != null;
-
- if (shouldBeFocusFixed)
- EditorGUIUtility.keyboardControl = 0;
-
- var modifiedTextAreaStyle = new GUIStyle(EditorStyles.textArea);
- modifiedTextAreaStyle.padding.left = 7;
- modifiedTextAreaStyle.padding.top = 5;
- modifiedTextAreaStyle.stretchWidth = false;
- modifiedTextAreaStyle.stretchHeight = false;
-
- text = EditorGUI.TextArea(textAreaRect, text, modifiedTextAreaStyle);
-
- if (shouldBeFocusFixed)
- EditorGUIUtility.keyboardControl = textEditor.controlID;
-
- return text;
- }
-
- static void DoPlaceholderIfNeeded(string placeholder, Rect textAreaRect)
- {
- int textAreaControlId = GUIUtility.GetControlID(FocusType.Passive) - 1;
-
- if (EditorGUIUtility.keyboardControl == textAreaControlId)
- return;
-
- Rect hintRect = textAreaRect;
- hintRect.height = EditorStyles.textArea.lineHeight;
-
- GUI.Label(hintRect, placeholder, UnityStyles.PendingChangesTab.CommentPlaceHolder);
- }
-
- static Rect BuildTextAreaRect(string text, float width)
- {
- GUIStyle commentTextAreaStyle = UnityStyles.PendingChangesTab.CommentTextArea;
- commentTextAreaStyle.stretchWidth = false;
-
- // The number here (230) controls how much the right side buttons are pushed off the
- // screen when window is at min width
- float contentWidth = width - 230f;
-
- Rect result = GUILayoutUtility.GetRect(
- contentWidth,
- UnityConstants.PLASTIC_WINDOW_COMMENT_SECTION_HEIGHT);
-
- result.width = contentWidth;
- result.height = UnityConstants.PLASTIC_WINDOW_COMMENT_SECTION_HEIGHT;
- result.xMin = 50f;
-
- return result;
- }
- }
- }
|