Skip to content

Commit 2df6ffc

Browse files
Feature: Close column when selecting a file (#11003)
1 parent f61f49b commit 2df6ffc

File tree

2 files changed

+166
-121
lines changed

2 files changed

+166
-121
lines changed

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

Lines changed: 46 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
using CommunityToolkit.Mvvm.DependencyInjection;
21
using CommunityToolkit.WinUI.UI;
32
using Files.App.EventArguments;
43
using Files.App.Filesystem;
54
using Files.App.Helpers;
65
using Files.App.Interacts;
76
using Files.App.UserControls.Selection;
8-
using Files.Backend.Services.Settings;
97
using Files.Shared.Enums;
108
using Microsoft.UI.Input;
119
using Microsoft.UI.Xaml;
@@ -14,6 +12,7 @@
1412
using Microsoft.UI.Xaml.Media;
1513
using Microsoft.UI.Xaml.Navigation;
1614
using System;
15+
using System.IO;
1716
using System.Linq;
1817
using Windows.Storage;
1918
using Windows.System;
@@ -25,8 +24,6 @@ namespace Files.App.Views.LayoutModes
2524
{
2625
public sealed partial class ColumnViewBase : StandardViewBase
2726
{
28-
private IUserSettingsService UserSettingsService { get; } = Ioc.Default.GetRequiredService<IUserSettingsService>();
29-
3027
protected override uint IconSize => Browser.ColumnViewBrowser.ColumnViewSizeSmall;
3128

3229
protected override ListViewBase ListViewBase => FileList;
@@ -104,6 +101,8 @@ protected override void ItemManipulationModel_RemoveSelectedItemInvoked(object?
104101

105102
public event EventHandler? ItemInvoked;
106103

104+
public event EventHandler? ItemTapped;
105+
107106
protected override void OnNavigatedTo(NavigationEventArgs eventArgs)
108107
{
109108
if (eventArgs.Parameter is NavigationArguments navArgs)
@@ -153,17 +152,13 @@ private void ItemNameTextBox_BeforeTextChanging(TextBox textBox, TextBoxBeforeTe
153152

154153
protected override void EndRename(TextBox textBox)
155154
{
156-
if (textBox is null || textBox.Parent is null)
157-
{
158-
// Navigating away, do nothing
159-
}
160-
else
155+
if (textBox is not null && textBox.Parent is not null)
161156
{
162157
// Re-focus selected list item
163-
ListViewItem? listViewItem = FileList.ContainerFromItem(RenamingItem) as ListViewItem;
158+
var listViewItem = FileList.ContainerFromItem(RenamingItem) as ListViewItem;
164159
listViewItem?.Focus(FocusState.Programmatic);
165160

166-
TextBlock? textBlock = listViewItem?.FindDescendant("ItemName") as TextBlock;
161+
var textBlock = listViewItem?.FindDescendant("ItemName") as TextBlock;
167162
textBox!.Visibility = Visibility.Collapsed;
168163
textBlock!.Visibility = Visibility.Visible;
169164
}
@@ -212,21 +207,10 @@ private void FileList_RightTapped(object sender, RightTappedRoutedEventArgs e)
212207

213208
private void HandleRightClick(object sender, RightTappedRoutedEventArgs e)
214209
{
215-
var objectPressed = ((FrameworkElement)e.OriginalSource).DataContext as ListedItem;
216-
if (objectPressed is not null)
217-
return;
218-
// Check if RightTapped row is currently selected
219-
if (IsItemSelected)
220-
{
221-
if (SelectedItems.Contains(objectPressed))
222-
return;
223-
}
224-
225-
// The following code is only reachable when a user RightTapped an unselected row
226-
ItemManipulationModel.SetSelectedItem(objectPressed);
210+
HandleRightClick(e.OriginalSource);
227211
}
228212

229-
private DispatcherQueueTimer tapDebounceTimer;
213+
private readonly DispatcherQueueTimer tapDebounceTimer;
230214

231215
private void FileList_PreviewKeyUp(object sender, KeyRoutedEventArgs e)
232216
{
@@ -289,6 +273,8 @@ protected override async void FileList_PreviewKeyDown(object sender, KeyRoutedEv
289273
}
290274
else if (e.Key == VirtualKey.Up || e.Key == VirtualKey.Down)
291275
{
276+
ClearOpenedFolderSelectionIndicator();
277+
292278
// If list has only one item, select it on arrow down/up (#5681)
293279
if (!IsItemSelected)
294280
{
@@ -340,9 +326,8 @@ private void FileList_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
340326
break;
341327
}
342328
}
343-
else
329+
else if (UserSettingsService.FoldersSettingsService.DoubleClickToGoUp)
344330
{
345-
if (UserSettingsService.FoldersSettingsService.DoubleClickToGoUp)
346331
ParentShellPageInstance.Up_Click();
347332
}
348333

@@ -356,17 +341,16 @@ private void FileList_Holding(object sender, HoldingRoutedEventArgs e)
356341

357342
private void HandleRightClick(object sender, HoldingRoutedEventArgs e)
358343
{
359-
var objectPressed = ((FrameworkElement)e.OriginalSource).DataContext as ListedItem;
344+
HandleRightClick(e.OriginalSource);
345+
}
360346

361-
if (objectPressed is not null)
362-
return;
347+
private void HandleRightClick(object pressed)
348+
{
349+
var objectPressed = ((FrameworkElement)pressed).DataContext as ListedItem;
363350

364351
// Check if RightTapped row is currently selected
365-
if (IsItemSelected)
366-
{
367-
if (SelectedItems.Contains(objectPressed))
368-
return;
369-
}
352+
if (objectPressed is not null || (IsItemSelected && SelectedItems.Contains(objectPressed)))
353+
return;
370354

371355
// The following code is only reachable when a user RightTapped an unselected row
372356
ItemManipulationModel.SetSelectedItem(objectPressed);
@@ -383,9 +367,11 @@ private async void FileList_ItemTapped(object sender, TappedRoutedEventArgs e)
383367
if (ctrlPressed || shiftPressed)
384368
return;
385369

370+
var isItemFile = item?.PrimaryItemAttribute is StorageItemTypes.File;
371+
var isItemFolder = item?.PrimaryItemAttribute is StorageItemTypes.Folder;
372+
386373
// Check if the setting to open items with a single click is turned on
387-
if (item is not null
388-
&& (UserSettingsService.FoldersSettingsService.OpenItemsWithOneClick && item.PrimaryItemAttribute == StorageItemTypes.File))
374+
if (UserSettingsService.FoldersSettingsService.OpenItemsWithOneClick && isItemFile)
389375
{
390376
ResetRenameDoubleClick();
391377
_ = NavigationHelpers.OpenSelectedItems(ParentShellPageInstance, false);
@@ -397,18 +383,32 @@ private async void FileList_ItemTapped(object sender, TappedRoutedEventArgs e)
397383
{
398384
CheckRenameDoubleClick(clickedItem.DataContext);
399385
}
400-
else if (IsRenamingItem)
386+
else if (IsRenamingItem &&
387+
FileList.ContainerFromItem(RenamingItem) is ListViewItem listViewItem &&
388+
listViewItem.FindDescendant("ListViewTextBoxItemName") is TextBox textBox)
401389
{
402-
if (FileList.ContainerFromItem(RenamingItem) is ListViewItem listViewItem
403-
&& listViewItem.FindDescendant("ListViewTextBoxItemName") is TextBox textBox)
404-
{
405-
await CommitRename(textBox);
406-
}
390+
await CommitRename(textBox);
407391
}
408-
if (item is not null && item.PrimaryItemAttribute == StorageItemTypes.Folder &&
409-
UserSettingsService.FoldersSettingsService.ColumnLayoutOpenFoldersWithOneClick)
392+
393+
if (isItemFolder && UserSettingsService.FoldersSettingsService.ColumnLayoutOpenFoldersWithOneClick)
410394
{
411-
ItemInvoked?.Invoke(new ColumnParam { NavPathParam = (item is ShortcutItem sht ? sht.TargetPath : item.ItemPath), ListView = FileList }, EventArgs.Empty);
395+
ItemInvoked?.Invoke(
396+
new ColumnParam
397+
{
398+
NavPathParam = (item is ShortcutItem sht ? sht.TargetPath : item!.ItemPath),
399+
ListView = FileList
400+
},
401+
EventArgs.Empty);
402+
}
403+
else if (!IsRenamingItem && (isItemFile || isItemFolder))
404+
{
405+
ClearOpenedFolderSelectionIndicator();
406+
407+
var itemPath = item!.ItemPath.EndsWith('\\')
408+
? item.ItemPath.Substring(0, item.ItemPath.Length - 1)
409+
: item.ItemPath;
410+
411+
ItemTapped?.Invoke(new ColumnParam { NavPathParam = Path.GetDirectoryName(itemPath), ListView = FileList }, EventArgs.Empty);
412412
}
413413
}
414414
}
@@ -423,7 +423,7 @@ private void Grid_Loaded(object sender, RoutedEventArgs e)
423423
itemContainer.ContextFlyout = ItemContextMenuFlyout;
424424
}
425425

426-
protected override void BaseFolderSettings_LayoutModeChangeRequested(object sender, LayoutModeEventArgs e)
426+
protected override void BaseFolderSettings_LayoutModeChangeRequested(object? sender, LayoutModeEventArgs e)
427427
{
428428
var parent = this.FindAscendant<ModernShellPage>();
429429

0 commit comments

Comments
 (0)