lazy load nodes in explorer

This commit is contained in:
Matt Parker
2025-08-02 18:26:00 +10:00
parent 30bc449c5f
commit ebd3376836
2 changed files with 25 additions and 17 deletions

View File

@@ -14,6 +14,7 @@ public class SharpIdeSolutionFolder : ISharpIdeNode
public required string Name { get; set; } public required string Name { get; set; }
public required List<SharpIdeSolutionFolder> Folders { get; set; } public required List<SharpIdeSolutionFolder> Folders { get; set; }
public required List<SharpIdeProjectModel> Projects { get; set; } public required List<SharpIdeProjectModel> Projects { get; set; }
public bool Expanded { get; set; }
} }
public class SharpIdeProjectModel : ISharpIdeNode public class SharpIdeProjectModel : ISharpIdeNode
{ {
@@ -21,4 +22,5 @@ public class SharpIdeProjectModel : ISharpIdeNode
public required string FilePath { get; set; } public required string FilePath { get; set; }
public required List<SharpIdeFolder> Folders { get; set; } public required List<SharpIdeFolder> Folders { get; set; }
public required List<SharpIdeFile> Files { get; set; } public required List<SharpIdeFile> Files { get; set; }
public bool Expanded { get; set; }
} }

View File

@@ -19,7 +19,7 @@
{ {
@GetSolutionFolderFragment(folder) @GetSolutionFolderFragment(folder)
} }
@foreach(var project in SolutionModel.Projects) @foreach (var project in SolutionModel.Projects)
{ {
@GetProjectFragment(project) @GetProjectFragment(project)
} }
@@ -45,30 +45,36 @@
private RenderFragment GetSolutionFolderFragment(SharpIdeSolutionFolder slnFolder) => private RenderFragment GetSolutionFolderFragment(SharpIdeSolutionFolder slnFolder) =>
@<text> @<text>
<MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Primary" Value="@slnFolder" Text="@slnFolder.Name"> <MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Primary" Value="@slnFolder" Text="@slnFolder.Name" @bind-Expanded="@slnFolder.Expanded">
@foreach(var childFolder in slnFolder.Folders) @if (slnFolder.Expanded)
{ {
@GetSolutionFolderFragment(childFolder) @foreach (var childFolder in slnFolder.Folders)
} {
@foreach(var childProject in slnFolder.Projects) @GetSolutionFolderFragment(childFolder)
{ }
@GetProjectFragment(childProject) @foreach (var childProject in slnFolder.Projects)
{
@GetProjectFragment(childProject)
}
} }
</MudTreeViewItem> </MudTreeViewItem>
</text>; </text>;
private RenderFragment GetProjectFragment(SharpIdeProjectModel project) => private RenderFragment GetProjectFragment(SharpIdeProjectModel project) =>
@<text> @<text>
<MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Custom.FileFormats.FileCode" IconColor="Color.Success" Text="@project.Name" Value="project"> <MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Custom.FileFormats.FileCode" IconColor="Color.Success" Text="@project.Name" Value="project" @bind-Expanded="@project.Expanded">
@foreach (var folder in project.Folders) @if (project.Expanded)
{ {
<MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Default" @bind-Expanded="folder.Expanded" Text="@folder.Name" Value="@folder"> @foreach (var folder in project.Folders)
@GetFolderFragment(folder) {
</MudTreeViewItem> <MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Default" @bind-Expanded="folder.Expanded" Text="@folder.Name" Value="@folder">
} @GetFolderFragment(folder)
@foreach(var file in project.Files) </MudTreeViewItem>
{ }
@GetFileFragment(file) @foreach (var file in project.Files)
{
@GetFileFragment(file)
}
} }
</MudTreeViewItem> </MudTreeViewItem>
</text>; </text>;