UnityEssentials
Small but useful tools and features for Unity
HierarchyDividers.cs
Go to the documentation of this file.
1 // Original author of the code: Pellegrino ~thp~ Principe (https://github.com/thp1972)
2 // Original code: https://github.com/thp1972/MyUnityScripts/blob/master/GameObjectSeparator/Editor/com.pellegrinoprincipe/GOSeparators.cs
3 // The code has been modified to increase consistency, usability and to reduce possible errors.
4 
5 #if UNITY_EDITOR
6 using UnityEditor;
7 using UnityEngine;
8 
9 namespace Essentials.EditorTweaks
10 {
14  public class HierarchyDividers : EditorWindow
15  {
16 
17  #region DividerConfiguration
18 
22  private string sectionName = "";
26  private int selectedCharNumber;
30  private int selectedAlignmentNumber;
34  private int numberOfDividerChars;
35 
36  #endregion
37 
38  #region predifined options
39 
43  private string[] availableChars = { "-", "*", "_" };
47  private string[] alignText = { "Left", "Center", "Right" };
48 
49  #endregion
50 
51  #region EditorPrefs
52 
56  private string numberOfDividerCharsEditorPrefs = $"Essentials_{nameof(numberOfDividerChars)}";
60  private string selectedCharNumberEditorPrefs = $"Essentials_{nameof(selectedCharNumber)}";
64  private string selectedAlignmentNumberEditorPrefs = $"Essentials_{nameof(selectedAlignmentNumber)}";
65 
66  #endregion
67 
68  #region ButtonsStates
69 
73  private bool buttonStateOk;
77  private bool buttonStateCancel;
78 
79  #endregion
80 
84  private void OnEnable()
85  {
86  GetPreferences();
87  }
88 
92  private void OnGUI()
93  {
94  DrawWindow();
95  ManageKeyPress();
96  }
97 
101  [MenuItem("GameObject/Create Divider", false, -20)]
102  private static void OpenWindow()
103  {
104  // Get existing open window or if none, make a new one:
105  HierarchyDividers window = CreateWindow<HierarchyDividers>();
106  //SettingsWindow window = (SettingsWindow)EditorWindow.GetWindow(typeof(SettingsWindow), false, "Essentials' Settings and Adjustments");
107  Vector2 windowSize = new Vector2(420f, 130f);
108  window.minSize = window.maxSize = windowSize;
109  window.position = Utils.GetEditorWindowCenteredPosition(windowSize);
110  window.titleContent = new GUIContent("Divider creator tool");
111  window.Show();
112  window.Focus();
113  }
114 
118  private void DrawWindow()
119  {
120  EditorGUILayout.Space();
121 
122 
123  // Section name
124  GUILayout.BeginHorizontal();
125  GUILayout.Label("Section name: ");
126  sectionName = GUILayout.TextField(sectionName, 50, GUILayout.Width(236));
127  GUILayout.EndHorizontal();
128 
129  EditorGUILayout.Space();
130 
131  // Divider chars
132  GUILayout.BeginHorizontal();
133  GUILayout.Label("Divider char: ", GUILayout.Width(130));
134  selectedCharNumber = GUILayout.SelectionGrid(selectedCharNumber, availableChars, availableChars.Length, EditorStyles.miniButton);
135  GUILayout.EndHorizontal();
136 
137  // Alignment
138  GUILayout.BeginHorizontal();
139  GUILayout.Label("Name position: ", GUILayout.Width(130));
140  selectedAlignmentNumber = GUILayout.SelectionGrid(selectedAlignmentNumber, alignText, alignText.Length, EditorStyles.miniButton);
141  GUILayout.EndHorizontal();
142 
143  // Char number
144  GUILayout.BeginHorizontal();
145  numberOfDividerChars = EditorGUILayout.IntSlider("Number of divider chars: ", numberOfDividerChars, 0, 80);
146  GUILayout.EndHorizontal();
147 
148  // Horizontal line
149  //EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
150  EditorGUILayout.Space();
151  EditorGUILayout.Space();
152 
153  // buttons
154  GUILayout.BeginHorizontal();
155  GUILayout.FlexibleSpace();
156  buttonStateCancel = GUILayout.Button("Cancel", GUILayout.Width(80));
157  buttonStateOk = GUILayout.Button("Create", GUILayout.Width(80));
158  GUILayout.EndHorizontal();
159 
160  if (buttonStateOk)
161  {
162  AcceptCreation();
163  }
164 
165  if (buttonStateCancel)
166  Close();
167  }
168 
172  private void AcceptCreation()
173  {
174  CreateDivider();
175  SavePreferences();
176  Close();
177  }
178 
182  private void GetPreferences()
183  {
184  selectedCharNumber = EditorPrefs.GetInt(selectedCharNumberEditorPrefs, 0);
185  selectedAlignmentNumber = EditorPrefs.GetInt(selectedAlignmentNumberEditorPrefs, 1);
186  numberOfDividerChars = EditorPrefs.GetInt(numberOfDividerCharsEditorPrefs, 26);
187  }
188 
192  private void SavePreferences()
193  {
194  EditorPrefs.SetInt(numberOfDividerCharsEditorPrefs, numberOfDividerChars);
195  EditorPrefs.SetInt(selectedCharNumberEditorPrefs, selectedCharNumber);
196  EditorPrefs.SetInt(selectedAlignmentNumberEditorPrefs, selectedAlignmentNumber);
197  }
198 
202  private void ManageKeyPress()
203  {
204  switch (Event.current.keyCode)
205  {
206  case KeyCode.Escape:
207  Close();
208  break;
209  case KeyCode.Return:
210  AcceptCreation();
211  break;
212  }
213  }
214 
218  private void CreateDivider()
219  {
220  string selectedChar = availableChars[selectedCharNumber];
221 
222  int charsLeft = 0, charsRight = 0;
223  string dividerGameObjectName = "";
224 
225  switch (alignText[selectedAlignmentNumber])
226  {
227  case "Left":
228  charsLeft = 0;
229  charsRight = numberOfDividerChars;
230  break;
231  case "Center":
232  charsLeft = numberOfDividerChars/2;
233  charsRight = numberOfDividerChars/2;
234  break;
235  case "Right":
236  charsLeft = numberOfDividerChars;
237  charsRight = 0;
238  break;
239  }
240 
241  for (int i = 0; i < charsLeft; i++)
242  dividerGameObjectName += selectedChar;
243  dividerGameObjectName += $" {sectionName} ";
244  for (int i = 0; i < charsRight; i++)
245  dividerGameObjectName += selectedChar;
246 
247  GameObject dividerGameObject = new GameObject(dividerGameObjectName);
248 
249  dividerGameObject.tag = "EditorOnly";
250  }
251 
252  }
253 }
254 #endif