Files
SharpIDE/src/SharpIDE.Photino/Components/SolutionExplorer.razor
2025-08-02 18:29:22 +10:00

105 lines
3.1 KiB
Plaintext

@using SharpIDE.Application.Features.SolutionDiscovery
@using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence
@if (SolutionModel is null)
{
return;
}
<style>
.mud-collapse-entering{
transition-duration: 0.0s !important;
}
.mud-collapse-exiting{
transition-duration: 0.0s !important;
}
</style>
<MudTreeView T="ISharpIdeNode" Dense="true" ExpandOnClick="true">
<MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Expanded="true" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Primary" Value="@SolutionModel" Text="@SolutionModel.Name">
@foreach (var folder in SolutionModel.Folders)
{
@GetSolutionFolderFragment(folder)
}
@foreach (var project in SolutionModel.Projects)
{
@GetProjectFragment(project)
}
</MudTreeViewItem>
</MudTreeView>
@code {
[Parameter, EditorRequired]
public SharpIdeSolutionModel SolutionModel { get; set; } = null!;
[Parameter, EditorRequired]
public SharpIdeFile SelectedFile { get; set; } = null!;
[Parameter]
public EventCallback<SharpIdeFile> SelectedFileChanged { get; set; }
private async Task InvokeSelectedFileChanged(SharpIdeFile file)
{
SelectedFile = file;
await SelectedFileChanged.InvokeAsync(file);
}
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">
@if (slnFolder.Expanded)
{
@foreach (var childFolder in slnFolder.Folders)
{
@GetSolutionFolderFragment(childFolder)
}
@foreach (var childProject in slnFolder.Projects)
{
@GetProjectFragment(childProject)
}
}
</MudTreeViewItem>
</text>;
private RenderFragment GetProjectFragment(SharpIdeProjectModel project) =>
@<text>
<MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Custom.FileFormats.FileCode" IconColor="Color.Success" Text="@project.Name" Value="project" @bind-Expanded="@project.Expanded">
@if (project.Expanded)
{
@foreach (var folder in project.Folders)
{
@GetFolderFragment(folder)
}
@foreach (var file in project.Files)
{
@GetFileFragment(file)
}
}
</MudTreeViewItem>
</text>;
private RenderFragment GetFolderFragment(SharpIdeFolder folder) =>
@<text>
<MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Default" @bind-Expanded="folder.Expanded" Text="@folder.Name" Value="@folder">
@if (folder.Expanded)
{
@foreach (var subFolder in folder.Folders)
{
@GetFolderFragment(subFolder)
}
@foreach (var file in folder.Files)
{
@GetFileFragment(file)
}
}
</MudTreeViewItem>
</text>;
private RenderFragment GetFileFragment(SharpIdeFile file) =>
@<text>
<MudTreeViewItem T="ISharpIdeNode" Icon="@Icons.Custom.FileFormats.FileCode" TextTypo="Typo.body2" Text="@file.Name" Value="@file" OnClick="@(async () => await InvokeSelectedFileChanged(file))"/>
</text>;
}