using System; using System.Collections.Generic; using System.Linq; using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using Sirenix.Utilities; using Sirenix.Utilities.Editor; using UnityEditor; using UnityEngine; namespace SDKPackage.Editor { public class SDKPackageEditorWindow : OdinEditorWindow { [TableList(AlwaysExpanded = true, ShowIndexLabels = false, NumberOfItemsPerPage = 20, IsReadOnly = false)] [ShowInInspector] [PropertyOrder(1)] [HideLabel] private List _packageEntries = new List(); [HorizontalGroup("Actions", Width = 0.5f)] [Button("全选", ButtonSizes.Small)] private void SelectAll() { foreach (var entry in _packageEntries) entry.selected = true; } [HorizontalGroup("Actions")] [Button("全不选", ButtonSizes.Small)] private void DeselectAll() { foreach (var entry in _packageEntries) entry.selected = false; } [HorizontalGroup("Actions")] [Button("刷新列表", ButtonSizes.Small)] private void RefreshList() { _packageEntries = SDKPackageHelper.BuildPackageEntries(); ClearPreview(); } [PropertySpace(4)] [HorizontalGroup("InstallActions")] [Button("预览变更", ButtonSizes.Medium)] [EnableIf("HasSelectedPackages")] private void Preview() { UpdatePreview(SDKPackageHelper.GetChangePreview(_packageEntries)); } [HorizontalGroup("InstallActions")] [Button("安装选中包", ButtonSizes.Medium)] [EnableIf("HasSelectedPackages")] private void Install() { _logContent = ""; SDKPackageHelper.InstallPackages(_packageEntries, Log); _currentDefines = SDKPackageHelper.GetCurrentDefines(); UpdatePreview(SDKPackageHelper.GetChangePreview(_packageEntries)); } [ShowIf("_hasNewDefines")] [Title("新增宏定义", titleAlignment: TitleAlignments.Left)] [ListDrawerSettings(IsReadOnly = true)] [ShowInInspector] [PropertyOrder(3)] private List _newDefines = new List(); [ShowIf("_hasSkippedDefines")] [Title("跳过宏定义(已存在)", titleAlignment: TitleAlignments.Left)] [ListDrawerSettings(IsReadOnly = true)] [ShowInInspector] [PropertyOrder(3)] private List _skippedDefines = new List(); [ShowIf("_hasPreviewFiles")] [Title("文件变更预览", titleAlignment: TitleAlignments.Left)] [ListDrawerSettings(IsReadOnly = true, NumberOfItemsPerPage = 10)] [ShowInInspector] [PropertyOrder(4)] private List _previewFiles = new List(); [Title("当前宏定义", titleAlignment: TitleAlignments.Left)] [PropertyOrder(5)] [HideLabel] [DisplayAsString] [MultiLineProperty(3)] [ShowInInspector] private string _currentDefines; [Title("安装日志", titleAlignment: TitleAlignments.Left)] [PropertyOrder(6)] [MultiLineProperty(8)] [HideLabel] [ShowInInspector] private string _logContent = ""; private bool _hasNewDefines; private bool _hasSkippedDefines; private bool _hasPreviewFiles; [MenuItem("Tools/*SDK包管理器", false, 210)] public static void ShowWindow() { var window = GetWindow(); window.titleContent = new GUIContent("SDK包管理器"); window.position = GUIHelper.GetEditorWindowRect().AlignCenter(800, 700); window.Show(); } protected override void OnEnable() { base.OnEnable(); _packageEntries = SDKPackageHelper.BuildPackageEntries(); _currentDefines = SDKPackageHelper.GetCurrentDefines(); _logContent = ""; ClearPreview(); } private bool HasSelectedPackages => _packageEntries != null && _packageEntries.Any(e => e.selected); private void UpdatePreview(ChangePreview preview) { _newDefines = preview?.NewDefines ?? new List(); _skippedDefines = preview?.SkippedDefines ?? new List(); _previewFiles = preview?.PackageFiles ?? new List(); _hasNewDefines = _newDefines.Count > 0; _hasSkippedDefines = _skippedDefines.Count > 0; _hasPreviewFiles = _previewFiles.Count > 0; } private void ClearPreview() { _newDefines = new List(); _skippedDefines = new List(); _previewFiles = new List(); _hasNewDefines = false; _hasSkippedDefines = false; _hasPreviewFiles = false; } private void Log(string message) { _logContent = string.IsNullOrEmpty(_logContent) ? message : $"{_logContent}\n{message}"; Debug.Log($"[SDKPackage] {message}"); } } }