NLDClient-yudde/ProjectNLD/Assets/Editor/SDKPackage/SDKPackageEditorWindow.cs

152 lines
5.2 KiB
C#

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<SDKPackageEntry> _packageEntries = new List<SDKPackageEntry>();
[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<string> _newDefines = new List<string>();
[ShowIf("_hasSkippedDefines")]
[Title("跳过宏定义(已存在)", titleAlignment: TitleAlignments.Left)]
[ListDrawerSettings(IsReadOnly = true)]
[ShowInInspector]
[PropertyOrder(3)]
private List<string> _skippedDefines = new List<string>();
[ShowIf("_hasPreviewFiles")]
[Title("文件变更预览", titleAlignment: TitleAlignments.Left)]
[ListDrawerSettings(IsReadOnly = true, NumberOfItemsPerPage = 10)]
[ShowInInspector]
[PropertyOrder(4)]
private List<PackageFilePreview> _previewFiles = new List<PackageFilePreview>();
[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<SDKPackageEditorWindow>();
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<string>();
_skippedDefines = preview?.SkippedDefines ?? new List<string>();
_previewFiles = preview?.PackageFiles ?? new List<PackageFilePreview>();
_hasNewDefines = _newDefines.Count > 0;
_hasSkippedDefines = _skippedDefines.Count > 0;
_hasPreviewFiles = _previewFiles.Count > 0;
}
private void ClearPreview()
{
_newDefines = new List<string>();
_skippedDefines = new List<string>();
_previewFiles = new List<PackageFilePreview>();
_hasNewDefines = false;
_hasSkippedDefines = false;
_hasPreviewFiles = false;
}
private void Log(string message)
{
_logContent = string.IsNullOrEmpty(_logContent) ? message : $"{_logContent}\n{message}";
Debug.Log($"[SDKPackage] {message}");
}
}
}