Skip to content

Commit 79ddba1

Browse files
committed
Merge branch 'fix-package-focus' of https://github.com/tkohlmeier/UniGetUI into pr/3360
2 parents 36991bb + 4593894 commit 79ddba1

2 files changed

Lines changed: 64 additions & 23 deletions

File tree

src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212
mc:Ignorable="d"
1313
Name="ABSTRACT_PAGE"
1414
NavigationCacheMode="Required"
15-
xmlns:animations="using:CommunityToolkit.WinUI.Animations" xmlns:pkgClasses="using:UniGetUI.PackageEngine.PackageClasses"
16-
CharacterReceived="{x:Bind PackageList_CharacterReceived}">
15+
xmlns:animations="using:CommunityToolkit.WinUI.Animations" xmlns:pkgClasses="using:UniGetUI.PackageEngine.PackageClasses">
1716
<!-- PreviewKeyDown="{x:Bind PackageList_PreviewKeyDown}" -->
1817

1918
<animations:Implicit.ShowAnimations>
@@ -908,7 +907,8 @@
908907
<ItemsView x:Name="PackageList" x:FieldModifier="protected" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Grid.Row="1"
909908
ItemsSource="{x:Bind FilteredPackages, Mode=OneWay}"
910909
ItemTemplate="{StaticResource PackageTemplate}" Padding="4,0,4,0"
911-
CanBeScrollAnchor="False">
910+
CanBeScrollAnchor="False"
911+
CharacterReceived="{x:Bind PackageList_CharacterReceived}">
912912
<ItemsView.Layout>
913913
<StackLayout Spacing="3"/>
914914
</ItemsView.Layout>

src/UniGetUI/Pages/SoftwarePages/AbstractPackagesPage.xaml.cs

Lines changed: 61 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using UniGetUI.Interface.Pages;
1818
using UniGetUI.Interface.Telemetry;
1919
using UniGetUI.Pages.DialogPages;
20+
using DispatcherQueuePriority = Microsoft.UI.Dispatching.DispatcherQueuePriority;
2021

2122
// To learn more about WinUI, the WinUI project structure,
2223
// and more about our project templates, see: http://aka.ms/winui-project-info.
@@ -481,18 +482,61 @@ protected async Task LoadPackages(ReloadReason reason)
481482
Loader_PackagesChanged(this, EventArgs.Empty);
482483
}
483484

484-
private void SelectAndScrollTo(int index)
485+
private void SelectAndScrollTo(int index, bool focus)
485486
{
486-
PackageWrapper packageWrapper = FilteredPackages[index];
487+
if (index < 0 || index >= FilteredPackages.Count)
488+
return;
489+
487490
PackageList.Select(index);
488-
PackageList.StartBringItemIntoView(FilteredPackages.IndexOf(packageWrapper), new BringIntoViewOptions());
489491

490-
PackageItemContainer? packageToSelect = PackageList.FindDescendant<PackageItemContainer>(c => c.Wrapper == packageWrapper);
491-
if (packageToSelect != null)
492+
if (PackageList.ScrollView?.VerticalOffset > index * 39)
492493
{
493-
packageToSelect.IsSelected = true;
494-
packageToSelect.Focus(FocusState.Programmatic);
494+
PackageList.ScrollView.ScrollTo(0, index * 39, new ScrollingScrollOptions(
495+
ScrollingAnimationMode.Disabled,
496+
ScrollingSnapPointsMode.Ignore
497+
));
495498
}
499+
else if (PackageList.ScrollView?.VerticalOffset + PackageList.ScrollView?.ViewportHeight < (index + 1) * 39)
500+
{
501+
PackageList.ScrollView?.ScrollTo(0, (index + 1) * 39 - PackageList.ScrollView.ViewportHeight, new ScrollingScrollOptions(
502+
ScrollingAnimationMode.Disabled,
503+
ScrollingSnapPointsMode.Ignore
504+
));
505+
}
506+
507+
if (focus)
508+
Focus(FilteredPackages[index].Package);
509+
}
510+
511+
private void Focus(IPackage packageToFocus, int retryCount = 0)
512+
{
513+
if (retryCount > 20)
514+
return;
515+
516+
DispatcherQueue.TryEnqueue(
517+
DispatcherQueuePriority.Low,
518+
() =>
519+
{
520+
PackageItemContainer? containerToFocus = PackageList.FindDescendant<PackageItemContainer>(c => c.Package?.Equals(packageToFocus) == true);
521+
if (containerToFocus == null)
522+
{
523+
Focus(packageToFocus, ++retryCount);
524+
return;
525+
}
526+
527+
if (!containerToFocus.IsSelected)
528+
{
529+
PackageItemContainer? selectedContainer = PackageList.FindDescendant<PackageItemContainer>(c => c.IsSelected);
530+
if (selectedContainer?.Package?.Equals(packageToFocus) == true)
531+
containerToFocus = selectedContainer;
532+
else
533+
{
534+
Focus(packageToFocus, ++retryCount);
535+
return;
536+
}
537+
}
538+
containerToFocus.Focus(FocusState.Keyboard);
539+
});
496540
}
497541

498542
public void PackageList_CharacterReceived(object sender, CharacterReceivedRoutedEventArgs e)
@@ -519,7 +563,7 @@ public void PackageList_CharacterReceived(object sender, CharacterReceivedRouted
519563
{
520564
if (FilteredPackages[i].Package.Name.ToLower().StartsWith(TypeQuery))
521565
{
522-
SelectAndScrollTo(i);
566+
SelectAndScrollTo(i, true);
523567
SelectedPackage = true;
524568
break;
525569
}
@@ -571,11 +615,11 @@ public void PackageList_CharacterReceived(object sender, CharacterReceivedRouted
571615
}
572616
}
573617

574-
SelectAndScrollTo(FirstIdx + (IndexOffset % (LastIdx - FirstIdx + 1)));
618+
SelectAndScrollTo(FirstIdx + (IndexOffset % (LastIdx - FirstIdx + 1)), true);
575619
}
576620
else if (QueryIndex > -1)
577621
{
578-
SelectAndScrollTo(QueryIndex);
622+
SelectAndScrollTo(QueryIndex, true);
579623
}
580624
}
581625
}
@@ -701,12 +745,7 @@ public void FilterPackages()
701745
{
702746
if (FilteredPackages[i].Package.Equals(previousSelection.Package))
703747
{
704-
PackageList.Select(i);
705-
PackageList.ScrollView?.ScrollTo(0, Math.Max(0, (i - 3) * 39), new ScrollingScrollOptions
706-
(
707-
ScrollingAnimationMode.Disabled,
708-
ScrollingSnapPointsMode.Ignore
709-
));
748+
SelectAndScrollTo(i, false);
710749
break;
711750
}
712751
}
@@ -892,6 +931,7 @@ private void PackageItemContainer_RightTapped(object sender, RightTappedRoutedEv
892931
if (sender is PackageItemContainer container && container.Package is not null)
893932
{
894933
PackageList.Select(container.Wrapper.Index);
934+
container.Focus(FocusState.Keyboard);
895935
WhenShowingContextMenu(container.Package);
896936
}
897937
}
@@ -901,6 +941,7 @@ private void PackageItemContainer_DoubleTapped(object sender, DoubleTappedRouted
901941
if (sender is PackageItemContainer container && container.Package is not null)
902942
{
903943
PackageList.Select(container.Wrapper.Index);
944+
container.Focus(FocusState.Keyboard);
904945

905946
TEL_InstallReferral referral = TEL_InstallReferral.ALREADY_INSTALLED;
906947
if (PAGE_NAME == "Bundles") referral = TEL_InstallReferral.FROM_BUNDLE;
@@ -1087,13 +1128,13 @@ private void PackageItemContainer_PreviewKeyDown(object sender, KeyRoutedEventAr
10871128
switch (e.Key)
10881129
{
10891130
case VirtualKey.Up when index > 0:
1090-
SelectAndScrollTo(index - 1); break;
1131+
SelectAndScrollTo(index - 1, true); break;
10911132
case VirtualKey.Down when index < FilteredPackages.Count - 1:
1092-
SelectAndScrollTo(index + 1); break;
1133+
SelectAndScrollTo(index + 1, true); break;
10931134
case VirtualKey.Home when index > 0:
1094-
SelectAndScrollTo(0); break;
1135+
SelectAndScrollTo(0, true); break;
10951136
case VirtualKey.End when index < FilteredPackages.Count - 1:
1096-
SelectAndScrollTo(FilteredPackages.Count - 1); break;
1137+
SelectAndScrollTo(FilteredPackages.Count - 1, true); break;
10971138
}
10981139
e.Handled = true;
10991140
}

0 commit comments

Comments
 (0)