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}