Forge
csharpdeeb25a2
1using CascadeIDE.Cockpit.DataBus;
2using CascadeIDE.Features.Build.Application;
3using CascadeIDE.Features.Workspace.Application;
4using CascadeIDE.Models;
5using CascadeIDE.Services;
6using CascadeIDE.ViewModels;
7using CommunityToolkit.Mvvm.Input;
8
9namespace CascadeIDE.Features.Build;
10
11/// <summary>Relay: сборка решения (композитор — <see cref="MainWindowViewModel"/>).</summary>
12public sealed partial class MainWindowBuildSessionViewModel : ViewModelBase
13{
14 private readonly MainWindowViewModel _host;
15
16 public MainWindowBuildSessionViewModel(MainWindowViewModel host) => _host = host;
17
18 [RelayCommand(CanExecute = nameof(CanBuildSolution))]
19 private async Task BuildSolutionAsync()
20 {
21 var prep = MainWindowBuildSolutionPrepProjection.TryCreatePrep(_host.Workspace.SolutionPath);
22 if (prep is null)
23 return;
24
25 await UiScheduler.Default.InvokeAsync(() =>
26 {
27 _host.Documents.SyncActiveEditorBufferFromHost();
28 _host.Documents.SaveDirtyOpenDocumentsToDisk();
29 }).ConfigureAwait(true);
30
31 _host.McpPublishToIdeDataBusAndRebuild(new BuildStateChanged(true));
32 _host.IsBuilding = true;
33 if (!_host.IsTerminalVisible)
34 _host.IsTerminalVisible = true;
35 _host.IsBuildOutputVisible = true;
36
37 _host.CurrentMfdShellPage = prep.TargetMfdPage;
38 _host.BuildOutputPanel.Set(prep.BuildOutputHeader);
39
40 void AppendBuildChunk(string chunk) => _host.BuildOutputPanel.Append(chunk);
41
42 var (lastExitCode, lastBuildSucceeded) =
43 await DotnetSolutionChunkedBuildOrchestrator.RunSolutionBuildStreamingAsync(
44 prep.SolutionPath,
45 _host.HostDotnetRunner,
46 AppendBuildChunk,
47 CancellationToken.None)
48 .ConfigureAwait(true);
49
50 _host.BuildOutputPanel.FlushPending();
51 _host.McpPublishToIdeDataBusAndRebuild(new BuildStateChanged(false, lastExitCode, lastBuildSucceeded));
52 _host.IsBuilding = false;
53 }
54
55 private bool CanBuildSolution() =>
56 MainWindowBuildSolutionPrepProjection.CanBuild(_host.Workspace.SolutionPath, _host.IsBuilding);
57
58 [RelayCommand]
59 private void HideBuildOutput() => _host.IsBuildOutputVisible = false;
60}
61
View only · write via MCP/CIDE