1- using CommunityToolkit . Mvvm . DependencyInjection ;
21using CommunityToolkit . WinUI . UI ;
32using Files . App . EventArguments ;
43using Files . App . Filesystem ;
54using Files . App . Helpers ;
65using Files . App . Interacts ;
76using Files . App . UserControls . Selection ;
8- using Files . Backend . Services . Settings ;
97using Files . Shared . Enums ;
108using Microsoft . UI . Input ;
119using Microsoft . UI . Xaml ;
1412using Microsoft . UI . Xaml . Media ;
1513using Microsoft . UI . Xaml . Navigation ;
1614using System ;
15+ using System . IO ;
1716using System . Linq ;
1817using Windows . Storage ;
1918using 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