#if UNITY_EDITOR #nullable enable using System; using System.Linq; using UnityEditor; using UnityEditor.PackageManager; using UnityEditor.PackageManager.Requests; using UnityEngine; namespace ShrinkSDK.Installer { internal sealed class ShrinkSdkInstallerWindow : EditorWindow { private ListRequest? _listRequest; private int _selectedPackageIndex; private string _status = "Ready"; private MessageType _statusType = MessageType.Info; [MenuItem("ShrinkSDK/Packages")] private static void Open() { GetWindow("ShrinkSDK Packages"); } private void OnEnable() { RefreshDiagnostics(); } private void OnGUI() { EditorGUILayout.LabelField("ShrinkSDK", EditorStyles.boldLabel); EditorGUILayout.Space(4f); EditorGUILayout.LabelField("Registry", ShrinkSdkManifestStore.HasShrinkSdkRegistry() ? ShrinkSdkPackageCatalog.RegistryUrl : "Not configured"); using (new EditorGUI.DisabledScope(IsBusy)) { if (GUILayout.Button("Configure Registry")) { ConfigureRegistry(); } EditorGUILayout.Space(8f); if (GUILayout.Button("Install Starter Basic")) { BeginInstall(ShrinkSdkPackageCatalog.StarterBasic); } var labels = ShrinkSdkPackageCatalog.Packages.Select(entry => entry.DisplayName + " " + entry.Version).ToArray(); _selectedPackageIndex = EditorGUILayout.Popup("Package", _selectedPackageIndex, labels); if (GUILayout.Button("Install Selected Package")) { BeginInstall(ShrinkSdkPackageCatalog.Packages[_selectedPackageIndex]); } if (GUILayout.Button("Refresh Diagnostics")) { RefreshDiagnostics(); } } EditorGUILayout.Space(8f); EditorGUILayout.HelpBox(_status, _statusType); } private bool IsBusy => _listRequest != null; private void Update() { if (_listRequest != null && _listRequest.IsCompleted) { var request = _listRequest; _listRequest = null; if (request.Status == StatusCode.Success) { var installed = request.Result.Count(package => package.name.StartsWith("com.cneicy.", StringComparison.Ordinal)); SetStatus("Registry is configured. Installed ShrinkSDK packages: " + installed, MessageType.Info); } else { var errorMessage = request.Error?.message; SetStatus( string.IsNullOrWhiteSpace(errorMessage) ? "Package diagnostics did not complete while Unity was resolving packages. Refresh diagnostics after resolution completes." : "Package diagnostics failed: " + errorMessage, MessageType.Warning); } } } private void ConfigureRegistry() { try { ShrinkSdkManifestStore.EnsureShrinkSdkRegistry(); SetStatus("Registry configuration written. Unity will resolve the updated manifest.", MessageType.Info); } catch (Exception exception) { SetStatus(exception.Message, MessageType.Error); } } private void BeginInstall(ShrinkSdkPackageEntry entry) { try { ShrinkSdkManifestStore.EnsurePackageInstallation(entry); SetStatus( "Pinned " + entry.PackageName + " " + entry.Version + " in Packages/manifest.json. Unity will resolve the updated manifest.", MessageType.Info); } catch (Exception exception) { SetStatus(exception.Message, MessageType.Error); } } private void RefreshDiagnostics() { if (IsBusy) { return; } _listRequest = Client.List(true); SetStatus("Refreshing installed package diagnostics.", MessageType.Info); } private void SetStatus(string message, MessageType messageType) { _status = message; _statusType = messageType; Repaint(); } } } #endif