From 9d755479987795111e7b8721713b70abf98846e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <1464576565@qq.com> Date: Fri, 17 Apr 2026 15:34:48 +0800 Subject: [PATCH] Update LocalizationTableWindow.cs --- .../LocalizationTableWindow.cs | 109 ++++++++++++------ 1 file changed, 76 insertions(+), 33 deletions(-) diff --git a/Editor/Localization/LocalizationTableWindow/LocalizationTableWindow.cs b/Editor/Localization/LocalizationTableWindow/LocalizationTableWindow.cs index 9db4456..3571ee1 100644 --- a/Editor/Localization/LocalizationTableWindow/LocalizationTableWindow.cs +++ b/Editor/Localization/LocalizationTableWindow/LocalizationTableWindow.cs @@ -11,6 +11,13 @@ namespace AlicizaX.Localization.Editor { public class LocalizationTableWindow : EditorWindow { + private enum SearchTarget + { + Key, + Value + } + + private static readonly string[] SearchTargetOptions = { "Key", "Value" }; private List allTables = new List(); // 存储所有找到的GameLocaizationTable private string[] tableDisplayNames; // 用于下拉框显示的名称数组 private int selectedTableIndex = 0; // 当前选中的索引 @@ -59,6 +66,7 @@ namespace AlicizaX.Localization.Editor private SearchField searchField; private string searchString; + [SerializeField] private SearchTarget searchTarget = SearchTarget.Key; private Vector2 scrollPosition; [SerializeField] private TreeViewState languagesTreeViewState; @@ -72,7 +80,7 @@ namespace AlicizaX.Localization.Editor private void CreateGUI() { - searchField = new SearchField(); + EnsureSearchField(); } private void OnDestroy() @@ -82,9 +90,18 @@ namespace AlicizaX.Localization.Editor private void OnEnable() { + EnsureSearchField(); RefreshTableList(); } + private void EnsureSearchField() + { + if (searchField == null) + { + searchField = new SearchField(); + } + } + private void OnDisable() { SaveSelection(); @@ -191,12 +208,14 @@ namespace AlicizaX.Localization.Editor private void OnGUI() { + EnsureSearchField(); // 顶部工具栏 Rect toolbarRect = new(0, 0, position.width, 20f); GUI.Box(toolbarRect, GUIContent.none, EditorStyles.toolbar); float buttonWidth = 100f; float spacing = 5f; + float searchTypeWidth = 65f; Rect leftTitle = new(toolbarRect.xMin, 0, 40, 20f); Rect leftPop = new(leftTitle.xMin + 40, 0, 200, 20f); @@ -204,6 +223,8 @@ namespace AlicizaX.Localization.Editor Rect genBtn = new(saveBtn.xMin - buttonWidth - spacing, 0, buttonWidth, 20f); Rect importBtn = new(genBtn.xMin - buttonWidth - spacing, 0, buttonWidth, 20f); Rect exportBtn = new(importBtn.xMin - buttonWidth - spacing, 0, buttonWidth, 20f); + Rect searchTypePopup = new(leftPop.xMax + spacing, 0, searchTypeWidth, 20f); + Rect searchRect = new(searchTypePopup.xMax + spacing, 0, Mathf.Max(80f, exportBtn.xMin - spacing - (searchTypePopup.xMax + spacing)), 20f); EditorGUI.LabelField(leftTitle, "Table", EditorStyles.boldLabel); EditorDrawing.DrawStringSelectPopup(leftPop, tableDisplayNames, selectString, (e) => @@ -213,6 +234,12 @@ namespace AlicizaX.Localization.Editor UpdateCurrentTable(); }); + using (new EditorGUI.DisabledGroupScope(currentTable == null || !(selection is LanguageSelect))) + { + searchTarget = (SearchTarget)EditorGUI.Popup(searchTypePopup, (int)searchTarget, SearchTargetOptions, EditorStyles.toolbarPopup); + searchString = searchField.OnToolbarGUI(searchRect, searchString); + } + if (currentTable == null) return; if (GUI.Button(exportBtn, "Export CSV", EditorStyles.toolbarButton)) @@ -402,44 +429,42 @@ namespace AlicizaX.Localization.Editor { var language = selection.Language; var entry = language.Entry; - var treeView = selection.TreeViewItem; using (new EditorGUI.DisabledGroupScope(entry.Asset == null)) { - // Draw search field EditorGUILayout.Space(); GUIContent expandText = new GUIContent("Expand"); float expandWidth = miniLabelButton.CalcSize(expandText).x; - var searchRect = EditorGUILayout.GetControlRect(); - searchRect.xMax -= (expandWidth + 2f); - searchString = searchField.OnGUI(searchRect, searchString); - - Rect expandRect = new Rect(searchRect.xMax + 2f, searchRect.y, expandWidth, searchRect.height); - expandRect.y -= 1f; - - using (new EditorDrawing.BackgroundColorScope("#F7E987")) + using (new EditorGUILayout.HorizontalScope()) { - if (GUI.Button(expandRect, expandText, miniLabelButton)) + GUILayout.FlexibleSpace(); + + using (new EditorDrawing.BackgroundColorScope("#F7E987")) { - globalExpanded = !globalExpanded; - foreach (var section in language.TableSheet) + if (GUILayout.Button(expandText, miniLabelButton, GUILayout.Width(expandWidth))) { - section.Reference.IsExpanded = globalExpanded; + globalExpanded = !globalExpanded; + foreach (var section in language.TableSheet) + { + section.Reference.IsExpanded = globalExpanded; + } } } } if (entry.Asset != null) { + bool forceExpanded = !string.IsNullOrWhiteSpace(searchString); + // Draw localization data scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition); { - foreach (var section in GetSearchResult(language, searchString)) + foreach (var section in GetSearchResult(language, searchString, searchTarget)) { - DrawLocalizationKey(section); + DrawLocalizationKey(section, forceExpanded); } } EditorGUILayout.EndScrollView(); @@ -451,7 +476,7 @@ namespace AlicizaX.Localization.Editor } } - private void DrawLocalizationKey(TempSheetSection section) + private void DrawLocalizationKey(TempSheetSection section, bool forceExpanded = false) { if (section.Items == null || section.Items.Count == 0) return; @@ -459,15 +484,20 @@ namespace AlicizaX.Localization.Editor using (new EditorDrawing.BorderBoxScope(false)) { string sectionName = section.Name.Replace(" ", ""); - section.Reference.IsExpanded = EditorGUILayout.Foldout(section.Reference.IsExpanded, new GUIContent(sectionName), true, EditorDrawing.Styles.miniBoldLabelFoldout); + bool isExpanded = forceExpanded || section.Reference.IsExpanded; + bool nextExpanded = EditorGUILayout.Foldout(isExpanded, new GUIContent(sectionName), true, EditorDrawing.Styles.miniBoldLabelFoldout); + + if (!forceExpanded) + { + section.Reference.IsExpanded = nextExpanded; + } // Show section keys when expanded - if (section.Reference.IsExpanded) + if (forceExpanded || nextExpanded) { foreach (var item in section.Items) { - string keyName = item.Key.Replace(" ", ""); - string key = sectionName + "." + keyName; + string key = GetItemDisplayKey(section, item); if (IsMultiline(item.Value)) key += " (Multiline)"; @@ -503,31 +533,32 @@ namespace AlicizaX.Localization.Editor EditorGUILayout.Space(1f); } - private IEnumerable GetSearchResult(TempLanguageData languageData, string search) + private IEnumerable GetSearchResult(TempLanguageData languageData, string search, SearchTarget target) { - if (!string.IsNullOrEmpty(search)) + if (!string.IsNullOrWhiteSpace(search)) { List searchResult = new(); foreach (var section in languageData.TableSheet) { List sectionItems = new(); - string sectionName = section.Name.Replace(" ", ""); foreach (var item in section.Items) { - string keyName = item.Key.Replace(" ", ""); - string key = sectionName + "." + keyName; + string source = target == SearchTarget.Value ? item.Value : GetItemDisplayKey(section, item); - if (key.Contains(search)) + if (ContainsSearch(source, search)) sectionItems.Add(item); } - searchResult.Add(new TempSheetSection() + if (sectionItems.Count > 0) { - Items = sectionItems, - Reference = section.Reference - }); + searchResult.Add(new TempSheetSection() + { + Items = sectionItems, + Reference = section.Reference + }); + } } return searchResult; @@ -538,7 +569,19 @@ namespace AlicizaX.Localization.Editor private bool IsMultiline(string text) { - return text.Contains("\n") || text.Contains("\r"); + return !string.IsNullOrEmpty(text) && (text.Contains("\n") || text.Contains("\r")); + } + + private string GetItemDisplayKey(TempSheetSection section, TempSheetItem item) + { + string sectionName = section.Name.Replace(" ", ""); + string keyName = item.Key.Replace(" ", ""); + return sectionName + "." + keyName; + } + + private bool ContainsSearch(string source, string search) + { + return !string.IsNullOrEmpty(source) && source.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0; } private void BuildLocalizationTable()