run project from context menu

This commit is contained in:
Matt Parker
2025-08-03 02:31:16 +10:00
parent fceafbd194
commit fa78ce4c8c
3 changed files with 62 additions and 3 deletions

View File

@@ -0,0 +1,45 @@
using System.Diagnostics;
using Ardalis.GuardClauses;
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
namespace SharpIDE.Application.Features.Run;
public class RunService
{
// TODO: optimise this Copilot junk
public async Task RunProject(SharpIdeProjectModel project)
{
Guard.Against.Null(project, nameof(project));
Guard.Against.NullOrWhiteSpace(project.FilePath, nameof(project.FilePath), "Project file path cannot be null or empty.");
var processStartInfo = new ProcessStartInfo
{
FileName = "dotnet",
Arguments = $"run --project \"{project.FilePath}\"",
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardOutput = true,
RedirectStandardError = true
};
using var process = new Process();
process.StartInfo = processStartInfo;
process.OutputDataReceived += (sender, e) => Console.WriteLine(e.Data);
process.ErrorDataReceived += (sender, e) => Console.Error.WriteLine(e.Data);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
await process.WaitForExitAsync();
if (process.ExitCode != 0)
{
throw new InvalidOperationException($"Project run failed with exit code {process.ExitCode}.");
}
Console.WriteLine("Project ran successfully.");
}
}

View File

@@ -1,6 +1,10 @@
@using SharpIDE.Application.Features.SolutionDiscovery
@using Ardalis.GuardClauses
@using SharpIDE.Application.Features.Run
@using SharpIDE.Application.Features.SolutionDiscovery
@using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence
@inject RunService RunService
@if (SolutionModel is null)
{
return;
@@ -28,7 +32,7 @@
</MudTreeView>
<MudMenu PositionAtCursor @ref="_contextMenuRef" Dense="true" Modal="false">
<MudMenuItem Icon="@Icons.Material.Filled.PlayArrow" IconColor="Color.Success" Label="Run" />
<MudMenuItem Icon="@Icons.Material.Filled.PlayArrow" IconColor="Color.Success" Label="Run" OnClick="@RunProject" />
<MudMenuItem Label="Build" />
<MudMenuItem Label="Rebuild" />
<MudMenuItem Label="Clean" />
@@ -46,6 +50,7 @@
public EventCallback<SharpIdeFile> SelectedFileChanged { get; set; }
private MudMenu _contextMenuRef = null!;
private SharpIdeProjectModel? _contextMenuProject;
private async Task InvokeSelectedFileChanged(SharpIdeFile file)
{
@@ -55,10 +60,17 @@
private async Task OpenProjectContextMenu(MouseEventArgs args, SharpIdeProjectModel project)
{
Console.WriteLine($"Opening context menu for project: {project.Name}");
_contextMenuProject = null;
_contextMenuProject = project;
await _contextMenuRef.OpenMenuAsync(args);
}
private async Task RunProject()
{
Guard.Against.Null(_contextMenuProject, nameof(_contextMenuProject));
await RunService.RunProject(_contextMenuProject);
}
private RenderFragment GetSolutionFolderFragment(SharpIdeSolutionFolder slnFolder) =>
@<text>
<MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Primary" Value="@slnFolder" Text="@slnFolder.Name" @bind-Expanded="@slnFolder.Expanded">

View File

@@ -4,6 +4,7 @@ using Microsoft.Extensions.DependencyInjection;
using MudBlazor.Services;
using Photino.Blazor;
using SharpIDE.Application.Features.Build;
using SharpIDE.Application.Features.Run;
using SharpIDE.Photino.Models;
using SharpIDE.Photino.Services;
@@ -21,6 +22,7 @@ public class Program
appBuilder.Services.AddSingleton<RefreshOpenFileService>();
appBuilder.Services.AddSingleton<AppState>();
appBuilder.Services.AddSingleton<BuildService>();
appBuilder.Services.AddSingleton<RunService>();
appBuilder.RootComponents.Add<App>("app");