Files
SharpIDE/src/SharpIDE.Godot/IdeWindow.cs
2025-09-30 18:21:15 +10:00

63 lines
2.0 KiB
C#

using Ardalis.GuardClauses;
using Godot;
using Microsoft.Build.Locator;
using Microsoft.Extensions.Hosting;
using SharpIDE.Godot.Features.SlnPicker;
namespace SharpIDE.Godot;
/// <summary>
/// Used to hold either the main IDE scene or the solution picker scene
/// </summary>
public partial class IdeWindow : Control
{
private readonly PackedScene _solutionPickerScene = ResourceLoader.Load<PackedScene>("res://Features/SlnPicker/SlnPicker.tscn");
private readonly PackedScene _ideRootScene = ResourceLoader.Load<PackedScene>("res://IdeRoot.tscn");
private IdeRoot? _ideRoot;
private SlnPicker? _slnPicker;
public override void _Ready()
{
MSBuildLocator.RegisterDefaults();
GodotServiceDefaults.AddServiceDefaults();
PickSolution();
}
public void PickSolution()
{
if (_slnPicker is not null) throw new InvalidOperationException("Solution picker is already active");
_slnPicker = _solutionPickerScene.Instantiate<SlnPicker>();
AddChild(_slnPicker);
_ = Task.GodotRun(async () =>
{
var slnPathTask = _slnPicker.GetSelectedSolutionPath();
var ideRoot = _ideRootScene.Instantiate<IdeRoot>();
ideRoot.IdeWindow = this;
var slnPath = await slnPathTask;
if (slnPath is null)
{
ideRoot.QueueFree();
_slnPicker.QueueFree();
_slnPicker = null;
return;
}
ideRoot.SetSlnFilePath(slnPath);
await this.InvokeAsync(() =>
{
RemoveChild(_slnPicker);
_slnPicker.QueueFree();
_slnPicker = null;
if (_ideRoot is not null)
{
RemoveChild(_ideRoot);
_ideRoot.QueueFree();
}
_ideRoot = ideRoot;
AddChild(ideRoot);
});
});
}
}