Skip to content

Commit bdc1b68

Browse files
Fix: Fixed cannot select Files in columns view (#12124)
1 parent fa9e57d commit bdc1b68

File tree

3 files changed

+59
-18
lines changed

3 files changed

+59
-18
lines changed

src/Files.App/Views/ColumnParam.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using Files.App.Views.LayoutModes;
12
using Microsoft.UI.Xaml.Controls;
23

34
namespace Files.App.Views
@@ -7,5 +8,7 @@ public class ColumnParam : NavigationArguments
78
public int Column { get; set; }
89

910
public ListView ListView { get; set; }
11+
12+
public ColumnViewBase? Source { get; set; }
1013
}
1114
}

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

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
using Windows.Storage;
2020
using Windows.System;
2121
using Windows.UI.Core;
22+
using DispatcherQueueTimer = Microsoft.UI.Dispatching.DispatcherQueueTimer;
2223
using static Files.App.Constants;
24+
using Microsoft.UI.Dispatching;
2325

2426
namespace Files.App.Views.LayoutModes
2527
{
@@ -31,6 +33,8 @@ public sealed partial class ColumnViewBase : StandardViewBase
3133

3234
protected override SemanticZoom RootZoom => RootGridZoom;
3335

36+
private readonly DispatcherQueueTimer doubleClickTimer;
37+
3438
private ColumnViewBrowser? columnsOwner;
3539

3640
private ListViewItem? openedFolderPresenter;
@@ -42,6 +46,8 @@ public ColumnViewBase() : base()
4246
selectionRectangle.SelectionEnded += SelectionRectangle_SelectionEnded;
4347
ItemInvoked += ColumnViewBase_ItemInvoked;
4448
GotFocus += ColumnViewBase_GotFocus;
49+
50+
doubleClickTimer = DispatcherQueue.CreateTimer();
4551
}
4652

4753
private void ColumnViewBase_GotFocus(object sender, RoutedEventArgs e)
@@ -234,7 +240,7 @@ private void FileList_PreviewKeyUp(object sender, KeyRoutedEventArgs e)
234240
{
235241
// Open selected directory
236242
if (IsItemSelected && SelectedItem?.PrimaryItemAttribute == StorageItemTypes.Folder)
237-
ItemInvoked?.Invoke(new ColumnParam { NavPathParam = (SelectedItem is ShortcutItem sht ? sht.TargetPath : SelectedItem.ItemPath), ListView = FileList }, EventArgs.Empty);
243+
ItemInvoked?.Invoke(new ColumnParam { Source = this, NavPathParam = (SelectedItem is ShortcutItem sht ? sht.TargetPath : SelectedItem.ItemPath), ListView = FileList }, EventArgs.Empty);
238244
}
239245

240246
protected override async void FileList_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
@@ -259,7 +265,7 @@ protected override async void FileList_PreviewKeyDown(object sender, KeyRoutedEv
259265
e.Handled = true;
260266

261267
if (IsItemSelected && SelectedItem.PrimaryItemAttribute == StorageItemTypes.Folder)
262-
ItemInvoked?.Invoke(new ColumnParam { NavPathParam = (SelectedItem is ShortcutItem sht ? sht.TargetPath : SelectedItem.ItemPath), ListView = FileList }, EventArgs.Empty);
268+
ItemInvoked?.Invoke(new ColumnParam { Source = this, NavPathParam = (SelectedItem is ShortcutItem sht ? sht.TargetPath : SelectedItem.ItemPath), ListView = FileList }, EventArgs.Empty);
263269
}
264270
else if (e.Key == VirtualKey.Enter && e.KeyStatus.IsMenuKeyDown)
265271
{
@@ -316,6 +322,8 @@ protected override async void FileList_PreviewKeyDown(object sender, KeyRoutedEv
316322

317323
private void FileList_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
318324
{
325+
doubleClickTimer.Stop();
326+
319327
var clickedItem = e.OriginalSource as FrameworkElement;
320328

321329
if (clickedItem?.DataContext is ListedItem item)
@@ -328,7 +336,7 @@ private void FileList_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
328336
break;
329337
case StorageItemTypes.Folder:
330338
if (!UserSettingsService.FoldersSettingsService.ColumnLayoutOpenFoldersWithOneClick)
331-
ItemInvoked?.Invoke(new ColumnParam { NavPathParam = (item is ShortcutItem sht ? sht.TargetPath : item.ItemPath), ListView = FileList }, EventArgs.Empty);
339+
ItemInvoked?.Invoke(new ColumnParam { Source = this, NavPathParam = (item is ShortcutItem sht ? sht.TargetPath : item.ItemPath), ListView = FileList }, EventArgs.Empty);
332340
break;
333341
default:
334342
if (UserSettingsService.FoldersSettingsService.DoubleClickToGoUp)
@@ -405,24 +413,36 @@ private async void FileList_ItemTapped(object sender, TappedRoutedEventArgs e)
405413
ItemInvoked?.Invoke(
406414
new ColumnParam
407415
{
416+
Source = this,
408417
NavPathParam = (item is ShortcutItem sht ? sht.TargetPath : item!.ItemPath),
409418
ListView = FileList
410419
},
411420
EventArgs.Empty);
412421
}
413422
else if (!IsRenamingItem && (isItemFile || isItemFolder))
414423
{
415-
ClearOpenedFolderSelectionIndicator();
416-
417-
var itemPath = item!.ItemPath.EndsWith('\\')
418-
? item.ItemPath.Substring(0, item.ItemPath.Length - 1)
419-
: item.ItemPath;
420-
421-
ItemTapped?.Invoke(new ColumnParam { NavPathParam = Path.GetDirectoryName(itemPath), ListView = FileList }, EventArgs.Empty);
424+
CheckDoubleClick(item!);
422425
}
423426
}
424427
}
425428

429+
private void CheckDoubleClick(ListedItem item)
430+
{
431+
doubleClickTimer.Debounce(() =>
432+
{
433+
ClearOpenedFolderSelectionIndicator();
434+
435+
var itemPath = item!.ItemPath.EndsWith('\\')
436+
? item.ItemPath.Substring(0, item.ItemPath.Length - 1)
437+
: item.ItemPath;
438+
439+
ItemTapped?.Invoke(new ColumnParam { Source = this, NavPathParam = Path.GetDirectoryName(itemPath), ListView = FileList }, EventArgs.Empty);
440+
441+
doubleClickTimer.Stop();
442+
},
443+
TimeSpan.FromMilliseconds(200));
444+
}
445+
426446
private void Grid_Loaded(object sender, RoutedEventArgs e)
427447
{
428448
var itemContainer = (sender as Grid)?.FindAscendant<ListViewItem>();

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

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using System.Collections.Generic;
1313
using System.Linq;
1414
using Windows.Storage;
15+
using Windows.System.Threading.Core;
1516
using static Files.App.Constants;
1617
using static Files.App.Helpers.PathNormalization;
1718

@@ -77,8 +78,7 @@ private void ColumnViewBase_ItemInvoked(object? sender, EventArgs e)
7778
navigationArguments.NavPathParam = column.NavPathParam;
7879
ParentShellPageInstance.TabItemArguments.NavigationArg = column.NavPathParam;
7980
}
80-
else if (UserSettingsService.FoldersSettingsService.ColumnLayoutOpenFoldersWithOneClick &&
81-
arePathsDifferent)
81+
else if (UserSettingsService.FoldersSettingsService.ColumnLayoutOpenFoldersWithOneClick)
8282
{
8383
CloseUnnecessaryColumns(column);
8484
}
@@ -435,19 +435,37 @@ private void ColumnViewBase_ItemTapped(object? sender, EventArgs e)
435435
var column = sender as ColumnParam;
436436
if (column?.ListView.FindAscendant<ColumnViewBrowser>() != this || string.IsNullOrEmpty(column.NavPathParam))
437437
return;
438-
438+
439439
CloseUnnecessaryColumns(column);
440440
}
441441

442442
private void CloseUnnecessaryColumns(ColumnParam column)
443443
{
444-
var columnPath = ((ColumnHost.ActiveBlades.Last().Content as Frame)?.Content as ColumnShellPage)?.FilesystemViewModel?.WorkingDirectory;
445-
var columnFirstPath = ((ColumnHost.ActiveBlades.First().Content as Frame)?.Content as ColumnShellPage)?.FilesystemViewModel.WorkingDirectory;
446-
if (string.IsNullOrEmpty(columnPath) || string.IsNullOrEmpty(columnFirstPath))
444+
if (string.IsNullOrEmpty(column.NavPathParam))
447445
return;
448446

449-
var destComponents = StorageFileExtensions.GetDirectoryPathComponents(column.NavPathParam);
450-
var (_, relativeIndex) = GetLastCommonAndRelativeIndex(destComponents, columnPath, columnFirstPath);
447+
var relativeIndex = column.Column is not 0 ? column.Column : -1;
448+
449+
if (column.Source is not null)
450+
{
451+
for (var i = 0; i < ColumnHost.ActiveBlades.Count && relativeIndex is -1; i++)
452+
{
453+
var bladeColumn = ColumnHost.ActiveBlades[i].FindDescendant<ColumnViewBase>();
454+
if (bladeColumn is not null && bladeColumn == column.Source)
455+
relativeIndex = i;
456+
}
457+
}
458+
459+
if (relativeIndex is -1)
460+
{
461+
// Get the index of the blade with the same path as the requested
462+
var blade = ColumnHost.ActiveBlades.FirstOrDefault(b =>
463+
column.NavPathParam.Equals(((b.Content as Frame)?.Content as ColumnShellPage)?.FilesystemViewModel?.WorkingDirectory));
464+
465+
if (blade is not null)
466+
relativeIndex = ColumnHost.ActiveBlades.IndexOf(blade);
467+
}
468+
451469
if (relativeIndex >= 0)
452470
{
453471
ColumnHost.ActiveBlades[relativeIndex].FindDescendant<ColumnViewBase>()?.ClearOpenedFolderSelectionIndicator();

0 commit comments

Comments
 (0)