Skip to content

Commit 5795bb6

Browse files
el-evhishitetsu0x5bfa
authored
Fix: Fixed an issue where dragging or opening multiple items would use the wrong sort mode (#15885)
Co-authored-by: hishitetsu <[email protected]> Co-authored-by: 0x5BFA <[email protected]>
1 parent 23010e8 commit 5795bb6

File tree

1 file changed

+38
-10
lines changed

1 file changed

+38
-10
lines changed

src/Files.App/Views/Layouts/BaseLayoutPage.cs

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -216,14 +216,31 @@ public string JumpString
216216
}
217217
}
218218

219+
private bool isSelectedItemsSorted = false;
219220
private List<ListedItem>? selectedItems = [];
220221
public List<ListedItem>? SelectedItems
221222
{
222-
get => selectedItems;
223+
get
224+
{
225+
if (!isSelectedItemsSorted)
226+
{
227+
var orderedItems = SortingHelper.OrderFileList(selectedItems, FolderSettings.DirectorySortOption, FolderSettings.DirectorySortDirection, FolderSettings.SortDirectoriesAlongsideFiles, FolderSettings.SortFilesFirst).ToList();
228+
selectedItems = orderedItems;
229+
isSelectedItemsSorted = true;
230+
}
231+
232+
return SelectedItem is null || !selectedItems!.Contains(SelectedItem)
233+
? selectedItems
234+
: selectedItems
235+
.SkipWhile(x => x != SelectedItem)
236+
.Concat(selectedItems.TakeWhile(x => x != SelectedItem))
237+
.ToList();
238+
}
223239
internal set
224240
{
225241
if (value != selectedItems)
226242
{
243+
isSelectedItemsSorted = false;
227244
selectedItems = value;
228245

229246
if (selectedItems?.Count == 0 || selectedItems?[0] is null)
@@ -261,7 +278,6 @@ internal set
261278

262279
NotifyPropertyChanged(nameof(SelectedItems));
263280
}
264-
265281
ParentShellPageInstance!.ToolbarViewModel.SelectedItems = value;
266282
}
267283
}
@@ -971,7 +987,12 @@ protected virtual void FileList_DragItemsStarting(object sender, DragItemsStarti
971987
{
972988
try
973989
{
974-
var shellItemList = SafetyExtensions.IgnoreExceptions(() => e.Items.OfType<ListedItem>().Select(x => new VanaraWindowsShell.ShellItem(x.ItemPath)).ToArray());
990+
var itemList = e.Items.OfType<ListedItem>().ToList();
991+
var firstItem = itemList.FirstOrDefault();
992+
var sortedItems = SortingHelper.OrderFileList(itemList, FolderSettings.DirectorySortOption, FolderSettings.DirectorySortDirection, FolderSettings.SortDirectoriesAlongsideFiles, FolderSettings.SortFilesFirst).ToList();
993+
var orderedItems = sortedItems.SkipWhile(x => x != firstItem).Concat(sortedItems.TakeWhile(x => x != firstItem)).ToList();
994+
995+
var shellItemList = SafetyExtensions.IgnoreExceptions(() => orderedItems.Select(x => new VanaraWindowsShell.ShellItem(x.ItemPath)).ToArray());
975996
if (shellItemList?[0].FileSystemPath is not null && !InstanceViewModel.IsPageTypeSearchResults)
976997
{
977998
var iddo = shellItemList[0].Parent.GetChildrenUIObjects<IDataObject>(HWND.NULL, shellItemList);
@@ -987,7 +1008,7 @@ protected virtual void FileList_DragItemsStarting(object sender, DragItemsStarti
9871008
else
9881009
{
9891010
// Only support IStorageItem capable paths
990-
var storageItemList = e.Items.OfType<ListedItem>().Where(x => !(x.IsHiddenItem && x.IsLinkItem && x.IsRecycleBinItem && x.IsShortcut)).Select(x => VirtualStorageItem.FromListedItem(x));
1011+
var storageItemList = orderedItems.Where(x => !(x.IsHiddenItem && x.IsLinkItem && x.IsRecycleBinItem && x.IsShortcut)).Select(x => VirtualStorageItem.FromListedItem(x));
9911012
e.Data.SetStorageItems(storageItemList, false);
9921013
}
9931014
}
@@ -1176,19 +1197,26 @@ private void RefreshItem(SelectorItem container, object item, bool inRecycleQueu
11761197
}
11771198
}
11781199

1179-
protected static void FileListItem_PointerPressed(object sender, PointerRoutedEventArgs e)
1200+
protected internal void FileListItem_PointerPressed(object sender, PointerRoutedEventArgs e)
11801201
{
11811202
if (sender is not SelectorItem selectorItem)
11821203
return;
11831204

1184-
if (selectorItem.IsSelected && e.KeyModifiers == VirtualKeyModifiers.Control)
1205+
if (selectorItem.IsSelected)
11851206
{
1186-
selectorItem.IsSelected = false;
1207+
if (e.KeyModifiers == VirtualKeyModifiers.Control)
1208+
{
1209+
selectorItem.IsSelected = false;
11871210

1188-
// Prevent issues arising caused by the default handlers attempting to select the item that has just been deselected by ctrl + click
1189-
e.Handled = true;
1211+
// Prevent issues arising caused by the default handlers attempting to select the item that has just been deselected by ctrl + click
1212+
e.Handled = true;
1213+
}
1214+
else
1215+
{
1216+
SelectedItem = GetItemFromElement(sender);
1217+
}
11901218
}
1191-
else if (!selectorItem.IsSelected && e.GetCurrentPoint(selectorItem).Properties.IsLeftButtonPressed)
1219+
else if (e.GetCurrentPoint(selectorItem).Properties.IsLeftButtonPressed)
11921220
{
11931221
selectorItem.IsSelected = true;
11941222
}

0 commit comments

Comments
 (0)