LabelWindow.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using UnityEditor.AddressableAssets.Settings;
  2. using UnityEditorInternal;
  3. using UnityEngine;
  4. namespace UnityEditor.AddressableAssets.GUI
  5. {
  6. /// <summary>
  7. /// Configuration GUI for addressable labels in <see cref="T:UnityEditor.AddressableAssets.Settings" />
  8. /// </summary>
  9. public class LabelWindow : EditorWindow
  10. {
  11. ReorderableList m_LabelNamesRl;
  12. private AddressableAssetSettings m_Settings;
  13. private Vector2 m_ScrollPosition;
  14. private int m_BorderSpacing = 7;
  15. //Edit menu
  16. int m_ActiveIndex = -1;
  17. bool m_IsEditing = false;
  18. string m_CurrentEdit;
  19. string m_OldName;
  20. /// <summary>
  21. /// Creates a new LabelWindow instance and retrieves label names from the given settings object.
  22. /// </summary>
  23. /// <param name="settings">The settings object.</param>
  24. public void Intialize(AddressableAssetSettings settings)
  25. {
  26. titleContent = new GUIContent("Addressables Labels");
  27. m_Settings = settings;
  28. var labels = m_Settings.labelTable.labelNames;
  29. m_LabelNamesRl = new ReorderableList(labels, typeof(string), true, false, true, true);
  30. m_LabelNamesRl.drawElementCallback = DrawLabelNamesCallback;
  31. m_LabelNamesRl.onAddDropdownCallback = OnAddLabel;
  32. m_LabelNamesRl.onRemoveCallback = OnRemoveLabel;
  33. m_LabelNamesRl.onSelectCallback = list =>
  34. {
  35. m_ActiveIndex = list.index;
  36. EndEditMenu();
  37. };
  38. m_LabelNamesRl.headerHeight = 0; // hide header completely
  39. m_ActiveIndex = -1;
  40. m_IsEditing = false;
  41. }
  42. void OnGUI()
  43. {
  44. GUILayout.BeginVertical(EditorStyles.label);
  45. GUILayout.Space(m_BorderSpacing);
  46. m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition);
  47. m_LabelNamesRl.DoLayoutList();
  48. GUILayout.EndScrollView();
  49. GUILayout.EndVertical();
  50. HandleEvent(Event.current);
  51. }
  52. void HandleEvent(Event current)
  53. {
  54. if (m_ActiveIndex < 0 || m_Settings.labelTable.labelNames.Count == 0)
  55. return;
  56. if (current.type == EventType.ContextClick)
  57. {
  58. GenericMenu contextMenu = new GenericMenu();
  59. contextMenu.AddItem(new GUIContent("Edit"), false, () =>
  60. {
  61. m_IsEditing = true;
  62. m_CurrentEdit = m_Settings.labelTable.labelNames[m_ActiveIndex];
  63. Repaint();
  64. });
  65. contextMenu.ShowAsContext();
  66. Repaint();
  67. }
  68. else if (m_IsEditing && (current.keyCode == KeyCode.Return || current.keyCode == KeyCode.KeypadEnter))
  69. {
  70. m_Settings.RenameLabel(m_OldName, m_CurrentEdit);
  71. EndEditMenu();
  72. }
  73. else if(current.type == EventType.MouseDown && m_IsEditing)
  74. EndEditMenu();
  75. }
  76. void EndEditMenu()
  77. {
  78. m_IsEditing = false;
  79. m_CurrentEdit = string.Empty;
  80. m_OldName = string.Empty;
  81. Repaint();
  82. }
  83. void DrawLabelNamesCallback(Rect rect, int index, bool isActive, bool isFocused)
  84. {
  85. var oldName = m_Settings.labelTable.labelNames[index];
  86. if (m_IsEditing && index == m_ActiveIndex)
  87. {
  88. m_OldName = oldName;
  89. UnityEngine.GUI.SetNextControlName(m_OldName);
  90. m_CurrentEdit = EditorGUI.TextField(rect, m_CurrentEdit);
  91. UnityEngine.GUI.FocusControl(m_OldName);
  92. }
  93. else
  94. EditorGUI.LabelField(rect, oldName);
  95. }
  96. void OnRemoveLabel(ReorderableList list)
  97. {
  98. m_Settings.RemoveLabel(m_Settings.labelTable.labelNames[list.index]);
  99. AddressableAssetUtility.OpenAssetIfUsingVCIntegration(m_Settings);
  100. }
  101. void OnAddLabel(Rect buttonRect, ReorderableList list)
  102. {
  103. buttonRect.x = 6;
  104. buttonRect.y -= 13;
  105. PopupWindow.Show(buttonRect, new LabelNamePopup(position.width, m_LabelNamesRl.elementHeight, m_Settings));
  106. }
  107. internal class LabelNamePopup : PopupWindowContent
  108. {
  109. internal float windowWidth;
  110. internal float rowHeight;
  111. internal string name;
  112. internal bool needsFocus = true;
  113. internal AddressableAssetSettings settings;
  114. public LabelNamePopup(float width, float rowHeight, AddressableAssetSettings settings)
  115. {
  116. this.windowWidth = width;
  117. this.rowHeight = rowHeight;
  118. this.settings = settings;
  119. name = this.settings.labelTable.GetUniqueLabelName("New Label");
  120. }
  121. public override Vector2 GetWindowSize()
  122. {
  123. return new Vector2(windowWidth - 13f, rowHeight * 2.25f);
  124. }
  125. public override void OnGUI(Rect windowRect)
  126. {
  127. GUILayout.Space(5);
  128. Event evt = Event.current;
  129. bool hitEnter = evt.type == EventType.KeyDown && (evt.keyCode == KeyCode.Return || evt.keyCode == KeyCode.KeypadEnter);
  130. UnityEngine.GUI.SetNextControlName("LabelName");
  131. EditorGUIUtility.labelWidth = 80;
  132. name = EditorGUILayout.TextField("Label Name", name);
  133. if (needsFocus)
  134. {
  135. needsFocus = false;
  136. EditorGUI.FocusTextInControl("LabelName");
  137. }
  138. UnityEngine.GUI.enabled = name.Length != 0;
  139. if (GUILayout.Button("Save") || hitEnter)
  140. {
  141. if (string.IsNullOrEmpty(name))
  142. Debug.LogError("Cannot add empty label to Addressables label list");
  143. else if (name != settings.labelTable.GetUniqueLabelName(name))
  144. Debug.LogError("Label name '" + name + "' is already in the labels list.");
  145. else if (name.Contains("[") && name.Contains("]"))
  146. Debug.LogErrorFormat("Label name '{0}' cannot contain '[ ]'.", name);
  147. else
  148. {
  149. settings.AddLabel(name);
  150. AddressableAssetUtility.OpenAssetIfUsingVCIntegration(settings);
  151. }
  152. editorWindow.Close();
  153. }
  154. }
  155. }
  156. }
  157. }