Skip to content

Commit d9b472a

Browse files
authored
Improve keyboard nav in column layout (#7494)
1 parent 1d78721 commit d9b472a

File tree

7 files changed

+47
-15
lines changed

7 files changed

+47
-15
lines changed

src/Files/BaseLayout.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ public void SetSelectedItemsOnNavigation()
507507
ItemManipulationModel.SetSelectedItems(liItemsToSelect);
508508
ItemManipulationModel.FocusSelectedItems();
509509
}
510-
else
510+
else if (navigationArguments != null && navigationArguments.FocusOnNavigation)
511511
{
512512
ItemManipulationModel.FocusFileList(); // Set focus on layout specific file list control
513513
}

src/Files/Views/LayoutModes/ColumnViewBase.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@
167167
IsRightTapEnabled="True"
168168
ItemsSource="{x:Bind CollectionViewSource.View, Mode=OneWay}"
169169
PreviewKeyDown="FileList_PreviewKeyDown"
170+
PreviewKeyUp="FileList_PreviewKeyUp"
170171
RightTapped="FileList_RightTapped"
171172
ScrollViewer.IsScrollInertiaEnabled="True"
172173
SelectionChanged="FileList_SelectionChanged"

src/Files/Views/LayoutModes/ColumnViewBase.xaml.cs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public ColumnViewBase() : base()
2626
this.InitializeComponent();
2727
var selectionRectangle = RectangleSelection.Create(FileList, SelectionRectangle, FileList_SelectionChanged);
2828
selectionRectangle.SelectionEnded += SelectionRectangle_SelectionEnded;
29+
tapDebounceTimer = DispatcherQueue.GetForCurrentThread().CreateTimer();
2930
}
3031

3132
protected override void HookEvents()
@@ -147,6 +148,11 @@ private void ListViewTextBoxItemName_TextChanged(object sender, TextChangedEvent
147148

148149
protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
149150
{
151+
if (eventArgs.Parameter is NavigationArguments navArgs)
152+
{
153+
// Focus filelist only if first column
154+
navArgs.FocusOnNavigation = (navArgs.AssociatedTabInstance as ColumnShellPage)?.ColumnParams?.Column == 0;
155+
}
150156
base.OnNavigatedTo(eventArgs);
151157
}
152158

@@ -336,6 +342,26 @@ private void HandleRightClick(object sender, RightTappedRoutedEventArgs e)
336342
ItemManipulationModel.SetSelectedItem(objectPressed);
337343
}
338344

345+
private DispatcherQueueTimer tapDebounceTimer;
346+
347+
private void FileList_PreviewKeyUp(object sender, KeyRoutedEventArgs e)
348+
{
349+
// Open selected directory
350+
tapDebounceTimer.Stop();
351+
if (IsItemSelected && SelectedItem.PrimaryItemAttribute == StorageItemTypes.Folder)
352+
{
353+
var currItem = SelectedItem;
354+
tapDebounceTimer.Debounce(() =>
355+
{
356+
if (currItem == SelectedItem)
357+
{
358+
ItemInvoked?.Invoke(new ColumnParam { NavPathParam = (SelectedItem is ShortcutItem sht ? sht.TargetPath : SelectedItem.ItemPath), ListView = FileList }, EventArgs.Empty);
359+
}
360+
tapDebounceTimer.Stop();
361+
}, TimeSpan.FromMilliseconds(200));
362+
}
363+
}
364+
339365
private async void FileList_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
340366
{
341367
var ctrlPressed = Window.Current.CoreWindow.GetKeyState(VirtualKey.Control).HasFlag(CoreVirtualKeyStates.Down);
@@ -382,7 +408,7 @@ private async void FileList_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
382408
else if (e.Key == VirtualKey.Up || e.Key == VirtualKey.Down)
383409
{
384410
// If list has only one item, select it on arrow down/up (#5681)
385-
if (!IsItemSelected && FileList.Items.Count == 1)
411+
if (!IsItemSelected)
386412
{
387413
FileList.SelectedIndex = 0;
388414
e.Handled = true;
@@ -399,14 +425,11 @@ private async void FileList_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
399425
e.Handled = true;
400426
}
401427
}
402-
else if (e.Key == VirtualKey.Right) // Right arrow: open selected folder
428+
else if (e.Key == VirtualKey.Right) // Right arrow: switch focus to next column
403429
{
404430
if (!IsRenamingItem && !ParentShellPageInstance.NavToolbarViewModel.IsEditModeEnabled)
405431
{
406-
if (IsItemSelected && SelectedItem.PrimaryItemAttribute == StorageItemTypes.Folder)
407-
{
408-
ItemInvoked?.Invoke(new ColumnParam { NavPathParam = (SelectedItem is ShortcutItem sht ? sht.TargetPath : SelectedItem.ItemPath), ListView = FileList }, EventArgs.Empty);
409-
}
432+
FocusManager.TryMoveFocus(FocusNavigationDirection.Next);
410433
e.Handled = true;
411434
}
412435
}

src/Files/Views/LayoutModes/ColumnViewBrowser.xaml.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,6 @@ private void ColumnViewBase_ItemInvoked(object sender, EventArgs e)
6262
NavPathParam = column.NavPathParam
6363
});
6464
}
65-
else
66-
{
67-
// Navigation path is already open, only select next column
68-
FocusManager.TryMoveFocus(FocusNavigationDirection.Next);
69-
}
7065
}
7166

7267
private void ContentChanged(IShellPage p)
@@ -106,7 +101,7 @@ protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
106101
public override void Dispose()
107102
{
108103
base.Dispose();
109-
ColumnHost.ActiveBlades.ForEach(x => (((x.Content as Frame)?.Content as ColumnShellPage).SlimContentPage as ColumnViewBase).ItemInvoked -= ColumnViewBase_ItemInvoked);
104+
ColumnHost.ActiveBlades.Select(x => ((x.Content as Frame)?.Content as ColumnShellPage).SlimContentPage as ColumnViewBase).Where(x => x != null).ForEach(x => x.ItemInvoked -= ColumnViewBase_ItemInvoked);
110105
ColumnHost.ActiveBlades.ForEach(x => ((x.Content as Frame)?.Content as UIElement).GotFocus -= ColumnViewBrowser_GotFocus);
111106
ColumnHost.ActiveBlades.Select(x => (x.Content as Frame)?.Content).OfType<IDisposable>().ForEach(x => x.Dispose());
112107
UnhookEvents();
@@ -133,7 +128,10 @@ private void DismissOtherBlades(BladeItem blade)
133128
{
134129
disposableContent.Dispose();
135130
}
136-
(((ColumnHost.ActiveBlades[index + 1].Content as Frame).Content as ColumnShellPage).SlimContentPage as ColumnViewBase).ItemInvoked -= ColumnViewBase_ItemInvoked;
131+
if (((ColumnHost.ActiveBlades[index + 1].Content as Frame).Content as ColumnShellPage)?.SlimContentPage is ColumnViewBase columnLayout)
132+
{
133+
columnLayout.ItemInvoked -= ColumnViewBase_ItemInvoked;
134+
}
137135
((ColumnHost.ActiveBlades[index + 1].Content as Frame).Content as UIElement).GotFocus -= ColumnViewBrowser_GotFocus;
138136
ColumnHost.Items.RemoveAt(index + 1);
139137
ColumnHost.ActiveBlades.RemoveAt(index + 1);

src/Files/Views/LayoutModes/DetailsLayoutBrowser.xaml.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,12 @@ protected override void InitializeCommandsViewModel()
180180

181181
protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
182182
{
183+
if (eventArgs.Parameter is NavigationArguments navArgs)
184+
{
185+
navArgs.FocusOnNavigation = true;
186+
}
183187
base.OnNavigatedTo(eventArgs);
188+
184189
if (ParentShellPageInstance.InstanceViewModel?.FolderSettings.ColumnsViewModel != null)
185190
{
186191
ColumnsViewModel = ParentShellPageInstance.InstanceViewModel.FolderSettings.ColumnsViewModel;

src/Files/Views/LayoutModes/GridViewBrowser.xaml.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ protected override void InitializeCommandsViewModel()
145145

146146
protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
147147
{
148+
if (eventArgs.Parameter is NavigationArguments navArgs)
149+
{
150+
navArgs.FocusOnNavigation = true;
151+
}
148152
base.OnNavigatedTo(eventArgs);
149153

150154
currentIconSize = FolderSettings.GetIconSize();
@@ -405,7 +409,7 @@ private async void FileList_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
405409
else if (e.Key == VirtualKey.Up || e.Key == VirtualKey.Down)
406410
{
407411
// If list has only one item, select it on arrow down/up (#5681)
408-
if (!IsItemSelected && FileList.Items.Count == 1)
412+
if (!IsItemSelected)
409413
{
410414
FileList.SelectedIndex = 0;
411415
e.Handled = true;

src/Files/Views/ModernShellPage.xaml.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,7 @@ public class NavigationParams
11291129

11301130
public class NavigationArguments
11311131
{
1132+
public bool FocusOnNavigation { get; set; } = false;
11321133
public string NavPathParam { get; set; } = null;
11331134
public IShellPage AssociatedTabInstance { get; set; }
11341135
public bool IsSearchResultPage { get; set; } = false;

0 commit comments

Comments
 (0)