diff --git a/src/Files.App/Views/Layouts/DetailsLayoutPage.xaml.cs b/src/Files.App/Views/Layouts/DetailsLayoutPage.xaml.cs index 37ca9860a302..1fe68703eeec 100644 --- a/src/Files.App/Views/Layouts/DetailsLayoutPage.xaml.cs +++ b/src/Files.App/Views/Layouts/DetailsLayoutPage.xaml.cs @@ -458,8 +458,8 @@ protected override async void FileList_PreviewKeyDown(object sender, KeyRoutedEv if (ctrlPressed && !shiftPressed) { - var folders = ParentShellPageInstance?.SlimContentPage.SelectedItems?.Where(file => file.PrimaryItemAttribute == StorageItemTypes.Folder); - if (folders is not null) + var folders = SelectedItems?.Where(file => file.PrimaryItemAttribute == StorageItemTypes.Folder); + if (folders?.Any() ?? false) { foreach (ListedItem folder in folders) await NavigationHelpers.OpenPathInNewTab(folder.ItemPath); @@ -467,9 +467,19 @@ protected override async void FileList_PreviewKeyDown(object sender, KeyRoutedEv } else if (ctrlPressed && shiftPressed) { - var selectedFolder = SelectedItems?.FirstOrDefault(item => item.PrimaryItemAttribute == StorageItemTypes.Folder); - if (selectedFolder is not null) - NavigationHelpers.OpenInSecondaryPane(ParentShellPageInstance, selectedFolder); + var selectedFolders = SelectedItems?.Where(item => item.PrimaryItemAttribute == StorageItemTypes.Folder); + if (selectedFolders?.Count() == 1) + { + NavigationHelpers.OpenInSecondaryPane(ParentShellPageInstance, selectedFolders.First()); + } + } + else if (!ctrlPressed && !shiftPressed && !UserSettingsService.FoldersSettingsService.OpenItemsWithOneClick) + { + if (SelectedItems?.Any() ?? false) + { + foreach (var selectedItem in SelectedItems) + await OpenItem(selectedItem); + } } } else if (e.Key == VirtualKey.Enter && e.KeyStatus.IsMenuKeyDown) @@ -607,12 +617,34 @@ clickedItem is Microsoft.UI.Xaml.Shapes.Rectangle } } + private async Task OpenItem(ListedItem item) + { + if (!Commands.OpenItem.IsExecutable) + { + // Fallback if the command is not executable. It occurs only when search is performed from the columns view. + var itemType = item.PrimaryItemAttribute == StorageItemTypes.Folder ? FilesystemItemType.Directory : FilesystemItemType.File; + await NavigationHelpers.OpenPath(item.ItemPath, ParentShellPageInstance, itemType); + } + else + { + await Commands.OpenItem.ExecuteAsync(); + } + } + private async void FileList_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e) { // Skip opening selected items if the double tap doesn't capture an item - if ((e.OriginalSource as FrameworkElement)?.DataContext is ListedItem item && !UserSettingsService.FoldersSettingsService.OpenItemsWithOneClick) - await Commands.OpenItem.ExecuteAsync(); - else if ((e.OriginalSource as FrameworkElement)?.DataContext is not ListedItem && UserSettingsService.FoldersSettingsService.DoubleClickToGoUp) + var originalElement = e.OriginalSource as FrameworkElement; + var dataContext = originalElement?.DataContext; + + // Try to get the item from DataContext or from sender (ListView) + ListedItem? item = dataContext as ListedItem; + if (item == null && sender is ListView listView && listView.SelectedItem is ListedItem selectedItem) + item = selectedItem; + + if (item != null && !UserSettingsService.FoldersSettingsService.OpenItemsWithOneClick) + await OpenItem(item); + else if (item == null && UserSettingsService.FoldersSettingsService.DoubleClickToGoUp) await Commands.NavigateUp.ExecuteAsync(); ResetRenameDoubleClick(); diff --git a/src/Files.App/Views/Shells/ColumnShellPage.xaml.cs b/src/Files.App/Views/Shells/ColumnShellPage.xaml.cs index 1610d58ff0e0..84cc26f16e1a 100644 --- a/src/Files.App/Views/Shells/ColumnShellPage.xaml.cs +++ b/src/Files.App/Views/Shells/ColumnShellPage.xaml.cs @@ -4,6 +4,7 @@ using CommunityToolkit.WinUI; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Media.Animation; using Microsoft.UI.Xaml.Navigation; namespace Files.App.Views.Shells @@ -185,7 +186,37 @@ public override void NavigateToPath(string navigationPath, Type sourcePageType, if (string.IsNullOrEmpty(navigationPath)) return; - this.FindAscendant()?.SetSelectedPathOrNavigate(navigationPath, sourcePageType, navArgs); + var columnsLayoutPage = this.FindAscendant(); + if (columnsLayoutPage != null) + { + columnsLayoutPage.SetSelectedPathOrNavigate(navigationPath, sourcePageType, navArgs); + } + else + { + if (sourcePageType is null) + sourcePageType = InstanceViewModel.FolderSettings.GetLayoutType(navigationPath); + + if (navArgs is not null && navArgs.AssociatedTabInstance is not null) + { + ItemDisplayFrame.Navigate( + sourcePageType, + navArgs, + new SuppressNavigationTransitionInfo()); + } + else + { + var newNavArgs = new NavigationArguments() + { + NavPathParam = navigationPath, + AssociatedTabInstance = this + }; + + ItemDisplayFrame.Navigate( + sourcePageType, + newNavArgs, + new SuppressNavigationTransitionInfo()); + } + } } public override void NavigateHome()