MCPSetupWindow.cs•6.5 kB
using System;
using MCPForUnity.Editor.Dependencies;
using MCPForUnity.Editor.Dependencies.Models;
using MCPForUnity.Editor.Helpers;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
namespace MCPForUnity.Editor.Windows
{
/// <summary>
/// Setup window for checking and guiding dependency installation
/// </summary>
public class MCPSetupWindow : EditorWindow
{
// UI Elements
private VisualElement pythonIndicator;
private Label pythonVersion;
private Label pythonDetails;
private VisualElement uvIndicator;
private Label uvVersion;
private Label uvDetails;
private Label statusMessage;
private VisualElement installationSection;
private Label installationInstructions;
private Button openPythonLinkButton;
private Button openUvLinkButton;
private Button refreshButton;
private Button doneButton;
private DependencyCheckResult _dependencyResult;
public static void ShowWindow(DependencyCheckResult dependencyResult = null)
{
var window = GetWindow<MCPSetupWindow>("MCP Setup");
window.minSize = new Vector2(480, 320);
// window.maxSize = new Vector2(600, 700);
window._dependencyResult = dependencyResult ?? DependencyManager.CheckAllDependencies();
window.Show();
}
public void CreateGUI()
{
string basePath = AssetPathUtility.GetMcpPackageRootPath();
// Load UXML
var visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>(
$"{basePath}/Editor/Windows/MCPSetupWindow.uxml"
);
if (visualTree == null)
{
McpLog.Error($"Failed to load UXML at: {basePath}/Editor/Windows/MCPSetupWindow.uxml");
return;
}
visualTree.CloneTree(rootVisualElement);
// Cache UI elements
pythonIndicator = rootVisualElement.Q<VisualElement>("python-indicator");
pythonVersion = rootVisualElement.Q<Label>("python-version");
pythonDetails = rootVisualElement.Q<Label>("python-details");
uvIndicator = rootVisualElement.Q<VisualElement>("uv-indicator");
uvVersion = rootVisualElement.Q<Label>("uv-version");
uvDetails = rootVisualElement.Q<Label>("uv-details");
statusMessage = rootVisualElement.Q<Label>("status-message");
installationSection = rootVisualElement.Q<VisualElement>("installation-section");
installationInstructions = rootVisualElement.Q<Label>("installation-instructions");
openPythonLinkButton = rootVisualElement.Q<Button>("open-python-link-button");
openUvLinkButton = rootVisualElement.Q<Button>("open-uv-link-button");
refreshButton = rootVisualElement.Q<Button>("refresh-button");
doneButton = rootVisualElement.Q<Button>("done-button");
// Register callbacks
refreshButton.clicked += OnRefreshClicked;
doneButton.clicked += OnDoneClicked;
openPythonLinkButton.clicked += OnOpenPythonInstallClicked;
openUvLinkButton.clicked += OnOpenUvInstallClicked;
// Initial update
UpdateUI();
}
private void OnEnable()
{
if (_dependencyResult == null)
{
_dependencyResult = DependencyManager.CheckAllDependencies();
}
}
private void OnRefreshClicked()
{
_dependencyResult = DependencyManager.CheckAllDependencies();
UpdateUI();
}
private void OnDoneClicked()
{
Close();
}
private void OnOpenPythonInstallClicked()
{
var (pythonUrl, _) = DependencyManager.GetInstallationUrls();
Application.OpenURL(pythonUrl);
}
private void OnOpenUvInstallClicked()
{
var (_, uvUrl) = DependencyManager.GetInstallationUrls();
Application.OpenURL(uvUrl);
}
private void UpdateUI()
{
if (_dependencyResult == null)
return;
// Update Python status
var pythonDep = _dependencyResult.Dependencies.Find(d => d.Name == "Python");
if (pythonDep != null)
{
UpdateDependencyStatus(pythonIndicator, pythonVersion, pythonDetails, pythonDep);
}
// Update uv status
var uvDep = _dependencyResult.Dependencies.Find(d => d.Name == "uv Package Manager");
if (uvDep != null)
{
UpdateDependencyStatus(uvIndicator, uvVersion, uvDetails, uvDep);
}
// Update overall status
if (_dependencyResult.IsSystemReady)
{
statusMessage.text = "✓ All requirements met! MCP for Unity is ready to use.";
statusMessage.style.color = new StyleColor(Color.green);
installationSection.style.display = DisplayStyle.None;
}
else
{
statusMessage.text = "⚠ Missing dependencies. MCP for Unity requires all dependencies to function.";
statusMessage.style.color = new StyleColor(new Color(1f, 0.6f, 0f)); // Orange
installationSection.style.display = DisplayStyle.Flex;
installationInstructions.text = DependencyManager.GetInstallationRecommendations();
}
}
private void UpdateDependencyStatus(VisualElement indicator, Label versionLabel, Label detailsLabel, DependencyStatus dep)
{
if (dep.IsAvailable)
{
indicator.RemoveFromClassList("invalid");
indicator.AddToClassList("valid");
versionLabel.text = $"v{dep.Version}";
detailsLabel.text = dep.Details ?? "Available";
detailsLabel.style.color = new StyleColor(Color.gray);
}
else
{
indicator.RemoveFromClassList("valid");
indicator.AddToClassList("invalid");
versionLabel.text = "Not Found";
detailsLabel.text = dep.ErrorMessage ?? "Not available";
detailsLabel.style.color = new StyleColor(Color.red);
}
}
}
}