Files
SharpIDE/src/SharpIDE.Photino/Layout/MainLayout.razor
Matt Parker 450b834547 refactor
2025-08-02 17:41:57 +10:00

107 lines
4.4 KiB
Plaintext

@using SharpIDE.Application.Features.Build
@using SharpIDE.Application.Features.SolutionDiscovery
@using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence
@using SharpIDE.Photino.Models
@inherits LayoutComponentBase
@inject IDialogService DialogService
@inject BuildService BuildService
@inject AppState AppState
<MudLayout>
<MudAppBar Dense="true">
<MudIconButton Icon="@Icons.Material.Filled.Menu" Color="Color.Inherit" Edge="Edge.Start" OnClick="@((e) => DrawerToggle())" />
<MudButtonGroup OverrideStyles="false">
<MudButton Variant="Variant.Filled" Size="Size.Small" Color="Color.Primary" OnClick="@BuildSolution">Build</MudButton>
<MudButton Variant="Variant.Outlined" Size="Size.Small" Color="Color.Primary" OnClick="@RebuildSolution">Rebuild</MudButton>
<MudButton Variant="Variant.Outlined" Size="Size.Small" Color="Color.Primary" OnClick="@CleanSolution">Clean</MudButton>
<MudButton Variant="Variant.Outlined" Size="Size.Small" Color="Color.Primary" OnClick="@RestoreSolution">Restore</MudButton>
</MudButtonGroup>
<MudSpacer />
<MudStack Row="true" AlignItems="AlignItems.Center">
<MudButton OnClick="@TerminalDrawerToggle">
<MudIcon Icon="@Icons.Material.Filled.Terminal" Size="Size.Medium" Color="Color.Default" />
</MudButton>
<MudButton>
<MudIcon Icon="@Icons.Material.Filled.PlayArrow" Size="Size.Medium" Color="Color.Success" />
</MudButton>
<MudButton OnClick="@OpenSettingsDialog">
<MudIcon Icon="@Icons.Material.Filled.Settings" Size="Size.Medium" Color="Color.Default" />
</MudButton>
</MudStack>
</MudAppBar>
<MudDrawer @bind-Open="@_drawerOpen" Width="400px" ClipMode="DrawerClipMode.Always">
@if (_solutionFilePath is not null)
{
<SolutionExplorer @bind-SelectedFile="@_selectedFile" SolutionModel="@_solutionModel"/>
}
@* <NavMenu/> *@
</MudDrawer>
<MudMainContent>
<MudContainer MaxWidth="MaxWidth.False" Class="mt-2">
@* @Body *@
@if (_solutionFilePath is not null)
{
<CodeViewer SelectedFile="@_selectedFile" />
}
</MudContainer>
</MudMainContent>
<MudDrawer @bind-Open="@_terminalDrawerOpen" Elevation="2" Variant="DrawerVariant.Temporary" Overlay="false" Anchor="Anchor.Bottom">
@if (_solutionFilePath is not null)
{
<MudText>Terminal</MudText>
<TerminalOutputDisplay/>
}
</MudDrawer>
</MudLayout>
@code {
private bool _drawerOpen = true;
private bool _terminalDrawerOpen = false;
private void DrawerToggle() => _drawerOpen = !_drawerOpen;
private void TerminalDrawerToggle() => _terminalDrawerOpen = !_terminalDrawerOpen;
private string? _solutionFilePath;
private SharpIdeSolutionModel? _solutionModel;
private SharpIdeFile? _selectedFile;
protected override async Task OnInitializedAsync()
{
var dialogRef = await DialogService.ShowAsync<SolutionPickerDialog>("Open Solution", new DialogOptions { FullWidth = true, MaxWidth = MaxWidth.Medium, BackdropClick = false });
var result = await dialogRef.Result;
if (result is null) throw new InvalidOperationException("Dialog result is null");
if (result.Canceled) throw new OperationCanceledException("Dialog was canceled");
var solutionFilePath = (string)result.Data!;
_solutionFilePath = solutionFilePath;
//await BuildService.BuildSolutionAsync(_solutionFilePath);
var solutionModel = await VsPersistenceMapper.GetSolutionModel(_solutionFilePath);
_solutionModel = solutionModel;
if (AppState.IdeSettings.AutoOpenTerminalOnLaunch)
{
_ = Task.Run(async () =>
{
// The mud drawer is a pain, has an initial state, and won't open if you try to open it before it has rendered (presumably using js)
await Task.Delay(125).ConfigureAwait(false);
_terminalDrawerOpen = true;
await InvokeAsync(StateHasChanged).ConfigureAwait(false);
}).ConfigureAwait(false);
}
}
private async Task BuildSolution() => await MsBuildSolution(BuildType.Build);
private async Task RebuildSolution() => await MsBuildSolution(BuildType.Rebuild);
private async Task CleanSolution() => await MsBuildSolution(BuildType.Clean);
private async Task RestoreSolution() => await MsBuildSolution(BuildType.Restore);
private async Task MsBuildSolution(BuildType buildType)
{
await BuildService.MsBuildSolutionAsync(_solutionFilePath!, buildType);
}
private async Task OpenSettingsDialog()
{
var dialogRef = await DialogService.ShowAsync<IdeSettingsDialog>("SharpIDE Settings", new DialogOptions { MaxWidth = MaxWidth.Medium, CloseButton = true });
}
}