using System.Diagnostics; using UnityEditor; using UnityEngine; using Codice.Client.Common; using PlasticGui; using Unity.PlasticSCM.Editor.UI; namespace Unity.PlasticSCM.Editor.Help { internal static class DrawHelpPanel { internal static void For( HelpPanel helpPanel) { if (!helpPanel.Visible) return; DoHelpPanelToolbar(helpPanel); GUILayout.Space(10); DoHelpPanelContent(helpPanel); } static void DoHelpPanelToolbar( HelpPanel helpPanel) { Rect rect = GUILayoutUtility.GetLastRect(); rect.y = rect.yMax; rect.height = 22; GUILayout.Space(1); GUIStyle expandableToolbar = new GUIStyle(EditorStyles.toolbar); expandableToolbar.fixedHeight = 0; GUI.Label(rect, GUIContent.none, expandableToolbar); using (new EditorGUILayout.HorizontalScope()) { if (GUILayout.Button("<", EditorStyles.miniButtonLeft)) { // TODO(codice): On Left Clicked } if (GUILayout.Button(">", EditorStyles.miniButtonRight)) { // TODO(codice): On Right Clicked } GUILayout.FlexibleSpace(); // TODO(codice): The bool used here must be loaded and persisted by some means helpPanel.Data.ShouldShowAgain = EditorGUILayout.ToggleLeft( PlasticLocalization.GetString(PlasticLocalization.Name.DontShowItAgain), helpPanel.Data.ShouldShowAgain, UnityStyles.MiniToggle); bool okWasPressed = GUILayout.Button( PlasticLocalization.GetString(PlasticLocalization.Name.OkButton), EditorStyles.miniButton); if (okWasPressed) { helpPanel.Hide(); // TODO(codice): Do on helppanel dismiss actions return; } } } static void DoHelpPanelContent( HelpPanel helpPanel) { using (new EditorGUILayout.HorizontalScope()) { using (new EditorGUILayout.VerticalScope()) { GUIStyle helpParagraph = UnityStyles.Paragraph; helpPanel.TextScroll = GUILayout.BeginScrollView(helpPanel.TextScroll); GUILayout.Label(helpPanel.GUIContent, helpParagraph); if (Event.current.type != EventType.Layout) DoHelpPanelLinks(helpPanel, helpParagraph); GUILayout.EndScrollView(); Rect scrollRect = GUILayoutUtility.GetLastRect(); if (Mouse.IsRightMouseButtonPressed(Event.current) && scrollRect.Contains(Event.current.mousePosition)) { GenericMenu contextMenu = BuildHelpPanelMenu(helpPanel.Data.CleanText); contextMenu.ShowAsContext(); } } } } static void DoHelpPanelLinks( HelpPanel helpPanel, GUIStyle helpParagraph) { var lastRect = GUILayoutUtility.GetLastRect(); bool linkWasClicked = false; GUIContent charContent = new GUIContent(); for (int charIdx = 0; charIdx < helpPanel.GUIContent.text.Length; charIdx++) { HelpLink link; if (!helpPanel.TryGetLinkAtChar(charIdx, out link)) continue; charContent.text = helpPanel.GUIContent.text[charIdx].ToString(); var pos = helpParagraph.GetCursorPixelPosition( lastRect, helpPanel.GUIContent, charIdx); float charWidth = helpParagraph.CalcSize(charContent).x; Rect charRect = new Rect(pos, new Vector2( charWidth - 4, helpParagraph.lineHeight)); if (!linkWasClicked && Mouse.IsLeftMouseButtonPressed(Event.current) && charRect.Contains(Event.current.mousePosition)) { linkWasClicked = true; OnHelpLinkClicked(helpPanel, link); } // Underline for links charRect.y = charRect.yMax - 1; charRect.height = 1; GUI.DrawTexture(charRect, Images.GetLinkUnderlineImage()); } } static void OnHelpLinkClicked( HelpPanel helpPanel, HelpLink helpLink) { HelpLink.LinkType linkType; string content; if (!HelpLinkData.TryGet(helpLink.Link, out linkType, out content)) return; switch (linkType) { case HelpLink.LinkType.Action: GuiMessage.ShowInformation( "An ACTION link has been clicked:\n" + content); break; case HelpLink.LinkType.Help: helpPanel.Show( content == "sample1" ? TestingHelpData.GetSample1() : TestingHelpData.GetSample2()); break; case HelpLink.LinkType.Link: Process.Start(content); break; } } static void CopyToClipboard(string data) { EditorGUIUtility.systemCopyBuffer = data; } static GenericMenu BuildHelpPanelMenu(string cleanText) { GenericMenu result = new GenericMenu(); result.AddItem( new GUIContent(PlasticLocalization.GetString(PlasticLocalization.Name.Copy)), false, () => CopyToClipboard(cleanText) ); return result; } } }