1919using Windows . Storage ;
2020using Windows . System ;
2121using Windows . UI . Core ;
22+ using DispatcherQueueTimer = Microsoft . UI . Dispatching . DispatcherQueueTimer ;
2223using static Files . App . Constants ;
24+ using Microsoft . UI . Dispatching ;
2325
2426namespace 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 > ( ) ;
0 commit comments