AppUITMPInputFieldEditor.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. using AppUI.Localization;
  2. using AppUI.Util.Input;
  3. using TMPro;
  4. using UnityEditor;
  5. using UnityEngine;
  6. namespace AppUI.Editor
  7. {
  8. [CustomEditor(typeof(AppUITMPInputField))]
  9. public class AppUITMPInputFieldEditor : UnityEditor.Editor
  10. {
  11. SerializedProperty _titleKey;
  12. SerializedProperty _title;
  13. SerializedProperty _placeholderKey;
  14. SerializedProperty _placeholder;
  15. SerializedProperty _kind;
  16. SerializedProperty _titleLabel;
  17. SerializedProperty _inputField;
  18. SerializedProperty _actionBar;
  19. SerializedProperty _minLength;
  20. SerializedProperty _maxLength;
  21. SerializedProperty _required;
  22. SerializedProperty _clickOnly;
  23. SerializedProperty _onClick;
  24. void OnEnable()
  25. {
  26. _titleKey = serializedObject.FindProperty("titleKey");
  27. _title = serializedObject.FindProperty("title");
  28. _placeholderKey = serializedObject.FindProperty("placeholderKey");
  29. _placeholder = serializedObject.FindProperty("placeholder");
  30. _kind = serializedObject.FindProperty("kind");
  31. _titleLabel = serializedObject.FindProperty("titleLabel");
  32. _inputField = serializedObject.FindProperty("inputField");
  33. _actionBar = serializedObject.FindProperty("actionBar");
  34. _minLength = serializedObject.FindProperty("minLength");
  35. _maxLength = serializedObject.FindProperty("maxLength");
  36. _required = serializedObject.FindProperty("required");
  37. _clickOnly = serializedObject.FindProperty("clickOnly");
  38. _onClick = serializedObject.FindProperty("onClick");
  39. }
  40. public override void OnInspectorGUI()
  41. {
  42. serializedObject.Update();
  43. EditorGUILayout.LabelField("TMPInput 通用输入", EditorStyles.boldLabel);
  44. EditorGUILayout.HelpBox(
  45. "Title Key / Placeholder Key 优先于下方明文,走 AppUILocalization(新表优先 + 旧表回退)。",
  46. MessageType.Info);
  47. var changed = false;
  48. EditorGUI.BeginChangeCheck();
  49. EditorGUILayout.PropertyField(_titleKey, new GUIContent("Title Key"));
  50. EditorGUILayout.PropertyField(_title, new GUIContent("Title 文案(fallback)"));
  51. EditorGUILayout.PropertyField(_placeholderKey, new GUIContent("Placeholder Key"));
  52. EditorGUILayout.PropertyField(_placeholder, new GUIContent("Placeholder(fallback)"));
  53. EditorGUILayout.PropertyField(_kind, new GUIContent("输入类型"));
  54. if (EditorGUI.EndChangeCheck())
  55. changed = true;
  56. if (changed)
  57. {
  58. serializedObject.ApplyModifiedProperties();
  59. ApplyKindToTargets();
  60. RefreshLocalizedPreview();
  61. }
  62. if (GUILayout.Button("重新应用类型默认配置到 InputField"))
  63. {
  64. serializedObject.ApplyModifiedProperties();
  65. ApplyKindToTargets();
  66. }
  67. if (GUILayout.Button("刷新多语言 Title / Placeholder"))
  68. {
  69. serializedObject.ApplyModifiedProperties();
  70. RefreshLocalizedPreview();
  71. }
  72. EditorGUILayout.Space(8);
  73. EditorGUILayout.LabelField("引用", EditorStyles.boldLabel);
  74. EditorGUILayout.PropertyField(_titleLabel);
  75. EditorGUILayout.PropertyField(_inputField);
  76. EditorGUILayout.PropertyField(_actionBar);
  77. EditorGUILayout.Space(8);
  78. EditorGUILayout.LabelField("校验", EditorStyles.boldLabel);
  79. EditorGUILayout.PropertyField(_required);
  80. EditorGUILayout.PropertyField(_minLength, new GUIContent("最小长度 (0=默认)"));
  81. EditorGUILayout.PropertyField(_maxLength, new GUIContent("最大长度 (0=默认)"));
  82. EditorGUILayout.Space(8);
  83. EditorGUILayout.LabelField("仅点击", EditorStyles.boldLabel);
  84. EditorGUILayout.PropertyField(_clickOnly, new GUIContent("仅点击模式"));
  85. EditorGUILayout.PropertyField(_onClick, new GUIContent("On Click"));
  86. serializedObject.ApplyModifiedProperties();
  87. if (!Application.isPlaying && targets.Length == 1 && targets[0] is AppUITMPInputField preview)
  88. {
  89. EditorGUILayout.Space(8);
  90. var contentHint = preview.InputField != null
  91. ? preview.InputField.contentType.ToString()
  92. : "(未绑定 InputField)";
  93. EditorGUILayout.HelpBox(
  94. $"预览 TrimmedText: \"{preview.TrimmedText}\" | ContentType: {contentHint}",
  95. MessageType.None);
  96. }
  97. }
  98. void RefreshLocalizedPreview()
  99. {
  100. AppUILocalization.Reload();
  101. foreach (var t in targets)
  102. {
  103. if (t is not AppUITMPInputField field)
  104. continue;
  105. Undo.RecordObject(field, "Refresh AppUI Input Localization");
  106. if (field.InputField != null)
  107. Undo.RecordObject(field.InputField, "Refresh AppUI Input Localization");
  108. field.ApplyLocalizedTexts();
  109. EditorUtility.SetDirty(field);
  110. }
  111. }
  112. void ApplyKindToTargets()
  113. {
  114. foreach (var t in targets)
  115. {
  116. if (t is not AppUITMPInputField field)
  117. continue;
  118. Undo.RecordObject(field, "Apply AppUI Input Kind");
  119. if (field.InputField != null)
  120. Undo.RecordObject(field.InputField, "Apply AppUI Input Kind");
  121. field.ApplyKindSettings();
  122. EditorUtility.SetDirty(field);
  123. if (field.InputField != null)
  124. EditorUtility.SetDirty(field.InputField);
  125. }
  126. }
  127. }
  128. }