From 2ad7be1073416a97d88eeac39d935caaecb6502d Mon Sep 17 00:00:00 2001 From: ahjephson <16685186+ahjephson@users.noreply.github.com> Date: Mon, 20 Oct 2025 13:30:40 +0100 Subject: [PATCH] Remove custom ContextMenu and replace with MudMenu --- Lantean.QBTMud/Components/FilesTab.razor | 4 +- Lantean.QBTMud/Components/FilesTab.razor.cs | 2 +- Lantean.QBTMud/Components/FiltersNav.razor | 16 +- Lantean.QBTMud/Components/FiltersNav.razor.cs | 8 +- Lantean.QBTMud/Components/PeersTab.razor | 4 +- Lantean.QBTMud/Components/PeersTab.razor.cs | 4 +- Lantean.QBTMud/Components/TrackersTab.razor | 4 +- .../Components/TrackersTab.razor.cs | 4 +- .../Components/UI/ContextMenu.razor | 26 -- .../Components/UI/ContextMenu.razor.cs | 290 ------------------ Lantean.QBTMud/Lantean.QBTMud.csproj | 8 +- Lantean.QBTMud/Pages/TorrentList.razor | 4 +- Lantean.QBTMud/Pages/TorrentList.razor.cs | 4 +- 13 files changed, 31 insertions(+), 347 deletions(-) delete mode 100644 Lantean.QBTMud/Components/UI/ContextMenu.razor delete mode 100644 Lantean.QBTMud/Components/UI/ContextMenu.razor.cs diff --git a/Lantean.QBTMud/Components/FilesTab.razor b/Lantean.QBTMud/Components/FilesTab.razor index d466cf2..e29fc65 100644 --- a/Lantean.QBTMud/Components/FilesTab.razor +++ b/Lantean.QBTMud/Components/FilesTab.razor @@ -1,6 +1,6 @@ - + Rename - +
diff --git a/Lantean.QBTMud/Components/FilesTab.razor.cs b/Lantean.QBTMud/Components/FilesTab.razor.cs index f1702d1..c1c7347 100644 --- a/Lantean.QBTMud/Components/FilesTab.razor.cs +++ b/Lantean.QBTMud/Components/FilesTab.razor.cs @@ -69,7 +69,7 @@ namespace Lantean.QBTMud.Components private DynamicTable? Table { get; set; } - private ContextMenu? ContextMenu { get; set; } + private MudMenu? ContextMenu { get; set; } public FilesTab() { diff --git a/Lantean.QBTMud/Components/FiltersNav.razor b/Lantean.QBTMud/Components/FiltersNav.razor index 089bf24..9b26cbe 100644 --- a/Lantean.QBTMud/Components/FiltersNav.razor +++ b/Lantean.QBTMud/Components/FiltersNav.razor @@ -1,8 +1,8 @@ - + @TorrentControls(_statusType) - + - + Add category @if (IsCategoryTarget) { @@ -12,9 +12,9 @@ Remove unused categories @TorrentControls(_categoryType) - + - + Add tag @if (IsTagTarget) { @@ -23,13 +23,13 @@ Remove unused tags @TorrentControls(_tagType) - + - + Remove tracker @TorrentControls(_trackerType) - + diff --git a/Lantean.QBTMud/Components/FiltersNav.razor.cs b/Lantean.QBTMud/Components/FiltersNav.razor.cs index 090edc4..2637c14 100644 --- a/Lantean.QBTMud/Components/FiltersNav.razor.cs +++ b/Lantean.QBTMud/Components/FiltersNav.razor.cs @@ -69,13 +69,13 @@ namespace Lantean.QBTMud.Components protected Dictionary Statuses => GetStatuses(); - protected ContextMenu? StatusContextMenu { get; set; } + protected MudMenu? StatusContextMenu { get; set; } - protected ContextMenu? CategoryContextMenu { get; set; } + protected MudMenu? CategoryContextMenu { get; set; } - protected ContextMenu? TagContextMenu { get; set; } + protected MudMenu? TagContextMenu { get; set; } - protected ContextMenu? TrackerContextMenu { get; set; } + protected MudMenu? TrackerContextMenu { get; set; } protected string? ContextMenuStatus { get; set; } diff --git a/Lantean.QBTMud/Components/PeersTab.razor b/Lantean.QBTMud/Components/PeersTab.razor index 9c93b51..faa0949 100644 --- a/Lantean.QBTMud/Components/PeersTab.razor +++ b/Lantean.QBTMud/Components/PeersTab.razor @@ -1,10 +1,10 @@ - + Add peer @if (ContextMenuItem is not null) { Ban peer } - + Add peer diff --git a/Lantean.QBTMud/Components/PeersTab.razor.cs b/Lantean.QBTMud/Components/PeersTab.razor.cs index e6c7e01..e8d6733 100644 --- a/Lantean.QBTMud/Components/PeersTab.razor.cs +++ b/Lantean.QBTMud/Components/PeersTab.razor.cs @@ -52,7 +52,7 @@ namespace Lantean.QBTMud.Components protected Peer? SelectedItem { get; set; } - protected ContextMenu? ContextMenu { get; set; } + protected MudMenu? ContextMenu { get; set; } protected DynamicTable? Table { get; set; } @@ -153,7 +153,7 @@ namespace Lantean.QBTMud.Components return; } - await ContextMenu.ToggleMenuAsync(eventArgs); + await ContextMenu.OpenMenuAsync(eventArgs); } protected void SelectedItemChanged(Peer peer) diff --git a/Lantean.QBTMud/Components/TrackersTab.razor b/Lantean.QBTMud/Components/TrackersTab.razor index bd74c77..26c23f5 100644 --- a/Lantean.QBTMud/Components/TrackersTab.razor +++ b/Lantean.QBTMud/Components/TrackersTab.razor @@ -1,4 +1,4 @@ - + Add trackers @if (ContextMenuItem is not null) { @@ -6,7 +6,7 @@ Remove tracker Copy tracker url } - + Add trackers diff --git a/Lantean.QBTMud/Components/TrackersTab.razor.cs b/Lantean.QBTMud/Components/TrackersTab.razor.cs index 599ca10..c9bf214 100644 --- a/Lantean.QBTMud/Components/TrackersTab.razor.cs +++ b/Lantean.QBTMud/Components/TrackersTab.razor.cs @@ -52,7 +52,7 @@ namespace Lantean.QBTMud.Components protected TorrentTracker? SelectedItem { get; set; } - protected ContextMenu? ContextMenu { get; set; } + protected MudMenu? ContextMenu { get; set; } protected DynamicTable? Table { get; set; } @@ -148,7 +148,7 @@ namespace Lantean.QBTMud.Components return; } - await ContextMenu.ToggleMenuAsync(eventArgs); + await ContextMenu.OpenMenuAsync(eventArgs); } protected void SelectedItemChanged(TorrentTracker torrentTracker) diff --git a/Lantean.QBTMud/Components/UI/ContextMenu.razor b/Lantean.QBTMud/Components/UI/ContextMenu.razor deleted file mode 100644 index b278fbd..0000000 --- a/Lantean.QBTMud/Components/UI/ContextMenu.razor +++ /dev/null @@ -1,26 +0,0 @@ -@inherits MudComponentBase - - - -@* The portal has to include the cascading values inside, because it's not able to teletransport the cascade *@ - - - @if (_showChildren) - { - - @ChildContent - - } - - - - \ No newline at end of file diff --git a/Lantean.QBTMud/Components/UI/ContextMenu.razor.cs b/Lantean.QBTMud/Components/UI/ContextMenu.razor.cs deleted file mode 100644 index 2d4f592..0000000 --- a/Lantean.QBTMud/Components/UI/ContextMenu.razor.cs +++ /dev/null @@ -1,290 +0,0 @@ -using Lantean.QBTMud.Interop; -using Microsoft.AspNetCore.Components; -using Microsoft.AspNetCore.Components.Web; -using Microsoft.JSInterop; -using MudBlazor; -using MudBlazor.Utilities; - -namespace Lantean.QBTMud.Components.UI -{ - public partial class ContextMenu : MudComponentBase - { - private bool _open; - private bool _showChildren; - private string? _popoverStyle; - private string? _id; - - private double _x; - private double _y; - private bool _isResized = false; - - private const double _diff = 64; - - private string Id - { - get - { - _id ??= Guid.NewGuid().ToString(); - - return _id; - } - } - - [Inject] - public IJSRuntime JSRuntime { get; set; } = default!; - - [Inject] - public IPopoverService PopoverService { get; set; } = default!; - - /// - /// If true, compact vertical padding will be applied to all menu items. - /// - [Parameter] - [Category(CategoryTypes.Menu.PopupAppearance)] - public bool Dense { get; set; } - - /// - /// Set to true if you want to prevent page from scrolling when the menu is open - /// - [Parameter] - [Category(CategoryTypes.Menu.PopupAppearance)] - public bool LockScroll { get; set; } - - /// - /// If true, the list menu will be same width as the parent. - /// - [Parameter] - [Category(CategoryTypes.Menu.PopupAppearance)] - public DropdownWidth RelativeWidth { get; set; } - - /// - /// Sets the max height the menu can have when open. - /// - [Parameter] - [Category(CategoryTypes.Menu.PopupAppearance)] - public int? MaxHeight { get; set; } - - /// - /// Set the anchor origin point to determine where the popover will open from. - /// - [Parameter] - [Category(CategoryTypes.Menu.PopupAppearance)] - public Origin AnchorOrigin { get; set; } = Origin.TopLeft; - - /// - /// Sets the transform origin point for the popover. - /// - [Parameter] - [Category(CategoryTypes.Menu.PopupAppearance)] - public Origin TransformOrigin { get; set; } = Origin.TopLeft; - - /// - /// If true, menu will be disabled. - /// - [Parameter] - [Category(CategoryTypes.Menu.Behavior)] - public bool Disabled { get; set; } - - /// - /// Gets or sets whether to show a ripple effect when the user clicks the button. Default is true. - /// - [Parameter] - [Category(CategoryTypes.Menu.Appearance)] - public bool Ripple { get; set; } = true; - - /// - /// Determines whether the component has a drop-shadow. Default is true - /// - [Parameter] - [Category(CategoryTypes.Menu.Appearance)] - public bool DropShadow { get; set; } = true; - - /// - /// Add menu items here - /// - [Parameter] - [Category(CategoryTypes.Menu.PopupBehavior)] - public RenderFragment? ChildContent { get; set; } - - /// - /// Fired when the menu property changes. - /// - [Parameter] - [Category(CategoryTypes.Menu.PopupBehavior)] - public EventCallback OpenChanged { get; set; } - - [Parameter] - public int AdjustmentX { get; set; } - - [Parameter] - public int AdjustmentY { get; set; } - - protected MudMenu? FakeMenu { get; set; } - - protected void FakeOpenChanged(bool value) - { - if (!value) - { - _open = false; - } - - StateHasChanged(); - } - - /// - /// Opens the menu. - /// - /// - /// The arguments of the calling mouse/pointer event. - /// - public async Task OpenMenuAsync(EventArgs args) - { - if (Disabled) - { - return; - } - - // long press on iOS triggers selection, so clear it - await JSRuntime.ClearSelection(); - - if (args is not LongPressEventArgs) - { - _showChildren = true; - } - - _open = true; - _isResized = false; - StateHasChanged(); - - var (x, y) = GetPositionFromArgs(args); - _x = x; - _y = y; - - SetPopoverStyle(x, y); - - StateHasChanged(); - - await OpenChanged.InvokeAsync(_open); - - // long press on iOS triggers selection, so clear it - await JSRuntime.ClearSelection(); - - if (args is LongPressEventArgs) - { - await Task.Delay(1000); - _showChildren = true; - } - } - - /// - /// Closes the menu. - /// - public Task CloseMenuAsync() - { - _open = false; - _popoverStyle = null; - StateHasChanged(); - - return OpenChanged.InvokeAsync(_open); - } - - private void SetPopoverStyle(double x, double y) - { - _popoverStyle = $"margin-top: {y.ToPx()}; margin-left: {x.ToPx()};"; - } - - /// - /// Toggle the visibility of the menu. - /// - public async Task ToggleMenuAsync(EventArgs args) - { - if (Disabled) - { - return; - } - - if (_open) - { - await CloseMenuAsync(); - } - else - { - await OpenMenuAsync(args); - } - } - - protected override Task OnAfterRenderAsync(bool firstRender) - { - if (!_isResized) - { - //await DeterminePosition(); - } - - return Task.CompletedTask; - } - - //private async Task DeterminePosition() - //{ - // var mainContentSize = await JSRuntime.GetInnerDimensions(".mud-main-content"); - // double? contextMenuHeight = null; - // double? contextMenuWidth = null; - - // var popoverHolder = PopoverService.ActivePopovers.FirstOrDefault(p => p.UserAttributes.ContainsKey("tracker") && (string?)p.UserAttributes["tracker"] == Id); - - // var popoverSize = await JSRuntime.GetBoundingClientRect($"#popovercontent-{popoverHolder?.Id}"); - // if (popoverSize.Height > 0) - // { - // contextMenuHeight = popoverSize.Height; - // contextMenuWidth = popoverSize.Width; - // } - // else - // { - // return; - // } - - // // the bottom position of the popover will be rendered off screen - // if (_y - _diff + contextMenuHeight.Value >= mainContentSize.Height) - // { - // // adjust the top of the context menu - // var overshoot = Math.Abs(mainContentSize.Height - (_y - _diff + contextMenuHeight.Value)); - // _y -= overshoot; - - // if (_y - _diff + contextMenuHeight >= mainContentSize.Height) - // { - // MaxHeight = (int)(mainContentSize.Height - _y + _diff); - // } - // } - - // if (_x + contextMenuWidth.Value > mainContentSize.Width) - // { - // var overshoot = Math.Abs(mainContentSize.Width - (_x + contextMenuWidth.Value)); - // _x -= overshoot; - // } - - // SetPopoverStyle(_x, _y); - // _isResized = true; - // await InvokeAsync(StateHasChanged); - //} - - private (double x, double y) GetPositionFromArgs(EventArgs eventArgs) - { - double x, y; - if (eventArgs is MouseEventArgs mouseEventArgs) - { - x = mouseEventArgs.ClientX; - y = mouseEventArgs.ClientY; - } - else if (eventArgs is LongPressEventArgs longPressEventArgs) - { - x = longPressEventArgs.ClientX; - y = longPressEventArgs.ClientY; - } - else - { - throw new NotSupportedException("Invalid eventArgs type."); - } - - return (x + AdjustmentX, y + AdjustmentY); - } - } -} \ No newline at end of file diff --git a/Lantean.QBTMud/Lantean.QBTMud.csproj b/Lantean.QBTMud/Lantean.QBTMud.csproj index 4ea246c..070108c 100644 --- a/Lantean.QBTMud/Lantean.QBTMud.csproj +++ b/Lantean.QBTMud/Lantean.QBTMud.csproj @@ -12,10 +12,10 @@ - - - - + + + + diff --git a/Lantean.QBTMud/Pages/TorrentList.razor b/Lantean.QBTMud/Pages/TorrentList.razor index 5913f47..47a2f43 100644 --- a/Lantean.QBTMud/Pages/TorrentList.razor +++ b/Lantean.QBTMud/Pages/TorrentList.razor @@ -1,11 +1,11 @@ @page "/" @layout ListLayout - + View torrent details - +
diff --git a/Lantean.QBTMud/Pages/TorrentList.razor.cs b/Lantean.QBTMud/Pages/TorrentList.razor.cs index 56b998c..5496fe9 100644 --- a/Lantean.QBTMud/Pages/TorrentList.razor.cs +++ b/Lantean.QBTMud/Pages/TorrentList.razor.cs @@ -68,7 +68,7 @@ namespace Lantean.QBTMud.Pages protected Torrent? ContextMenuItem { get; set; } - protected ContextMenu? ContextMenu { get; set; } + protected MudMenu? ContextMenu { get; set; } private object? _lastRenderedTorrents; private QBitTorrentClient.Models.Preferences? _lastPreferences; @@ -272,7 +272,7 @@ namespace Lantean.QBTMud.Pages return; } - await ContextMenu.ToggleMenuAsync(eventArgs); + await ContextMenu.OpenMenuAsync(eventArgs); } protected IEnumerable> Columns => ColumnsDefinitions.Where(c => c.Id != "#" || Preferences?.QueueingEnabled == true);