using System.Collections.Generic;
|
using UnityEditor;
|
using UnityEngine;
|
|
[CustomEditor(typeof(CommonLanguageAdapter), true)]
|
[CanEditMultipleObjects]
|
public class CommonLanguageAdapterEditor : Editor
|
{
|
private Dictionary<string, bool> m_FoldoutStates = new Dictionary<string, bool>();
|
|
private void OnEnable()
|
{
|
CommonLanguageAdapterHelper.Initialize();
|
|
if (target is CommonLanguageAdapter adapter)
|
{
|
if (!adapter.HasConfig(CommonLanguageAdapter.DefaultLangId))
|
{
|
adapter.ReadCurrentToConfig(CommonLanguageAdapter.DefaultLangId);
|
EditorUtility.SetDirty(adapter);
|
}
|
foreach (var langId in adapter.GetConfiguredLanguages()) m_FoldoutStates.TryAdd(langId, false);
|
}
|
}
|
|
public override void OnInspectorGUI()
|
{
|
var adapter = target as CommonLanguageAdapter;
|
|
DrawBasicInfo(adapter);
|
EditorGUILayout.Space();
|
DrawLanguageConfigs(adapter);
|
|
if (GUI.changed) EditorUtility.SetDirty(target);
|
}
|
|
private void DrawBasicInfo(CommonLanguageAdapter adapter)
|
{
|
using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox))
|
{
|
EditorGUILayout.LabelField("基本信息", EditorStyles.boldLabel);
|
|
EditorGUI.BeginChangeCheck();
|
|
RectTransform newTarget = (RectTransform)EditorGUILayout.ObjectField("目标 RectTransform", adapter.TargetRectTransform, typeof(RectTransform), true);
|
|
if (EditorGUI.EndChangeCheck())
|
{
|
Undo.RecordObject(adapter, "Update Basic Info");
|
adapter.TargetRectTransform = newTarget;
|
}
|
|
EditorGUILayout.HelpBox("留空则默认控制本物体的 RectTransform。修改组件状态 (enabled) 会直接影响其所在 GameObject 的 Active 状态。", MessageType.Info);
|
}
|
}
|
|
private void DrawLanguageConfigs(CommonLanguageAdapter adapter)
|
{
|
using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox))
|
{
|
EditorGUILayout.LabelField("语言排版配置", EditorStyles.boldLabel);
|
EditorGUILayout.HelpBox("default仅用于编辑时恢复初始状态,无对应语言配置时用组件当前状态", MessageType.Info);
|
|
foreach (var langId in adapter.GetConfiguredLanguages()) DrawLanguageConfigItem(adapter, langId);
|
|
EditorGUILayout.Space();
|
DrawAddLanguageConfig(adapter);
|
}
|
}
|
|
private void DrawLanguageConfigItem(CommonLanguageAdapter adapter, string langId)
|
{
|
m_FoldoutStates.TryAdd(langId, false);
|
|
int presetIndex = System.Array.IndexOf(CommonLanguageAdapterHelper.PresetLanguageIds, langId);
|
string name = presetIndex >= 0 ? CommonLanguageAdapterHelper.PresetLanguageNames[presetIndex] : CommonLanguageAdapter.GetLanguageShowName(langId);
|
string label = string.IsNullOrEmpty(name) ? langId : $"{langId} ({name})";
|
|
EditorGUI.indentLevel++;
|
if (langId == CommonLanguageAdapter.DefaultLangId) GUI.backgroundColor = new Color(1f, 0.9f, 0.7f);
|
|
m_FoldoutStates[langId] = EditorGUILayout.Foldout(m_FoldoutStates[langId], label, true);
|
GUI.backgroundColor = Color.white;
|
|
if (m_FoldoutStates[langId])
|
{
|
EditorGUI.indentLevel++;
|
var config = adapter.LanguageConfigs.Get(langId);
|
if (config != null)
|
{
|
DrawConfigItem(config);
|
EditorGUILayout.Space();
|
DrawConfigItemActions(adapter, langId);
|
}
|
EditorGUI.indentLevel--;
|
}
|
EditorGUI.indentLevel--;
|
}
|
|
private void DrawConfigItem(CommonLanguageConfigItem cfg)
|
{
|
EditorGUILayout.LabelField("RectTransform 配置", EditorStyles.miniBoldLabel);
|
EditorGUI.BeginChangeCheck();
|
|
cfg.anchoredPosition = EditorGUILayout.Vector2Field("Anchored Position", cfg.anchoredPosition);
|
cfg.sizeDelta = EditorGUILayout.Vector2Field("Size Delta", cfg.sizeDelta);
|
cfg.anchorMin = EditorGUILayout.Vector2Field("Anchor Min", cfg.anchorMin);
|
cfg.anchorMax = EditorGUILayout.Vector2Field("Anchor Max", cfg.anchorMax);
|
cfg.pivot = EditorGUILayout.Vector2Field("Pivot", cfg.pivot);
|
cfg.localScale = EditorGUILayout.Vector3Field("Local Scale", cfg.localScale);
|
cfg.localRotation = EditorGUILayout.Vector3Field("Local Rotation", cfg.localRotation);
|
|
EditorGUILayout.Space();
|
EditorGUILayout.LabelField("基础配置", EditorStyles.miniBoldLabel);
|
|
cfg.enabled = EditorGUILayout.Toggle("显示 (Active)", cfg.enabled);
|
|
if (EditorGUI.EndChangeCheck()) EditorUtility.SetDirty(target);
|
}
|
|
private void DrawConfigItemActions(CommonLanguageAdapter adapter, string langId)
|
{
|
using (new EditorGUILayout.HorizontalScope())
|
{
|
GUILayout.Space(EditorGUI.indentLevel * 15f);
|
|
if (GUILayout.Button("从当前读取", GUILayout.Width(80)))
|
{
|
Undo.RecordObject(adapter, "Read Current Config");
|
adapter.ReadCurrentToConfig(langId);
|
}
|
|
if (GUILayout.Button("应用", GUILayout.Width(60)))
|
{
|
Undo.RecordObject(adapter, "Apply Config");
|
adapter.ApplyConfig(langId);
|
}
|
|
using (new EditorGUI.DisabledScope(langId == CommonLanguageAdapter.DefaultLangId))
|
{
|
if (GUILayout.Button("删除", GUILayout.Width(50)))
|
{
|
Undo.RecordObject(adapter, "Remove Config");
|
adapter.RemoveConfig(langId);
|
m_FoldoutStates.Remove(langId);
|
}
|
}
|
}
|
}
|
|
private void DrawAddLanguageConfig(CommonLanguageAdapter adapter)
|
{
|
EditorGUILayout.BeginHorizontal();
|
GUILayout.Space(15f);
|
EditorGUILayout.LabelField("添加预设语言:", GUILayout.Width(100));
|
|
float viewWidth = EditorGUIUtility.currentViewWidth - 30f;
|
float currentWidth = 115f;
|
float buttonWidth = 64f;
|
|
for (int i = 0; i < CommonLanguageAdapterHelper.PresetLanguageIds.Length; i++)
|
{
|
string langId = CommonLanguageAdapterHelper.PresetLanguageIds[i];
|
if (!adapter.HasConfig(langId))
|
{
|
if (currentWidth + buttonWidth > viewWidth)
|
{
|
EditorGUILayout.EndHorizontal();
|
EditorGUILayout.BeginHorizontal();
|
GUILayout.Space(115f);
|
currentWidth = 115f;
|
}
|
|
if (GUILayout.Button(CommonLanguageAdapterHelper.PresetLanguageNames[i], GUILayout.Width(60)))
|
{
|
Undo.RecordObject(adapter, "Add Language Config");
|
var newConfig = adapter.HasConfig(CommonLanguageAdapter.DefaultLangId)
|
? adapter.LanguageConfigs.Get(CommonLanguageAdapter.DefaultLangId).Clone()
|
: new CommonLanguageConfigItem();
|
adapter.SetConfig(langId, newConfig);
|
m_FoldoutStates[langId] = true;
|
}
|
currentWidth += buttonWidth;
|
}
|
}
|
EditorGUILayout.EndHorizontal();
|
}
|
}
|