com.alicizax.unity.packagem.../Editor/PackageManager/UpdateAllPackageHelper.cs
2026-04-17 14:21:41 +08:00

145 lines
4.3 KiB
C#

using System.Collections.Generic;
using UnityEditor;
namespace AlicizaX.PackageManager.Editor
{
internal static class UpdateAllPackageHelper
{
private static readonly Queue<RepositoryPackageData> PackagesToUpdate = new Queue<RepositoryPackageData>();
private static FrameworkPackageManagerWindow s_window;
private static int s_totalCount;
private static int s_currentIndex;
public static void UpdatePackages(FrameworkPackageManagerWindow window)
{
if (window == null)
{
return;
}
if (PackageOperationRunner.IsBusy)
{
EditorUtility.DisplayDialog("更新包", "当前有其他包操作正在执行。", "确定");
return;
}
var updatablePackages = CollectUpdatablePackages(window.RepositoryPackageDatas);
if (updatablePackages.Count == 0)
{
EditorUtility.DisplayDialog("更新包", "当前没有可更新的包。", "确定");
return;
}
var confirm = EditorUtility.DisplayDialog(
"更新包提示",
$"检测到 {updatablePackages.Count} 个包可更新,是否继续?\n更新完成后建议重新打开 Unity。",
"是",
"否");
if (!confirm)
{
return;
}
s_window = window;
PackagesToUpdate.Clear();
foreach (var package in updatablePackages)
{
PackagesToUpdate.Enqueue(package);
}
s_totalCount = PackagesToUpdate.Count;
s_currentIndex = 0;
UpdateNextPackage();
}
public static void UpdatePackage(FrameworkPackageManagerWindow window, RepositoryPackageData package)
{
if (window == null || package == null)
{
return;
}
if (PackageOperationRunner.IsBusy)
{
EditorUtility.DisplayDialog("更新包", "当前有其他包操作正在执行。", "确定");
return;
}
if (package.PackageState != PackageState.Update)
{
EditorUtility.DisplayDialog("更新包", "当前包没有检测到远端更新。", "确定");
return;
}
s_window = window;
PackagesToUpdate.Clear();
PackagesToUpdate.Enqueue(package);
s_totalCount = 1;
s_currentIndex = 0;
UpdateNextPackage();
}
private static List<RepositoryPackageData> CollectUpdatablePackages(List<RepositoryPackageData> repositoryPackageDatas)
{
var result = new List<RepositoryPackageData>();
if (repositoryPackageDatas == null)
{
return result;
}
foreach (var package in repositoryPackageDatas)
{
if (package == null || package.PackageState != PackageState.Update)
{
continue;
}
if (string.IsNullOrEmpty(package.cloneUrl))
{
continue;
}
result.Add(package);
}
return result;
}
private static void UpdateNextPackage()
{
if (PackagesToUpdate.Count == 0)
{
EditorUtility.ClearProgressBar();
s_window?.Refresh();
return;
}
s_currentIndex++;
var package = PackagesToUpdate.Dequeue();
var canceled = EditorUtility.DisplayCancelableProgressBar(
"正在更新包",
$"{s_currentIndex}/{s_totalCount} {package.name}",
(float)s_currentIndex / s_totalCount);
if (canceled)
{
PackagesToUpdate.Clear();
EditorUtility.ClearProgressBar();
return;
}
PackageManagerCheckTool.UpdatePackage(package, (success, _) =>
{
if (!success)
{
EditorUtility.ClearProgressBar();
return;
}
UpdateNextPackage();
});
}
}
}