context menu v2

This commit is contained in:
Matt Parker
2025-08-03 02:10:28 +10:00
parent 7dc103d894
commit 6f39261cae

View File

@@ -13,29 +13,27 @@
transition-duration: 0.0s !important; transition-duration: 0.0s !important;
} }
</style> </style>
<MudMenu Style="flex-direction: column; width: 100%" ActivationEvent="@MouseEvent.RightClick" PositionAtCursor="true" Dense="true" Modal="false">
<ActivatorContent> <MudTreeView T="ISharpIdeNode" Dense="true" ExpandOnClick="true">
<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">
<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)
@foreach (var folder in SolutionModel.Folders) {
{ @GetSolutionFolderFragment(folder)
@GetSolutionFolderFragment(folder) }
} @foreach (var project in SolutionModel.Projects)
@foreach (var project in SolutionModel.Projects) {
{ @GetProjectFragment(project)
@GetProjectFragment(project) }
} </MudTreeViewItem>
</MudTreeViewItem> </MudTreeView>
</MudTreeView>
</ActivatorContent> <MudMenu PositionAtCursor @ref="_contextMenuRef" Dense="true" Modal="false">
<ChildContent> <MudMenuItem Icon="@Icons.Material.Filled.PlayArrow" IconColor="Color.Success" Label="Run" />
<MudMenuItem Icon="@Icons.Material.Filled.PlayArrow" IconColor="Color.Success" Label="Run" /> <MudMenuItem Label="Build" />
<MudMenuItem Label="Build" /> <MudMenuItem Label="Rebuild" />
<MudMenuItem Label="Rebuild" /> <MudMenuItem Label="Clean" />
<MudMenuItem Label="Clean" /> <MudMenuItem Label="Restore" />
<MudMenuItem Label="Restore" /> </MudMenu>
</ChildContent>
</MudMenu>
@code { @code {
[Parameter, EditorRequired] [Parameter, EditorRequired]
@@ -47,12 +45,19 @@
[Parameter] [Parameter]
public EventCallback<SharpIdeFile> SelectedFileChanged { get; set; } public EventCallback<SharpIdeFile> SelectedFileChanged { get; set; }
private MudMenu _contextMenuRef = null!;
private async Task InvokeSelectedFileChanged(SharpIdeFile file) private async Task InvokeSelectedFileChanged(SharpIdeFile file)
{ {
SelectedFile = file; SelectedFile = file;
await SelectedFileChanged.InvokeAsync(file); await SelectedFileChanged.InvokeAsync(file);
} }
private async Task OpenProjectContextMenu(MouseEventArgs args)
{
await _contextMenuRef.OpenMenuAsync(args);
}
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" @bind-Expanded="@slnFolder.Expanded"> <MudTreeViewItem T="ISharpIdeNode" TextTypo="Typo.body2" Icon="@Icons.Material.Filled.Folder" IconColor="Color.Primary" Value="@slnFolder" Text="@slnFolder.Name" @bind-Expanded="@slnFolder.Expanded">
@@ -76,20 +81,23 @@
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" @bind-Expanded="@project.Expanded"> <div @onclick="@OpenProjectContextMenu" @oncontextmenu="@OpenProjectContextMenu" @oncontextmenu:preventDefault @oncontextmenu:stopPropagation>
@if (project.Expanded) <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)
{ {
@foreach (var folder in project.Folders)
{
@GetFolderFragment(folder) @GetFolderFragment(folder)
}
@foreach (var file in project.Files)
{
@GetFileFragment(file)
}
} }
@foreach (var file in project.Files) </MudTreeViewItem>
{ </div>
@GetFileFragment(file) </text>;
}
}
</MudTreeViewItem>
</text>;
private RenderFragment GetFolderFragment(SharpIdeFolder folder) => private RenderFragment GetFolderFragment(SharpIdeFolder folder) =>
@<text> @<text>