com.alicizax.unity.framework/Editor/Localization/LocalizationSettingsProvider.cs

92 lines
2.8 KiB
C#
Raw Normal View History

2025-09-23 12:04:39 +08:00
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;
}
}
}