@@ -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