using System.Collections.Generic;
|
using UnityEditor;
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
[CustomEditor(typeof(ImageLanguageAdapter), true)]
|
[CanEditMultipleObjects]
|
public class ImageLanguageAdapterEditor : Editor
|
{
|
private Dictionary<string, bool> m_FoldoutStates = new Dictionary<string, bool>();
|
|
private void OnEnable()
|
{
|
ImageLanguageAdapterHelper.Initialize();
|
|
if (target is ImageLanguageAdapter adapter)
|
{
|
if (!adapter.HasConfig(ImageLanguageAdapter.DefaultLangId))
|
{
|
adapter.ReadCurrentToConfig(ImageLanguageAdapter.DefaultLangId);
|
EditorUtility.SetDirty(adapter);
|
}
|
foreach (var langId in adapter.GetConfiguredLanguages()) m_FoldoutStates.TryAdd(langId, false);
|
}
|
}
|
|
public override void OnInspectorGUI()
|
{
|
var adapter = target as ImageLanguageAdapter;
|
|
DrawBasicInfo(adapter);
|
EditorGUILayout.Space();
|
DrawLanguageConfigs(adapter);
|
|
if (GUI.changed) EditorUtility.SetDirty(target);
|
}
|
|
private void DrawBasicInfo(ImageLanguageAdapter adapter)
|
{
|
using (new EditorGUILayout.VerticalScope(EditorStyles.helpBox))
|
{
|
EditorGUILayout.LabelField("基本信息", EditorStyles.boldLabel);
|
|
EditorGUI.BeginChangeCheck();
|
|
Component newTarget = (Component)EditorGUILayout.ObjectField("目标组件", adapter.TargetImageComponent, typeof(Component), true);
|
ImageComponentType newType = (ImageComponentType)EditorGUILayout.EnumPopup("组件类型", adapter.TargetImageType);
|
|
if (EditorGUI.EndChangeCheck())
|
{
|
Undo.RecordObject(adapter, "Update Basic Info");
|
|
if (newTarget != null && newTarget != adapter.TargetImageComponent)
|
{
|
string typeName = newTarget.GetType().Name;
|
if (typeName == "ImageEx") newType = ImageComponentType.ImageEx;
|
else if (newTarget is Image) newType = ImageComponentType.Image;
|
}
|
|
adapter.TargetImageComponent = newTarget;
|
adapter.TargetImageType = newType;
|
}
|
|
EditorGUILayout.HelpBox("请手动拖拽要适配的图片组件,并确认组件类型是否正确。", MessageType.Info);
|
}
|
}
|
|
private void DrawLanguageConfigs(ImageLanguageAdapter 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(ImageLanguageAdapter adapter, string langId)
|
{
|
m_FoldoutStates.TryAdd(langId, false);
|
|
int presetIndex = System.Array.IndexOf(ImageLanguageAdapterHelper.PresetLanguageIds, langId);
|
string name = presetIndex >= 0 ? ImageLanguageAdapterHelper.PresetLanguageNames[presetIndex] : ImageLanguageAdapter.GetLanguageShowName(langId);
|
string label = string.IsNullOrEmpty(name) ? langId : $"{langId} ({name})";
|
|
EditorGUI.indentLevel++;
|
if (langId == ImageLanguageAdapter.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(ImageLanguageConfigItem 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("Image 配置", EditorStyles.miniBoldLabel);
|
|
cfg.enabled = EditorGUILayout.Toggle("显示", cfg.enabled);
|
cfg.color = EditorGUILayout.ColorField("Color", cfg.color);
|
cfg.type = (Image.Type)EditorGUILayout.EnumPopup("Type", cfg.type);
|
|
if (cfg.type == Image.Type.Sliced || cfg.type == Image.Type.Tiled)
|
{
|
cfg.fillCenter = EditorGUILayout.Toggle("Fill Center", cfg.fillCenter);
|
}
|
|
if (cfg.type == Image.Type.Filled)
|
{
|
cfg.fillMethod = (Image.FillMethod)EditorGUILayout.EnumPopup("Fill Method", cfg.fillMethod);
|
cfg.fillAmount = EditorGUILayout.Slider("Fill Amount", cfg.fillAmount, 0f, 1f);
|
cfg.fillOrigin = EditorGUILayout.IntField("Fill Origin", cfg.fillOrigin);
|
}
|
|
cfg.preserveAspect = EditorGUILayout.Toggle("Preserve Aspect", cfg.preserveAspect);
|
cfg.useSpriteMesh = EditorGUILayout.Toggle("Use Sprite Mesh", cfg.useSpriteMesh);
|
cfg.pixelsPerUnitMultiplier = EditorGUILayout.FloatField("Pixels Per Unit Multiplier", cfg.pixelsPerUnitMultiplier);
|
|
if (EditorGUI.EndChangeCheck()) EditorUtility.SetDirty(target);
|
}
|
|
private void DrawConfigItemActions(ImageLanguageAdapter 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 == ImageLanguageAdapter.DefaultLangId))
|
{
|
if (GUILayout.Button("删除", GUILayout.Width(50)))
|
{
|
Undo.RecordObject(adapter, "Remove Config");
|
adapter.RemoveConfig(langId);
|
m_FoldoutStates.Remove(langId);
|
}
|
}
|
}
|
}
|
|
private void DrawAddLanguageConfig(ImageLanguageAdapter 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 < ImageLanguageAdapterHelper.PresetLanguageIds.Length; i++)
|
{
|
string langId = ImageLanguageAdapterHelper.PresetLanguageIds[i];
|
if (!adapter.HasConfig(langId))
|
{
|
if (currentWidth + buttonWidth > viewWidth)
|
{
|
EditorGUILayout.EndHorizontal();
|
EditorGUILayout.BeginHorizontal();
|
GUILayout.Space(115f);
|
currentWidth = 115f;
|
}
|
|
if (GUILayout.Button(ImageLanguageAdapterHelper.PresetLanguageNames[i], GUILayout.Width(60)))
|
{
|
Undo.RecordObject(adapter, "Add Language Config");
|
var newConfig = adapter.HasConfig(ImageLanguageAdapter.DefaultLangId)
|
? adapter.LanguageConfigs.Get(ImageLanguageAdapter.DefaultLangId).Clone()
|
: new ImageLanguageConfigItem();
|
adapter.SetConfig(langId, newConfig);
|
m_FoldoutStates[langId] = true;
|
}
|
currentWidth += buttonWidth;
|
}
|
}
|
EditorGUILayout.EndHorizontal();
|
}
|
}
|