From f661375604d48478ea2b0716d11c9a31c336f013 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期一, 11 五月 2026 10:53:25 +0800
Subject: [PATCH] 592 多语言适配 提交主干

---
 Assets/Editor/UIComponent/ImageLanguageAdapterScanTool.cs |  142 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 119 insertions(+), 23 deletions(-)

diff --git a/Assets/Editor/UIComponent/ImageLanguageAdapterScanTool.cs b/Assets/Editor/UIComponent/ImageLanguageAdapterScanTool.cs
index fa4b514..6590bc4 100644
--- a/Assets/Editor/UIComponent/ImageLanguageAdapterScanTool.cs
+++ b/Assets/Editor/UIComponent/ImageLanguageAdapterScanTool.cs
@@ -4,8 +4,6 @@
 using UnityEditor.IMGUI.Controls;
 using UnityEngine;
 
-// ======================== 鎵弿鏁版嵁妯″瀷 ========================
-
 public class ImageScanResultItem
 {
     public string PrefabPath { get; }
@@ -44,7 +42,10 @@
     public int TotalPrefabsScanned { get; set; }
     public int TotalAdaptersFound { get; set; }
     public int AdaptersWithMissingConfig { get; private set; }
+    public int PrefabsWithIssueCount { get; private set; }
+    public int PrefabsWithoutIssueCount { get; private set; }
     public List<ImagePrefabScanResult> PrefabResults { get; } = new List<ImagePrefabScanResult>();
+    public List<ImagePrefabScanResult> PrefabResultsWithoutIssue { get; } = new List<ImagePrefabScanResult>();
 
     public ImageScanResultSummary(string dir) => ScanDirectory = dir;
 
@@ -55,13 +56,31 @@
         {
             prefabResult = new ImagePrefabScanResult(item.PrefabPath, item.PrefabGUID);
             PrefabResults.Add(prefabResult);
+            PrefabsWithIssueCount++;
         }
         prefabResult.Items.Add(item);
-        AdaptersWithMissingConfig++;
+        
+        if (item.MissingLanguages.Count > 0)
+        {
+            AdaptersWithMissingConfig++;
+        }
+    }
+
+    public void AddPrefabWithoutIssue(string path, string guid, List<ImageScanResultItem> items)
+    {
+        var prefabResult = new ImagePrefabScanResult(path, guid);
+        prefabResult.Items.AddRange(items);
+        PrefabResultsWithoutIssue.Add(prefabResult);
+        PrefabsWithoutIssueCount++;
     }
 }
 
-// ======================== TreeView 瀹炵幇 ========================
+public enum ImageScanResultFilterMode
+{
+    鍏ㄩ儴,
+    浠呮樉绀烘湁闂,
+    浠呮樉绀烘棤闂
+}
 
 public class ImageMetadataTreeViewItem : TreeViewItem
 {
@@ -72,10 +91,12 @@
 public class ImageScanResultTreeView : TreeView
 {
     private ImageScanResultSummary m_Summary;
+    private ImageScanResultFilterMode m_FilterMode;
 
-    public ImageScanResultTreeView(TreeViewState state, ImageScanResultSummary summary) : base(state)
+    public ImageScanResultTreeView(TreeViewState state, ImageScanResultSummary summary, ImageScanResultFilterMode filterMode) : base(state)
     {
         m_Summary = summary;
+        m_FilterMode = filterMode;
         Reload();
         ExpandAll();
     }
@@ -86,21 +107,60 @@
 
         root.children = new List<TreeViewItem>();
 
-        if (m_Summary == null || m_Summary.PrefabResults.Count == 0)
+        if (m_Summary == null)
             return root;
 
         int itemId = 1;
-        foreach (var prefabResult in m_Summary.PrefabResults)
-        {
-            string prefabName = Path.GetFileNameWithoutExtension(prefabResult.PrefabPath);
-            var prefabItem = new ImageMetadataTreeViewItem(itemId++, $"{prefabName} ({prefabResult.Items.Count}涓棶棰�)", prefabResult);
 
-            foreach (var adapterItem in prefabResult.Items)
+        bool showWithIssue = m_FilterMode == ImageScanResultFilterMode.鍏ㄩ儴 || 
+                            m_FilterMode == ImageScanResultFilterMode.浠呮樉绀烘湁闂;
+        bool showWithoutIssue = m_FilterMode == ImageScanResultFilterMode.鍏ㄩ儴 || 
+                               m_FilterMode == ImageScanResultFilterMode.浠呮樉绀烘棤闂;
+
+        if (showWithIssue)
+        {
+            foreach (var prefabResult in m_Summary.PrefabResults)
             {
-                var adapterTreeItem = new ImageMetadataTreeViewItem(itemId++, adapterItem.GetDisplayName(), adapterItem);
-                prefabItem.AddChild(adapterTreeItem);
+                string prefabName = Path.GetFileNameWithoutExtension(prefabResult.PrefabPath);
+                
+                int issueCount = 0;
+                foreach (var item in prefabResult.Items)
+                {
+                    if (item.MissingLanguages != null && item.MissingLanguages.Count > 0)
+                        issueCount++;
+                }
+
+                var prefabItem = new ImageMetadataTreeViewItem(itemId++, $"{prefabName} ({issueCount}涓棶棰�)", prefabResult);
+
+                foreach (var adapterItem in prefabResult.Items)
+                {
+                    string displayName;
+                    if (adapterItem.MissingLanguages.Count > 0)
+                        displayName = adapterItem.GetDisplayName();
+                    else
+                        displayName = $"{adapterItem.GameObjectPath} (閰嶇疆瀹屾暣)";
+                    var adapterTreeItem = new ImageMetadataTreeViewItem(itemId++, displayName, adapterItem);
+                    prefabItem.AddChild(adapterTreeItem);
+                }
+                root.AddChild(prefabItem);
             }
-            root.AddChild(prefabItem);
+        }
+
+        if (showWithoutIssue)
+        {
+            foreach (var prefabResult in m_Summary.PrefabResultsWithoutIssue)
+            {
+                string prefabName = Path.GetFileNameWithoutExtension(prefabResult.PrefabPath);
+                var prefabItem = new ImageMetadataTreeViewItem(itemId++, $"{prefabName} (鏃犻棶棰�)", prefabResult);
+
+                foreach (var adapterItem in prefabResult.Items)
+                {
+                    var displayName = $"{adapterItem.GameObjectPath} (閰嶇疆瀹屾暣)";
+                    var adapterTreeItem = new ImageMetadataTreeViewItem(itemId++, displayName, adapterItem);
+                    prefabItem.AddChild(adapterTreeItem);
+                }
+                root.AddChild(prefabItem);
+            }
         }
 
         SetupDepthsFromParentsAndChildren(root);
@@ -114,7 +174,12 @@
         if (item != null && item.Metadata is ImagePrefabScanResult)
             GUI.Label(args.rowRect, item.displayName, EditorStyles.boldLabel);
         else if (item != null && item.Metadata is ImageScanResultItem adapterItem)
-            GUI.Label(args.rowRect, $"{adapterItem.GameObjectPath} (缂哄皯: {string.Join(", ", adapterItem.MissingLanguages)})");
+        {
+            if (adapterItem.MissingLanguages.Count > 0)
+                GUI.Label(args.rowRect, $"{adapterItem.GameObjectPath} (缂哄皯: {string.Join(", ", adapterItem.MissingLanguages)})");
+            else
+                GUI.Label(args.rowRect, item.displayName);
+        }
         else
             base.RowGUI(args);
     }
@@ -157,8 +222,6 @@
     }
 }
 
-// ======================== 鎵弿宸ュ叿涓荤獥鍙� ========================
-
 public class ImageLanguageAdapterScanTool : EditorWindow
 {
     private string m_ScanDirectory = "Assets";
@@ -170,6 +233,7 @@
 
     private ImageScanResultTreeView m_TreeView;
     private TreeViewState m_TreeViewState;
+    private ImageScanResultFilterMode m_ResultFilterMode = ImageScanResultFilterMode.鍏ㄩ儴;
 
     private int m_SourceLangIndex = 0;
     private int m_TargetLangIndex = 0;
@@ -275,7 +339,20 @@
 
             if (m_ScanResult != null)
             {
-                EditorGUILayout.LabelField($"棰勫埗浣撴�绘暟: {m_ScanResult.TotalPrefabsScanned} | Adapter鎬绘暟: {m_ScanResult.TotalAdaptersFound} | 缂哄け閰嶇疆: {m_ScanResult.AdaptersWithMissingConfig}");
+                EditorGUILayout.LabelField($"棰勫埗浣撴�绘暟: {m_ScanResult.TotalPrefabsScanned} | 鏈堿dapter鐨勯鍒朵綋: {m_ScanResult.PrefabsWithIssueCount + m_ScanResult.PrefabsWithoutIssueCount} | Adapter鎬绘暟: {m_ScanResult.TotalAdaptersFound} | 缂哄け閰嶇疆: {m_ScanResult.AdaptersWithMissingConfig} | 鏈夐棶棰橀鍒朵綋: {m_ScanResult.PrefabsWithIssueCount} | 鏃犻棶棰橀鍒朵綋: {m_ScanResult.PrefabsWithoutIssueCount}");
+                EditorGUILayout.Space(5f);
+
+                using (new EditorGUILayout.HorizontalScope())
+                {
+                    EditorGUILayout.LabelField("鏄剧ず妯″紡:", GUILayout.Width(60f));
+                    EditorGUI.BeginChangeCheck();
+                    m_ResultFilterMode = (ImageScanResultFilterMode)EditorGUILayout.EnumPopup(m_ResultFilterMode);
+                    if (EditorGUI.EndChangeCheck() && m_TreeView != null)
+                    {
+                        m_TreeViewState ??= new TreeViewState();
+                        m_TreeView = new ImageScanResultTreeView(m_TreeViewState, m_ScanResult, m_ResultFilterMode);
+                    }
+                }
                 EditorGUILayout.Space(5f);
 
                 if (m_TreeView != null)
@@ -450,7 +527,7 @@
         }
 
         m_TreeViewState ??= new TreeViewState();
-        m_TreeView = new ImageScanResultTreeView(m_TreeViewState, m_ScanResult);
+        m_TreeView = new ImageScanResultTreeView(m_TreeViewState, m_ScanResult, m_ResultFilterMode);
         m_ScanStatus = $"鎵弿瀹屾垚! 鍙戠幇 {m_ScanResult.AdaptersWithMissingConfig} 涓己澶遍厤缃�";
         Repaint();
     }
@@ -461,8 +538,12 @@
         if (prefab == null) return;
 
         var adapters = prefab.GetComponentsInChildren<ImageLanguageAdapter>(true);
+        if (adapters.Length == 0) return;
 
         m_ScanResult.TotalAdaptersFound += adapters.Length;
+
+        bool hasIssue = false;
+        List<ImageScanResultItem> allItems = new List<ImageScanResultItem>();
 
         foreach (var adapter in adapters)
         {
@@ -473,15 +554,30 @@
                 if (!adapter.HasConfig(langId)) missing.Add(langId);
             }
 
+            var item = new ImageScanResultItem(path, GetGameObjectPath(adapter.gameObject, prefab), adapter.TargetImageType, guid)
+            {
+                MissingLanguages = missing
+            };
+
+            allItems.Add(item);
+
             if (missing.Count > 0)
             {
-                var item = new ImageScanResultItem(path, GetGameObjectPath(adapter.gameObject, prefab), adapter.TargetImageType, guid)
-                {
-                    MissingLanguages = missing
-                };
+                hasIssue = true;
+            }
+        }
+
+        if (hasIssue)
+        {
+            foreach (var item in allItems)
+            {
                 m_ScanResult.AddResult(item);
             }
         }
+        else
+        {
+            m_ScanResult.AddPrefabWithoutIssue(path, guid, allItems);
+        }
     }
 
     private string GetGameObjectPath(GameObject go, GameObject root)

--
Gitblit v1.8.0