A game about forced loneliness, made by TACStudios
1using System;
2
3using UnityEditor;
4using UnityEngine;
5
6namespace Unity.PlasticSCM.Editor.UI
7{
8 internal class TabButton
9 {
10 internal bool DrawTabButton(
11 string buttonText,
12 bool wasActive,
13 float width)
14 {
15 bool isCloseButtonClicked;
16
17 return DrawClosableTabButton(
18 buttonText,
19 wasActive,
20 false,
21 width,
22 null,
23 out isCloseButtonClicked);
24 }
25
26 internal bool DrawClosableTabButton(
27 string buttonText,
28 bool wasActive,
29 bool isClosable,
30 float width,
31 Action repaintAction,
32 out bool isCloseButtonClicked)
33 {
34 isCloseButtonClicked = false;
35
36 GUIContent buttonContent = new GUIContent(buttonText);
37
38 GUIStyle buttonStyle = UnityStyles.PlasticWindow.TabButton;
39
40 Rect toggleRect = GUILayoutUtility.GetRect(
41 buttonContent, buttonStyle,
42 GUILayout.Width(width));
43
44 if (isClosable && Event.current.type == EventType.MouseMove)
45 {
46 if (mCloseButtonRect.Contains(Event.current.mousePosition))
47 {
48 SetCloseButtonState(
49 CloseButtonState.Hovered,
50 repaintAction);
51 }
52 else
53 {
54 SetCloseButtonState(
55 CloseButtonState.Normal,
56 repaintAction);
57 }
58 }
59
60 if (isClosable && Event.current.type == EventType.MouseDown)
61 {
62 if (mCloseButtonRect.Contains(Event.current.mousePosition))
63 {
64 SetCloseButtonState(
65 CloseButtonState.Clicked,
66 repaintAction);
67 Event.current.Use();
68 }
69 }
70
71 if (isClosable && Event.current.type == EventType.MouseUp)
72 {
73 if (mCloseButtonRect.Contains(Event.current.mousePosition))
74 {
75 Event.current.Use();
76 isCloseButtonClicked = true;
77 }
78
79 if (IsTabClickWithMiddleButton(toggleRect, Event.current))
80 {
81 Event.current.Use();
82 isCloseButtonClicked = true;
83 }
84
85 SetCloseButtonState(
86 CloseButtonState.Normal,
87 repaintAction);
88 }
89
90 bool isActive = GUI.Toggle(
91 toggleRect, wasActive, buttonText, buttonStyle);
92
93 if (isClosable && toggleRect.height > 1)
94 {
95 mCloseButtonRect = DrawCloseButton(
96 toggleRect,
97 mCloseButtonState);
98 }
99
100 if (wasActive)
101 {
102 DrawUnderline(toggleRect);
103 }
104
105 return isActive;
106 }
107
108 static Rect DrawCloseButton(
109 Rect toggleRect,
110 CloseButtonState state)
111 {
112 int closeButtonSize = 15;
113
114 GUIContent closeImage = new GUIContent(GetCloseImage(state));
115
116 Rect closeTabRect = new Rect(
117 toggleRect.xMax - closeButtonSize - 1,
118 toggleRect.y + (toggleRect.height / 2 - closeButtonSize / 2),
119 closeButtonSize,
120 closeButtonSize);
121
122 GUI.Button(closeTabRect, closeImage, EditorStyles.label);
123
124 return new Rect(
125 closeTabRect.x - 1,
126 closeTabRect.y - 1,
127 closeTabRect.width + 2,
128 closeTabRect.height + 2);
129 }
130
131 static void DrawUnderline(Rect toggleRect)
132 {
133 GUIStyle activeTabStyle =
134 UnityStyles.PlasticWindow.ActiveTabUnderline;
135
136 Rect underlineRect = new Rect(
137 toggleRect.x,
138 toggleRect.yMax - (activeTabStyle.fixedHeight / 2),
139 toggleRect.width,
140 activeTabStyle.fixedHeight);
141
142 GUI.Label(underlineRect, string.Empty, activeTabStyle);
143 }
144
145 static bool IsTabClickWithMiddleButton(Rect toggleRect, Event currentEvent)
146 {
147 if (currentEvent.button != 2)
148 return false;
149
150 return toggleRect.height > 1 &&
151 toggleRect.Contains(Event.current.mousePosition);
152 }
153
154 static Texture GetCloseImage(CloseButtonState state)
155 {
156 if (state == CloseButtonState.Hovered)
157 return Images.GetHoveredCloseIcon();
158
159 if (state == CloseButtonState.Clicked)
160 return Images.GetClickedCloseIcon();
161
162 return Images.GetCloseIcon();
163 }
164
165 void SetCloseButtonState(
166 CloseButtonState newState,
167 Action repaintAction)
168 {
169 if (mCloseButtonState == newState)
170 return;
171
172 mCloseButtonState = newState;
173
174 if (repaintAction != null)
175 repaintAction();
176 }
177
178 Rect mCloseButtonRect;
179 CloseButtonState mCloseButtonState;
180
181 enum CloseButtonState
182 {
183 Normal,
184 Clicked,
185 Hovered,
186 }
187 }
188}