98 lines
3.0 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|