A game about forced loneliness, made by TACStudios
1using System;
2using System.Text.RegularExpressions;
3
4using UnityEditor;
5using UnityEngine;
6
7using Codice.Client.Common;
8
9namespace Unity.PlasticSCM.Editor.UI
10{
11 internal static class DrawTextBlockWithLink
12 {
13 internal static void ForExternalLink(
14 ExternalLink externalLink,
15 string explanation,
16 GUIStyle textBlockStyle)
17 {
18 GUILayout.Label(explanation, textBlockStyle);
19
20 GUIStyle linkStyle = new GUIStyle(UnityStyles.LinkLabel);
21 linkStyle.fontSize = textBlockStyle.fontSize;
22 linkStyle.stretchWidth = false;
23
24 if (GUILayout.Button(externalLink.Label, linkStyle))
25 Application.OpenURL(externalLink.Url);
26
27 EditorGUIUtility.AddCursorRect(
28 GUILayoutUtility.GetLastRect(), MouseCursor.Link);
29 }
30
31 internal static void ForMultiLinkLabelInDialog(
32 MultiLinkLabelData data)
33 {
34 ForMultiLinkLabel(
35 data,
36 UnityStyles.Paragraph,
37 areLinkActionsSupported: Application.platform == RuntimePlatform.WindowsEditor,
38 isEndFlexibleSpaceNeeded: true);
39 }
40
41 internal static void ForMultiLinkLabel(
42 MultiLinkLabelData data,
43 GUIStyle style)
44 {
45 ForMultiLinkLabel(
46 data, style,
47 areLinkActionsSupported: true,
48 isEndFlexibleSpaceNeeded: false);
49 }
50
51 static void ForMultiLinkLabel(
52 MultiLinkLabelData data,
53 GUIStyle style,
54 bool areLinkActionsSupported,
55 bool isEndFlexibleSpaceNeeded)
56 {
57 GUIStyle labelStyle = new GUIStyle(style);
58 labelStyle.margin = new RectOffset(0, 0, style.margin.top, style.margin.bottom);
59 labelStyle.padding = new RectOffset(0, 0, style.padding.top, style.padding.bottom);
60
61 if (!areLinkActionsSupported)
62 {
63 GUILayout.Label(string.Format(data.Text, data.LinkNames.ToArray()), labelStyle);
64 return;
65 }
66
67 string[] labels = Regex.Split(data.Text, @"\{\d+\}");
68
69 GUIStyle linkStyle = new GUIStyle(labelStyle);
70 linkStyle.normal.textColor = EditorStyles.linkLabel.normal.textColor;
71 linkStyle.hover.textColor = EditorStyles.linkLabel.hover.textColor;
72 linkStyle.active.textColor = EditorStyles.linkLabel.active.textColor;
73 linkStyle.stretchWidth = false;
74
75 using (new EditorGUILayout.HorizontalScope())
76 {
77 for (int i = 0; i < labels.Length; i++)
78 {
79 GUILayout.Label(labels[i], labelStyle);
80
81 if (data.LinkNames.Count <= i)
82 break;
83
84 bool buttonResult = GUILayout.Button(data.LinkNames[i], linkStyle);
85
86 EditorGUIUtility.AddCursorRect(
87 GUILayoutUtility.GetLastRect(), MouseCursor.Link);
88
89 if (buttonResult)
90 ((Action)data.LinkActions[i]).Invoke();
91 }
92
93 if (isEndFlexibleSpaceNeeded)
94 GUILayout.FlexibleSpace();
95 }
96 }
97 }
98}