diff --git a/src/Files.App/Views/Layouts/BaseLayoutPage.cs b/src/Files.App/Views/Layouts/BaseLayoutPage.cs index 1813284d66cb..8d5c6acb7f09 100644 --- a/src/Files.App/Views/Layouts/BaseLayoutPage.cs +++ b/src/Files.App/Views/Layouts/BaseLayoutPage.cs @@ -216,14 +216,31 @@ public string JumpString } } + private bool isSelectedItemsSorted = false; private List? selectedItems = []; public List? SelectedItems { - get => selectedItems; + get + { + if (!isSelectedItemsSorted) + { + var orderedItems = SortingHelper.OrderFileList(selectedItems, FolderSettings.DirectorySortOption, FolderSettings.DirectorySortDirection, FolderSettings.SortDirectoriesAlongsideFiles, FolderSettings.SortFilesFirst).ToList(); + selectedItems = orderedItems; + isSelectedItemsSorted = true; + } + + return SelectedItem is null || !selectedItems!.Contains(SelectedItem) + ? selectedItems + : selectedItems + .SkipWhile(x => x != SelectedItem) + .Concat(selectedItems.TakeWhile(x => x != SelectedItem)) + .ToList(); + } internal set { if (value != selectedItems) { + isSelectedItemsSorted = false; selectedItems = value; if (selectedItems?.Count == 0 || selectedItems?[0] is null) @@ -261,7 +278,6 @@ internal set NotifyPropertyChanged(nameof(SelectedItems)); } - ParentShellPageInstance!.ToolbarViewModel.SelectedItems = value; } } @@ -971,7 +987,12 @@ protected virtual void FileList_DragItemsStarting(object sender, DragItemsStarti { try { - var shellItemList = SafetyExtensions.IgnoreExceptions(() => e.Items.OfType().Select(x => new VanaraWindowsShell.ShellItem(x.ItemPath)).ToArray()); + var itemList = e.Items.OfType().ToList(); + var firstItem = itemList.FirstOrDefault(); + var sortedItems = SortingHelper.OrderFileList(itemList, FolderSettings.DirectorySortOption, FolderSettings.DirectorySortDirection, FolderSettings.SortDirectoriesAlongsideFiles, FolderSettings.SortFilesFirst).ToList(); + var orderedItems = sortedItems.SkipWhile(x => x != firstItem).Concat(sortedItems.TakeWhile(x => x != firstItem)).ToList(); + + var shellItemList = SafetyExtensions.IgnoreExceptions(() => orderedItems.Select(x => new VanaraWindowsShell.ShellItem(x.ItemPath)).ToArray()); if (shellItemList?[0].FileSystemPath is not null && !InstanceViewModel.IsPageTypeSearchResults) { var iddo = shellItemList[0].Parent.GetChildrenUIObjects(HWND.NULL, shellItemList); @@ -987,7 +1008,7 @@ protected virtual void FileList_DragItemsStarting(object sender, DragItemsStarti else { // Only support IStorageItem capable paths - var storageItemList = e.Items.OfType().Where(x => !(x.IsHiddenItem && x.IsLinkItem && x.IsRecycleBinItem && x.IsShortcut)).Select(x => VirtualStorageItem.FromListedItem(x)); + var storageItemList = orderedItems.Where(x => !(x.IsHiddenItem && x.IsLinkItem && x.IsRecycleBinItem && x.IsShortcut)).Select(x => VirtualStorageItem.FromListedItem(x)); e.Data.SetStorageItems(storageItemList, false); } } @@ -1176,19 +1197,26 @@ private void RefreshItem(SelectorItem container, object item, bool inRecycleQueu } } - protected static void FileListItem_PointerPressed(object sender, PointerRoutedEventArgs e) + protected internal void FileListItem_PointerPressed(object sender, PointerRoutedEventArgs e) { if (sender is not SelectorItem selectorItem) return; - if (selectorItem.IsSelected && e.KeyModifiers == VirtualKeyModifiers.Control) + if (selectorItem.IsSelected) { - selectorItem.IsSelected = false; + if (e.KeyModifiers == VirtualKeyModifiers.Control) + { + selectorItem.IsSelected = false; - // Prevent issues arising caused by the default handlers attempting to select the item that has just been deselected by ctrl + click - e.Handled = true; + // Prevent issues arising caused by the default handlers attempting to select the item that has just been deselected by ctrl + click + e.Handled = true; + } + else + { + SelectedItem = GetItemFromElement(sender); + } } - else if (!selectorItem.IsSelected && e.GetCurrentPoint(selectorItem).Properties.IsLeftButtonPressed) + else if (e.GetCurrentPoint(selectorItem).Properties.IsLeftButtonPressed) { selectorItem.IsSelected = true; }