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

98 lines
3.0 KiB
C#

namespace AlicizaX.PackageManager.Editor
{
using System;
using UnityEditor;
using UnityEditor.PackageManager;
using UnityEditor.PackageManager.Requests;
internal static class PackageOperationRunner
{
private static AddRequest s_addRequest;
private static RemoveRequest s_removeRequest;
private static Action<bool, string> s_callback;
private static string s_operationName;
public static bool IsBusy => s_addRequest != null || s_removeRequest != null;
public static void RunAdd(string packageIdentifier, Action<bool, string> callback)
{
if (IsBusy)
{
callback?.Invoke(false, "Another package operation is in progress.");
return;
}
s_operationName = $"Add {packageIdentifier}";
s_callback = callback;
s_addRequest = Client.Add(packageIdentifier);
EditorApplication.update -= Poll;
EditorApplication.update += Poll;
}
public static void RunRemove(string packageName, Action<bool, string> callback)
{
if (IsBusy)
{
callback?.Invoke(false, "Another package operation is in progress.");
return;
}
s_operationName = $"Remove {packageName}";
s_callback = callback;
s_removeRequest = Client.Remove(packageName);
EditorApplication.update -= Poll;
EditorApplication.update += Poll;
}
private static void Poll()
{
if (s_addRequest != null)
{
if (!s_addRequest.IsCompleted)
{
return;
}
var success = s_addRequest.Status == StatusCode.Success;
var message = success ? s_addRequest.Result?.name : s_addRequest.Error?.message;
s_addRequest = null;
Complete(success, message);
return;
}
if (s_removeRequest != null)
{
if (!s_removeRequest.IsCompleted)
{
return;
}
var success = s_removeRequest.Status == StatusCode.Success;
var message = success ? s_removeRequest.PackageIdOrName : s_removeRequest.Error?.message;
s_removeRequest = null;
Complete(success, message);
return;
}
EditorApplication.update -= Poll;
}
private static void Complete(bool success, string message)
{
EditorApplication.update -= Poll;
var callback = s_callback;
var operationName = s_operationName;
s_callback = null;
s_operationName = null;
if (!success)
{
UnityEngine.Debug.LogError($"{operationName} failed: {message}");
}
callback?.Invoke(success, message);
}
}
}