TMP_EditorPanel.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. using UnityEngine;
  2. using UnityEditor;
  3. using UnityEditor.Presets;
  4. namespace TMPro.EditorUtilities
  5. {
  6. [CustomEditor(typeof(TextMeshPro), true), CanEditMultipleObjects]
  7. public class TMP_EditorPanel : TMP_BaseEditorPanel
  8. {
  9. static readonly GUIContent k_SortingLayerLabel = new GUIContent("Sorting Layer", "Name of the Renderer's sorting layer.");
  10. static readonly GUIContent k_OrderInLayerLabel = new GUIContent("Order in Layer", "Renderer's order within a sorting layer.");
  11. static readonly GUIContent k_OrthographicLabel = new GUIContent("Orthographic Mode", "Should be enabled when using an orthographic camera. Instructs the shader to not perform any perspective correction.");
  12. static readonly GUIContent k_VolumetricLabel = new GUIContent("Volumetric Setup", "Use cubes rather than quads to render the text. Allows for volumetric rendering when combined with a compatible shader.");
  13. private static string[] k_SortingLayerNames;
  14. bool IsPreset;
  15. SerializedProperty m_IsVolumetricTextProp;
  16. SerializedProperty m_IsOrthographicProp;
  17. Renderer m_Renderer;
  18. protected override void OnEnable()
  19. {
  20. base.OnEnable();
  21. // Determine if the inspected object is a Preset
  22. IsPreset = (int)(target as Component).gameObject.hideFlags == 93;
  23. m_IsOrthographicProp = serializedObject.FindProperty("m_isOrthographic");
  24. m_IsVolumetricTextProp = serializedObject.FindProperty("m_isVolumetricText");
  25. m_Renderer = m_TextComponent.GetComponent<Renderer>();
  26. // Populate Sorting Layer Names
  27. k_SortingLayerNames = SortingLayerHelper.sortingLayerNames;
  28. }
  29. protected override void DrawExtraSettings()
  30. {
  31. Rect rect = EditorGUILayout.GetControlRect(false, 24);
  32. if (GUI.Button(rect, new GUIContent("<b>Extra Settings</b>"), TMP_UIStyleManager.sectionHeader))
  33. Foldout.extraSettings = !Foldout.extraSettings;
  34. GUI.Label(rect, (Foldout.extraSettings ? "" : k_UiStateLabel[1]), TMP_UIStyleManager.rightLabel);
  35. if (Foldout.extraSettings)
  36. {
  37. //EditorGUI.indentLevel += 1;
  38. DrawMargins();
  39. DrawSortingLayer();
  40. DrawGeometrySorting();
  41. DrawIsTextObjectScaleStatic();
  42. DrawOrthographicMode();
  43. DrawRichText();
  44. DrawParsing();
  45. DrawSpriteAsset();
  46. DrawStyleSheet();
  47. //DrawVolumetricSetup();
  48. DrawKerning();
  49. DrawPadding();
  50. //EditorGUI.indentLevel -= 1;
  51. }
  52. }
  53. protected void DrawSortingLayer()
  54. {
  55. Undo.RecordObject(m_Renderer, "Sorting Layer Change");
  56. EditorGUI.BeginChangeCheck();
  57. TextMeshPro textComponent = (TextMeshPro)m_TextComponent;
  58. // Look up the layer name using the current layer ID
  59. string oldName = IsPreset ? SortingLayer.IDToName(textComponent._SortingLayerID) : SortingLayer.IDToName(textComponent.sortingLayerID);
  60. // Use the name to look up our array index into the names list
  61. int oldLayerIndex = System.Array.IndexOf(k_SortingLayerNames, oldName);
  62. // Show the pop-up for the names
  63. EditorGUIUtility.fieldWidth = 0f;
  64. int newLayerIndex = EditorGUILayout.Popup(k_SortingLayerLabel, oldLayerIndex, k_SortingLayerNames);
  65. // If the index changes, look up the ID for the new index to store as the new ID
  66. if (newLayerIndex != oldLayerIndex)
  67. UpdateTargetsSortingLayerID(SortingLayer.NameToID(k_SortingLayerNames[newLayerIndex]));
  68. // Get value from internal property if target is a Preset otherwise from the public property
  69. int oldSortingOrder = IsPreset ? textComponent._SortingOrder : textComponent.sortingOrder;
  70. int newSortingLayerOrder = EditorGUILayout.IntField(k_OrderInLayerLabel, oldSortingOrder);
  71. if (newSortingLayerOrder != textComponent.sortingOrder)
  72. UpdateTargetsSortingOrder(newSortingLayerOrder);
  73. if (EditorGUI.EndChangeCheck())
  74. m_HavePropertiesChanged = true;
  75. EditorGUILayout.Space();
  76. }
  77. protected void DrawOrthographicMode()
  78. {
  79. EditorGUI.BeginChangeCheck();
  80. EditorGUILayout.PropertyField(m_IsOrthographicProp, k_OrthographicLabel);
  81. if (EditorGUI.EndChangeCheck())
  82. m_HavePropertiesChanged = true;
  83. }
  84. protected void DrawVolumetricSetup()
  85. {
  86. EditorGUI.BeginChangeCheck();
  87. EditorGUILayout.PropertyField(m_IsVolumetricTextProp, k_VolumetricLabel);
  88. if (EditorGUI.EndChangeCheck())
  89. {
  90. m_HavePropertiesChanged = true;
  91. m_TextComponent.textInfo.ResetVertexLayout(m_IsVolumetricTextProp.boolValue);
  92. }
  93. EditorGUILayout.Space();
  94. }
  95. // Method to handle multi object selection
  96. protected override bool IsMixSelectionTypes()
  97. {
  98. GameObject[] objects = Selection.gameObjects;
  99. if (objects.Length > 1)
  100. {
  101. for (int i = 0; i < objects.Length; i++)
  102. {
  103. if (objects[i].GetComponent<TextMeshPro>() == null)
  104. return true;
  105. }
  106. }
  107. return false;
  108. }
  109. protected override void OnUndoRedo()
  110. {
  111. int undoEventId = Undo.GetCurrentGroup();
  112. int lastUndoEventId = s_EventId;
  113. if (undoEventId != lastUndoEventId)
  114. {
  115. for (int i = 0; i < targets.Length; i++)
  116. {
  117. //Debug.Log("Undo & Redo Performed detected in Editor Panel. Event ID:" + Undo.GetCurrentGroup());
  118. TMPro_EventManager.ON_TEXTMESHPRO_PROPERTY_CHANGED(true, targets[i] as TextMeshPro);
  119. s_EventId = undoEventId;
  120. }
  121. }
  122. }
  123. void UpdateTargetsSortingLayerID(int sortingLayerID)
  124. {
  125. for (int i = 0; i < targets.Length; i++)
  126. {
  127. var textComponent = (TextMeshPro)targets[i];
  128. if (textComponent != null)
  129. textComponent.sortingLayerID = sortingLayerID;
  130. }
  131. }
  132. void UpdateTargetsSortingOrder(int sortingOrder)
  133. {
  134. for (int i = 0; i < targets.Length; i++)
  135. {
  136. var textComponent = (TextMeshPro)targets[i];
  137. if (textComponent != null)
  138. textComponent.sortingOrder = sortingOrder;
  139. }
  140. }
  141. }
  142. }