From 845a5d5b71dacf241b3e543c3556ba10a7d37f70 Mon Sep 17 00:00:00 2001 From: Qin-shihuang <0.0@owo.li> Date: Sun, 28 Jul 2024 13:04:57 +0800 Subject: [PATCH 1/6] Fix: Fixed the wrong order of files when they are opened or dropped --- src/Files.App/Views/Layouts/BaseLayoutPage.cs | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/Files.App/Views/Layouts/BaseLayoutPage.cs b/src/Files.App/Views/Layouts/BaseLayoutPage.cs index 1813284d66cb..7e1bd193d550 100644 --- a/src/Files.App/Views/Layouts/BaseLayoutPage.cs +++ b/src/Files.App/Views/Layouts/BaseLayoutPage.cs @@ -66,6 +66,7 @@ public abstract class BaseLayoutPage : Page, IBaseLayoutPage, INotifyPropertyCha private bool shiftPressed; + private ListedItem? clickedItem = null; private ListedItem? dragOverItem = null; private ListedItem? hoveredItem = null; private ListedItem? preRenamingItem = null; @@ -216,14 +217,27 @@ 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; + } + if (clickedItem is null || !selectedItems!.Contains(clickedItem)) + return selectedItems; + return selectedItems.SkipWhile(x => x != clickedItem).Concat(selectedItems.TakeWhile(x => x != clickedItem)).ToList(); + } internal set { + clickedItem = null; if (value != selectedItems) { + isSelectedItemsSorted = false; selectedItems = value; if (selectedItems?.Count == 0 || selectedItems?[0] is null) @@ -971,7 +985,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 +1006,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,11 +1195,11 @@ 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; - + clickedItem = GetItemFromElement(sender); if (selectorItem.IsSelected && e.KeyModifiers == VirtualKeyModifiers.Control) { selectorItem.IsSelected = false; From a56cb33c80e2129d59ccc7e639ea9e10b8b54589 Mon Sep 17 00:00:00 2001 From: Qin-shihuang <0.0@owo.li> Date: Tue, 30 Jul 2024 11:39:26 +0800 Subject: [PATCH 2/6] Apply suggestions from code review - Codestyle Co-authored-by: hishitetsu <66369541+hishitetsu@users.noreply.github.com> --- src/Files.App/Views/Layouts/BaseLayoutPage.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Files.App/Views/Layouts/BaseLayoutPage.cs b/src/Files.App/Views/Layouts/BaseLayoutPage.cs index 7e1bd193d550..345516a9b53f 100644 --- a/src/Files.App/Views/Layouts/BaseLayoutPage.cs +++ b/src/Files.App/Views/Layouts/BaseLayoutPage.cs @@ -230,7 +230,8 @@ public List? SelectedItems } if (clickedItem is null || !selectedItems!.Contains(clickedItem)) return selectedItems; - return selectedItems.SkipWhile(x => x != clickedItem).Concat(selectedItems.TakeWhile(x => x != clickedItem)).ToList(); + else + return selectedItems.SkipWhile(x => x != clickedItem).Concat(selectedItems.TakeWhile(x => x != clickedItem)).ToList(); } internal set { @@ -1199,6 +1200,7 @@ protected internal void FileListItem_PointerPressed(object sender, PointerRouted { if (sender is not SelectorItem selectorItem) return; + clickedItem = GetItemFromElement(sender); if (selectorItem.IsSelected && e.KeyModifiers == VirtualKeyModifiers.Control) { From 91ed72935d059e7ac5448b892080030a9149d778 Mon Sep 17 00:00:00 2001 From: Qin-shihuang <0.0@owo.li> Date: Tue, 30 Jul 2024 12:13:47 +0800 Subject: [PATCH 3/6] Merge `clickedItem` into `SelectedItem` --- src/Files.App/Views/Layouts/BaseLayoutPage.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Files.App/Views/Layouts/BaseLayoutPage.cs b/src/Files.App/Views/Layouts/BaseLayoutPage.cs index 345516a9b53f..161de0e54f21 100644 --- a/src/Files.App/Views/Layouts/BaseLayoutPage.cs +++ b/src/Files.App/Views/Layouts/BaseLayoutPage.cs @@ -66,7 +66,6 @@ public abstract class BaseLayoutPage : Page, IBaseLayoutPage, INotifyPropertyCha private bool shiftPressed; - private ListedItem? clickedItem = null; private ListedItem? dragOverItem = null; private ListedItem? hoveredItem = null; private ListedItem? preRenamingItem = null; @@ -228,14 +227,13 @@ public List? SelectedItems selectedItems = orderedItems; isSelectedItemsSorted = true; } - if (clickedItem is null || !selectedItems!.Contains(clickedItem)) + if (SelectedItem is null || !selectedItems!.Contains(SelectedItem)) return selectedItems; else - return selectedItems.SkipWhile(x => x != clickedItem).Concat(selectedItems.TakeWhile(x => x != clickedItem)).ToList(); + return selectedItems.SkipWhile(x => x != SelectedItem).Concat(selectedItems.TakeWhile(x => x != SelectedItem)).ToList(); } internal set { - clickedItem = null; if (value != selectedItems) { isSelectedItemsSorted = false; @@ -276,7 +274,7 @@ internal set NotifyPropertyChanged(nameof(SelectedItems)); } - + ParentShellPageInstance!.ToolbarViewModel.SelectedItems = value; } } @@ -1201,7 +1199,7 @@ protected internal void FileListItem_PointerPressed(object sender, PointerRouted if (sender is not SelectorItem selectorItem) return; - clickedItem = GetItemFromElement(sender); + SelectedItem = GetItemFromElement(sender); if (selectorItem.IsSelected && e.KeyModifiers == VirtualKeyModifiers.Control) { selectorItem.IsSelected = false; From a70800009ab5fc97318f2fd45f12fd7516f27aa2 Mon Sep 17 00:00:00 2001 From: Qin-shihuang <0.0@owo.li> Date: Tue, 30 Jul 2024 13:36:09 +0800 Subject: [PATCH 4/6] Apply suggestions from code review - Codestyle Co-authored-by: 0x5BFA <62196528+0x5bfa@users.noreply.github.com> --- src/Files.App/Views/Layouts/BaseLayoutPage.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/Files.App/Views/Layouts/BaseLayoutPage.cs b/src/Files.App/Views/Layouts/BaseLayoutPage.cs index 161de0e54f21..3f88cda955f3 100644 --- a/src/Files.App/Views/Layouts/BaseLayoutPage.cs +++ b/src/Files.App/Views/Layouts/BaseLayoutPage.cs @@ -220,17 +220,21 @@ public string JumpString private List? selectedItems = []; public List? SelectedItems { - get { + get + { if (!isSelectedItemsSorted) { var orderedItems = SortingHelper.OrderFileList(selectedItems, FolderSettings.DirectorySortOption, FolderSettings.DirectorySortDirection, FolderSettings.SortDirectoriesAlongsideFiles, FolderSettings.SortFilesFirst).ToList(); selectedItems = orderedItems; isSelectedItemsSorted = true; } - if (SelectedItem is null || !selectedItems!.Contains(SelectedItem)) - return selectedItems; - else - return selectedItems.SkipWhile(x => x != SelectedItem).Concat(selectedItems.TakeWhile(x => x != SelectedItem)).ToList(); + + return SelectedItem is null || !selectedItems!.Contains(SelectedItem) + ? selectedItems + : selectedItems + .SkipWhile(x => x != SelectedItem) + .Concat(selectedItems.TakeWhile(x => x != SelectedItem)) + .ToList(); } internal set { @@ -274,7 +278,6 @@ internal set NotifyPropertyChanged(nameof(SelectedItems)); } - ParentShellPageInstance!.ToolbarViewModel.SelectedItems = value; } } @@ -1194,7 +1197,7 @@ private void RefreshItem(SelectorItem container, object item, bool inRecycleQueu } } - protected internal void FileListItem_PointerPressed(object sender, PointerRoutedEventArgs e) + protected void FileListItem_PointerPressed(object sender, PointerRoutedEventArgs e) { if (sender is not SelectorItem selectorItem) return; From 79420662b9dfb9a6933e29f2d7d059718de5adb2 Mon Sep 17 00:00:00 2001 From: Qin-shihuang <0.0@owo.li> Date: Tue, 30 Jul 2024 13:50:04 +0800 Subject: [PATCH 5/6] move `internal` back --- src/Files.App/Views/Layouts/BaseLayoutPage.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Files.App/Views/Layouts/BaseLayoutPage.cs b/src/Files.App/Views/Layouts/BaseLayoutPage.cs index 3f88cda955f3..c064e095d8b9 100644 --- a/src/Files.App/Views/Layouts/BaseLayoutPage.cs +++ b/src/Files.App/Views/Layouts/BaseLayoutPage.cs @@ -1197,7 +1197,7 @@ private void RefreshItem(SelectorItem container, object item, bool inRecycleQueu } } - protected void FileListItem_PointerPressed(object sender, PointerRoutedEventArgs e) + protected internal void FileListItem_PointerPressed(object sender, PointerRoutedEventArgs e) { if (sender is not SelectorItem selectorItem) return; From ac80d9615fa6c812a3b2f5f3cc58d2fd41084f08 Mon Sep 17 00:00:00 2001 From: Qin-shihuang <0.0@owo.li> Date: Tue, 30 Jul 2024 17:58:37 +0800 Subject: [PATCH 6/6] Better item selection logic --- src/Files.App/Views/Layouts/BaseLayoutPage.cs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Files.App/Views/Layouts/BaseLayoutPage.cs b/src/Files.App/Views/Layouts/BaseLayoutPage.cs index c064e095d8b9..8d5c6acb7f09 100644 --- a/src/Files.App/Views/Layouts/BaseLayoutPage.cs +++ b/src/Files.App/Views/Layouts/BaseLayoutPage.cs @@ -1202,15 +1202,21 @@ protected internal void FileListItem_PointerPressed(object sender, PointerRouted if (sender is not SelectorItem selectorItem) return; - SelectedItem = GetItemFromElement(sender); - 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; }