@@ -239,8 +239,9 @@ await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
239239 if ( e . Reset )
240240 {
241241 // Find the intersection between the two lists and determine whether to remove or add
242- var itemsToRemove = ItemsAdded . Where ( x => ! e . Paths . Contains ( x . Path ) ) . ToList ( ) ;
243- var itemsToAdd = e . Paths . Where ( x => ! ItemsAdded . Any ( y => y . Path == x ) ) . ToList ( ) ;
242+ var originalItemsAdded = ItemsAdded . ToList ( ) ;
243+ var itemsToRemove = originalItemsAdded . Where ( x => ! e . Paths . Contains ( x . Path ) ) ;
244+ var itemsToAdd = e . Paths . Where ( x => ! originalItemsAdded . Any ( y => y . Path == x ) ) ;
244245
245246 // Remove items
246247 foreach ( var itemToRemove in itemsToRemove )
@@ -249,13 +250,14 @@ await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
249250 // Add items
250251 foreach ( var itemToAdd in itemsToAdd )
251252 {
253+ var interimItemsAdded = ItemsAdded . ToList ( ) ;
252254 var item = await App . QuickAccessManager . Model . CreateLocationItemFromPathAsync ( itemToAdd ) ;
253- var lastIndex = ItemsAdded . IndexOf ( ItemsAdded . FirstOrDefault ( x => ! x . IsPinned ) ) ;
255+ var lastIndex = ItemsAdded . IndexOf ( interimItemsAdded . FirstOrDefault ( x => ! x . IsPinned ) ) ;
254256 var isPinned = ( bool ? ) e . Items . Where ( x => x . FilePath == itemToAdd ) . FirstOrDefault ( ) ? . Properties [ "System.Home.IsPinned" ] ?? false ;
255- if ( ItemsAdded . Any ( x => x . Path == itemToAdd ) )
257+ if ( interimItemsAdded . Any ( x => x . Path == itemToAdd ) )
256258 continue ;
257259
258- ItemsAdded . Insert ( isPinned && lastIndex >= 0 ? lastIndex : ItemsAdded . Count , new FolderCardItem ( item , Path . GetFileName ( item . Text ) , isPinned )
260+ ItemsAdded . Insert ( isPinned && lastIndex >= 0 ? Math . Min ( lastIndex , ItemsAdded . Count ) : ItemsAdded . Count , new FolderCardItem ( item , Path . GetFileName ( item . Text ) , isPinned )
259261 {
260262 Path = item . Path ,
261263 } ) ;
@@ -266,18 +268,19 @@ await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
266268 if ( e . Reorder )
267269 {
268270 // Remove pinned items
269- foreach ( var itemToRemove in ItemsAdded . Where ( x => x . IsPinned ) . ToList ( ) )
271+ foreach ( var itemToRemove in ItemsAdded . ToList ( ) . Where ( x => x . IsPinned ) )
270272 ItemsAdded . Remove ( itemToRemove ) ;
271273
272274 // Add pinned items in the new order
273275 foreach ( var itemToAdd in e . Paths )
274276 {
277+ var interimItemsAdded = ItemsAdded . ToList ( ) ;
275278 var item = await App . QuickAccessManager . Model . CreateLocationItemFromPathAsync ( itemToAdd ) ;
276- var lastIndex = ItemsAdded . IndexOf ( ItemsAdded . FirstOrDefault ( x => ! x . IsPinned ) ) ;
277- if ( ItemsAdded . Any ( x => x . Path == itemToAdd ) )
279+ var lastIndex = ItemsAdded . IndexOf ( interimItemsAdded . FirstOrDefault ( x => ! x . IsPinned ) ) ;
280+ if ( interimItemsAdded . Any ( x => x . Path == itemToAdd ) )
278281 continue ;
279282
280- ItemsAdded . Insert ( lastIndex >= 0 ? lastIndex : ItemsAdded . Count , new FolderCardItem ( item , Path . GetFileName ( item . Text ) , true )
283+ ItemsAdded . Insert ( lastIndex >= 0 ? Math . Min ( lastIndex , ItemsAdded . Count ) : ItemsAdded . Count , new FolderCardItem ( item , Path . GetFileName ( item . Text ) , true )
281284 {
282285 Path = item . Path ,
283286 } ) ;
@@ -289,18 +292,19 @@ await DispatcherQueue.EnqueueOrInvokeAsync(async () =>
289292 {
290293 foreach ( var itemToAdd in e . Paths )
291294 {
295+ var interimItemsAdded = ItemsAdded . ToList ( ) ;
292296 var item = await App . QuickAccessManager . Model . CreateLocationItemFromPathAsync ( itemToAdd ) ;
293- var lastIndex = ItemsAdded . IndexOf ( ItemsAdded . FirstOrDefault ( x => ! x . IsPinned ) ) ;
294- if ( ItemsAdded . Any ( x => x . Path == itemToAdd ) )
297+ var lastIndex = ItemsAdded . IndexOf ( interimItemsAdded . FirstOrDefault ( x => ! x . IsPinned ) ) ;
298+ if ( interimItemsAdded . Any ( x => x . Path == itemToAdd ) )
295299 continue ;
296- ItemsAdded . Insert ( e . Pin && lastIndex >= 0 ? lastIndex : ItemsAdded . Count , new FolderCardItem ( item , Path . GetFileName ( item . Text ) , e . Pin ) // Add just after the Recent Folders
300+ ItemsAdded . Insert ( e . Pin && lastIndex >= 0 ? Math . Min ( lastIndex , ItemsAdded . Count ) : ItemsAdded . Count , new FolderCardItem ( item , Path . GetFileName ( item . Text ) , e . Pin ) // Add just after the Recent Folders
297301 {
298302 Path = item . Path ,
299303 } ) ;
300304 }
301305 }
302306 else
303- foreach ( var itemToRemove in ItemsAdded . Where ( x => e . Paths . Contains ( x . Path ) ) . ToList ( ) )
307+ foreach ( var itemToRemove in ItemsAdded . ToList ( ) . Where ( x => e . Paths . Contains ( x . Path ) ) )
304308 ItemsAdded . Remove ( itemToRemove ) ;
305309 } ) ;
306310 }
@@ -389,7 +393,7 @@ public override async Task PinToFavoritesAsync(WidgetCardItem item)
389393 var items = ( await QuickAccessService . GetPinnedFoldersAsync ( ) )
390394 . Where ( link => ! ( ( bool ? ) link . Properties [ "System.Home.IsPinned" ] ?? false ) ) ;
391395
392- var recentItem = items . Where ( x => ! ItemsAdded . Select ( y => y . Path ) . Contains ( x . FilePath ) ) . FirstOrDefault ( ) ;
396+ var recentItem = items . Where ( x => ! ItemsAdded . ToList ( ) . Select ( y => y . Path ) . Contains ( x . FilePath ) ) . FirstOrDefault ( ) ;
393397 if ( recentItem is not null )
394398 {
395399 ModifyItemAsync ( this , new ModifyQuickAccessEventArgs ( new [ ] { recentItem . FilePath } , true )
0 commit comments