Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,9 @@ or nameof(PackagesPageViewModel.SortAscending))
// Double-click a list row → show details
PackageList.DoubleTapped += (_, _) => _ = ShowDetailsForPackage(SelectedItem);

// Keyboard shortcuts on the package list
PackageList.KeyDown += PackageList_KeyDown;
// Keyboard shortcuts on the package list. Handled on the tunnel route (and even when
// already handled) because the DataGrid swallows Enter on the bubble route otherwise.
PackageList.AddHandler(KeyDownEvent, PackageList_KeyDown, RoutingStrategies.Tunnel, handledEventsToo: true);

// Type-to-search: printable characters typed while the list is focused
// redirect focus + the typed character to the global search box.
Expand Down Expand Up @@ -289,6 +290,34 @@ private void MegaQueryBlock_KeyDown(object? sender, KeyEventArgs e)
ViewModel.SubmitSearch();
}

// Accelerator hints shown in package context menus; handling lives in PackageList_KeyDown below.
// Rendered manually (not via MenuItem.InputGesture) because Avalonia's Key enum aliases
// Enter→Return and would display "Return" instead of WinUI's "Enter".
protected const string MainActionShortcut = "Ctrl+Enter";
protected const string OptionsShortcut = "Alt+Enter";
protected const string DetailsShortcut = "Enter";

/// <summary>Builds a menu header with the label on the left and a dimmed, right-aligned shortcut hint.</summary>
protected static Control ShortcutHeader(string label, string shortcut)
{
var grid = new Grid
{
ColumnDefinitions = new ColumnDefinitions("*,Auto"),
HorizontalAlignment = HorizontalAlignment.Stretch,
};
grid.Children.Add(new TextBlock { Text = label, VerticalAlignment = VerticalAlignment.Center });
var hint = new TextBlock
{
Text = shortcut,
Opacity = 0.6,
Margin = new Thickness(24, 0, 0, 0),
VerticalAlignment = VerticalAlignment.Center,
};
Grid.SetColumn(hint, 1);
grid.Children.Add(hint);
return grid;
}

private void PackageList_KeyDown(object? sender, KeyEventArgs e)
{
var pkg = SelectedItem;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,13 +113,13 @@ protected override void GenerateToolBar(PackagesPageViewModel vm)
_menuDownloadInstaller.Click += (_, _) => _ = AvaloniaPackageOperationHelper.AskLocationAndDownloadAsync(
SelectedItem, TEL_InstallReferral.DIRECT_SEARCH);

var menuInstall = new MenuItem { Header = CoreTools.Translate("Install"), Icon = LoadMenuIcon("download") };
var menuInstall = new MenuItem { Header = ShortcutHeader(CoreTools.Translate("Install"), MainActionShortcut), Icon = LoadMenuIcon("download") };
menuInstall.Click += (_, _) => _ = LaunchInstall([SelectedItem!]);

var menuInstallOptions = new MenuItem { Header = CoreTools.Translate("Install options"), Icon = LoadMenuIcon("options") };
var menuInstallOptions = new MenuItem { Header = ShortcutHeader(CoreTools.Translate("Install options"), OptionsShortcut), Icon = LoadMenuIcon("options") };
menuInstallOptions.Click += (_, _) => _ = ShowInstallationOptionsForPackage(SelectedItem);

var menuDetails = new MenuItem { Header = CoreTools.Translate("Package details"), Icon = LoadMenuIcon("info_round") };
var menuDetails = new MenuItem { Header = ShortcutHeader(CoreTools.Translate("Package details"), DetailsShortcut), Icon = LoadMenuIcon("info_round") };
menuDetails.Click += (_, _) => _ = ShowDetailsForPackage(SelectedItem);

var menu = new ContextMenu();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,14 +131,14 @@
{
var menuUninstall = new MenuItem
{
Header = CoreTools.Translate("Uninstall"),
Header = ShortcutHeader(CoreTools.Translate("Uninstall"), MainActionShortcut),
Icon = LoadMenuIcon("delete"),
};
menuUninstall.Click += (_, _) => _ = LaunchUninstall([SelectedItem!]);

_menuInstallationOptions = new MenuItem
{
Header = CoreTools.Translate("Uninstall options"),
Header = ShortcutHeader(CoreTools.Translate("Uninstall options"), OptionsShortcut),
Icon = LoadMenuIcon("options"),
};
_menuInstallationOptions.Click += (_, _) => _ = ShowInstallationOptionsForPackage(SelectedItem);
Expand Down Expand Up @@ -203,7 +203,7 @@

_menuDetails = new MenuItem
{
Header = CoreTools.Translate("Package details"),
Header = ShortcutHeader(CoreTools.Translate("Package details"), DetailsShortcut),
Icon = LoadMenuIcon("info_round"),
};
_menuDetails.Click += (_, _) => _ = ShowDetailsForPackage(SelectedItem);
Expand Down Expand Up @@ -305,7 +305,7 @@
banner.Message = CoreTools.Translate(
"It looks like WinGet is not working properly. Do you want to attempt to repair WinGet?");
banner.ActionButtonText = CoreTools.Translate("Repair WinGet");
banner.ActionButtonCommand = new AsyncRelayCommand(AvaloniaPackageOperationHelper.HandleBrokenWinGetAsync);

Check warning on line 308 in src/UniGetUI.Avalonia/Views/SoftwarePages/InstalledPackagesPage.cs

View workflow job for this annotation

GitHub Actions / Linux (Avalonia)

This call site is reachable on all platforms. 'AvaloniaPackageOperationHelper.HandleBrokenWinGetAsync()' is only supported on: 'windows'. (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1416)
banner.IsClosable = true;
banner.IsOpen = true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,10 +127,10 @@ private static IReadOnlyList<IPackage> GetCheckedNonInstalledPackages(PackagesPa
// ─── Context menu ─────────────────────────────────────────────────────────
protected override ContextMenu? GenerateContextMenu()
{
_menuInstall = new MenuItem { Header = CoreTools.Translate("Install"), Icon = LoadMenuIcon("download") };
_menuInstall = new MenuItem { Header = ShortcutHeader(CoreTools.Translate("Install"), MainActionShortcut), Icon = LoadMenuIcon("download") };
_menuInstall.Click += (_, _) => _ = ImportAndInstallPackage(SelectedItem is { } p ? [p] : []);

_menuInstallOptions = new MenuItem { Header = CoreTools.Translate("Install options"), Icon = LoadMenuIcon("options") };
_menuInstallOptions = new MenuItem { Header = ShortcutHeader(CoreTools.Translate("Install options"), OptionsShortcut), Icon = LoadMenuIcon("options") };
_menuInstallOptions.Click += (_, _) =>
{
if (SelectedItem is ImportedPackage imported)
Expand Down Expand Up @@ -163,7 +163,7 @@ private static IReadOnlyList<IPackage> GetCheckedNonInstalledPackages(PackagesPa
}
};

_menuDetails = new MenuItem { Header = CoreTools.Translate("Package details"), Icon = LoadMenuIcon("info_round") };
_menuDetails = new MenuItem { Header = ShortcutHeader(CoreTools.Translate("Package details"), DetailsShortcut), Icon = LoadMenuIcon("info_round") };
_menuDetails.Click += (_, _) => _ = ShowDetailsForPackage(SelectedItem);

var menu = new ContextMenu();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,14 +109,14 @@ protected override void GenerateToolBar(PackagesPageViewModel vm)
{
var menuUpdate = new MenuItem
{
Header = CoreTools.Translate("Update"),
Header = ShortcutHeader(CoreTools.Translate("Update"), MainActionShortcut),
Icon = LoadMenuIcon("update"),
};
menuUpdate.Click += (_, _) => _ = LaunchUpdate([SelectedItem!]);

var menuUpdateOptions = new MenuItem
{
Header = CoreTools.Translate("Update options"),
Header = ShortcutHeader(CoreTools.Translate("Update options"), OptionsShortcut),
Icon = LoadMenuIcon("options"),
};
menuUpdateOptions.Click += (_, _) => _ = ShowInstallationOptionsForPackage(SelectedItem);
Expand Down Expand Up @@ -233,7 +233,7 @@ protected override void GenerateToolBar(PackagesPageViewModel vm)

var menuDetails = new MenuItem
{
Header = CoreTools.Translate("Package details"),
Header = ShortcutHeader(CoreTools.Translate("Package details"), DetailsShortcut),
Icon = LoadMenuIcon("info_round"),
};
menuDetails.Click += (_, _) => _ = ShowDetailsForPackage(SelectedItem);
Expand Down
Loading