using UnityEditor; using UnityEngine; using UnityEngine.UIElements; using UnityEditorInternal; namespace AlicizaX.Localization.Editor { internal class LocalizationSettingsProvider : UnityEditor.SettingsProvider { private SerializedObject _serializedObject; private SerializedProperty _languageTypes; private ReorderableList _languageList; public LocalizationSettingsProvider() : base("Project/Localization Settings", SettingsScope.Project) { } public override void OnActivate(string searchContext, VisualElement rootElement) { InitGUI(); } private void InitGUI() { var setting = LocalizationConfiguration.Instance; _serializedObject?.Dispose(); _serializedObject = new SerializedObject(setting); _languageTypes = _serializedObject.FindProperty("LanguageTypes"); // 自定义 ReorderableList _languageList = new ReorderableList(_serializedObject, _languageTypes, draggable: false, // 禁止拖拽 displayHeader: true, displayAddButton: true, displayRemoveButton: true); _languageList.drawHeaderCallback = rect => { EditorGUI.LabelField(rect, "Language Types"); }; _languageList.drawElementCallback = (rect, index, isActive, isFocused) => { var element = _languageTypes.GetArrayElementAtIndex(index); rect.y += 2; // 只显示可编辑的 string 字段 element.stringValue = EditorGUI.TextField( new Rect(rect.x, rect.y, rect.width, EditorGUIUtility.singleLineHeight), element.stringValue); }; } public override void OnGUI(string searchContext) { if (_serializedObject == null || !_serializedObject.targetObject) { InitGUI(); } _serializedObject.Update(); EditorGUI.BeginChangeCheck(); // 使用 ReorderableList 绘制 _languageList.DoLayoutList(); if (EditorGUI.EndChangeCheck()) { _serializedObject.ApplyModifiedProperties(); LocalizationConfiguration.Save(); } } public override void OnDeactivate() { base.OnDeactivate(); LocalizationConfiguration.Save(); } static LocalizationSettingsProvider s_provider; [SettingsProvider] public static SettingsProvider CreateMyCustomSettingsProvider() { if (s_provider == null) { s_provider = new LocalizationSettingsProvider(); } return s_provider; } } }