Skip to content

Commit

Permalink
fix navigation with Up/Down/Home/End keys
Browse files Browse the repository at this point in the history
  • Loading branch information
tkohlmeier committed Feb 26, 2025
1 parent b6772f7 commit 3c10c55
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 4 deletions.
3 changes: 2 additions & 1 deletion src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -504,7 +504,8 @@
Package="{x:Bind Package}" Wrapper="{x:Bind Self}"
RightTapped="PackageItemContainer_RightTapped"
DoubleTapped="PackageItemContainer_DoubleTapped"
KeyUp="PackageItemContainer_KeyUp">
KeyUp="PackageItemContainer_KeyUp"
PreviewKeyDown="PackageItemContainer_PreviewKeyDown">

<Grid ColumnSpacing="5" Opacity="{x:Bind ListedOpacity, Mode=OneWay}" Padding="12,3,8,3">
<Grid.RowDefinitions>
Expand Down
35 changes: 32 additions & 3 deletions src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -483,10 +483,16 @@ protected async Task LoadPackages(ReloadReason reason)

private void SelectAndScrollTo(int index)
{
PackageWrapper packageWrapper = FilteredPackages[index];
PackageList.Select(index);
PackageItemContainer? selectedItem = PackageList.FindDescendant<PackageItemContainer>(c => c.IsSelected);
selectedItem?.Focus(FocusState.Programmatic);
PackageList.StartBringItemIntoView(index, new BringIntoViewOptions());
PackageList.StartBringItemIntoView(FilteredPackages.IndexOf(packageWrapper), new BringIntoViewOptions());

PackageItemContainer? packageToSelect = PackageList.FindDescendant<PackageItemContainer>(c => c.Wrapper == packageWrapper);
if (packageToSelect != null)
{
packageToSelect.IsSelected = true;
packageToSelect.Focus(FocusState.Programmatic);
}
}

public void PackageList_KeyDown(object sender, KeyRoutedEventArgs e)
Expand Down Expand Up @@ -1066,5 +1072,28 @@ public void OnLeave()
Visibility = Visibility.Collapsed;
IsEnabled = false;
}

private void PackageItemContainer_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
{
if (e.Key is not (VirtualKey.Up or VirtualKey.Down or VirtualKey.Home or VirtualKey.End) ||
sender is not PackageItemContainer packageItemContainer)
{
return;
}

int index = FilteredPackages.IndexOf(packageItemContainer.Wrapper);
switch (e.Key)
{
case VirtualKey.Up when index > 0:
SelectAndScrollTo(index - 1); break;
case VirtualKey.Down when index < FilteredPackages.Count - 1:
SelectAndScrollTo(index + 1); break;
case VirtualKey.Home when index > 0:
SelectAndScrollTo(0); break;
case VirtualKey.End when index < FilteredPackages.Count - 1:
SelectAndScrollTo(FilteredPackages.Count - 1); break;
}
e.Handled = true;
}
}
}

0 comments on commit 3c10c55

Please sign in to comment.