insta open and collapse explorer nodes

This commit is contained in:
Matt Parker
2025-08-01 18:51:17 +10:00
parent 856bcd40d0
commit abc4213500
3 changed files with 33 additions and 23 deletions

View File

@@ -1,12 +1,14 @@
namespace SharpIDE.Application.Features.SolutionDiscovery; using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
public class SharpIdeFile namespace SharpIDE.Application.Features.SolutionDiscovery;
public class SharpIdeFile : ISharpIdeNode
{ {
public required string Path { get; set; } public required string Path { get; set; }
public required string Name { get; set; } public required string Name { get; set; }
} }
public class SharpIdeFolder public class SharpIdeFolder : ISharpIdeNode
{ {
public required string Path { get; set; } public required string Path { get; set; }
public required string Name { get; set; } public required string Name { get; set; }

View File

@@ -1,19 +1,21 @@
namespace SharpIDE.Application.Features.SolutionDiscovery.VsPersistence; namespace SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
public class SharpIdeSolutionModel public interface ISharpIdeNode;
public class SharpIdeSolutionModel : ISharpIdeNode
{ {
public required string Name { get; set; } public required string Name { get; set; }
public required string FilePath { get; set; } public required string FilePath { get; set; }
public required List<SharpIdeProjectModel> Projects { get; set; } public required List<SharpIdeProjectModel> Projects { get; set; }
public required List<SharpIdeSolutionFolder> Folders { get; set; } public required List<SharpIdeSolutionFolder> Folders { get; set; }
} }
public class SharpIdeSolutionFolder 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 class SharpIdeProjectModel public class SharpIdeProjectModel : ISharpIdeNode
{ {
public required string Name { get; set; } public required string Name { get; set; }
public required string FilePath { get; set; } public required string FilePath { get; set; }

View File

@@ -5,18 +5,24 @@
{ {
return; return;
} }
<MudTreeView T="SharpIdeSolutionModel" Dense="true"> <style>
<MudTreeViewItem TextTypo="Typo.body2" Expanded="true" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Primary" Value="@SolutionModel" Text="@SolutionModel.Name"> .mud-collapse-entering{
<MudTreeView Dense="true"> transition-duration: 0.0s !important;
@foreach (var folder in SolutionModel.Folders) }
{ .mud-collapse-exiting{
@GetSolutionFolderFragment(folder) transition-duration: 0.0s !important;
} }
@foreach(var project in SolutionModel.Projects) </style>
{ <MudTreeView T="ISharpIdeNode" Dense="true" ExpandOnClick="true">
@GetProjectFragment(project) <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)
</MudTreeView> {
@GetSolutionFolderFragment(folder)
}
@foreach(var project in SolutionModel.Projects)
{
@GetProjectFragment(project)
}
</MudTreeViewItem> </MudTreeViewItem>
</MudTreeView> </MudTreeView>
@@ -42,7 +48,7 @@
private RenderFragment GetSolutionFolderFragment(SharpIdeSolutionFolder slnFolder) => private RenderFragment GetSolutionFolderFragment(SharpIdeSolutionFolder slnFolder) =>
@<text> @<text>
<MudTreeViewItem 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">
@foreach(var childFolder in slnFolder.Folders) @foreach(var childFolder in slnFolder.Folders)
{ {
@GetSolutionFolderFragment(childFolder) @GetSolutionFolderFragment(childFolder)
@@ -56,10 +62,10 @@
private RenderFragment GetProjectFragment(SharpIdeProjectModel project) => private RenderFragment GetProjectFragment(SharpIdeProjectModel project) =>
@<text> @<text>
<MudTreeViewItem 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">
@foreach (var folder in project.Folders) @foreach (var folder in project.Folders)
{ {
<MudTreeViewItem TextTypo="Typo.body2" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Default" @bind-Expanded="folder.Expanded" Text="@folder.Name" Value="@folder"> <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) @GetFolderFragment(folder)
</MudTreeViewItem> </MudTreeViewItem>
} }
@@ -74,7 +80,7 @@
@<text> @<text>
@foreach (var subFolder in folder.Folders) @foreach (var subFolder in folder.Folders)
{ {
<MudTreeViewItem TextTypo="Typo.body2" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Default" @bind-Expanded="subFolder.Expanded" Text="@subFolder.Name" Value="@subFolder"> <MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Default" @bind-Expanded="subFolder.Expanded" Text="@subFolder.Name" Value="@subFolder">
@if (subFolder.Expanded) @if (subFolder.Expanded)
{ {
@GetFolderFragment(subFolder) @GetFolderFragment(subFolder)
@@ -89,7 +95,7 @@
private RenderFragment GetFileFragment(SharpIdeFile file) => private RenderFragment GetFileFragment(SharpIdeFile file) =>
@<text> @<text>
<MudTreeViewItem T="SharpIdeFile" Icon="@Icons.Custom.FileFormats.FileCode" TextTypo="Typo.body2" Text="@file.Name" Value="@file" OnClick="@(async () => await InvokeSelectedFileChanged(file))"/> <MudTreeViewItem T="ISharpIdeNode" Icon="@Icons.Custom.FileFormats.FileCode" TextTypo="Typo.body2" Text="@file.Name" Value="@file" OnClick="@(async () => await InvokeSelectedFileChanged(file))"/>
</text>; </text>;