Skip to content

Commit 246ddac

Browse files
authored
Fix: Fixed COMException in ItemsAdded_CollectionChanged (#14439)
1 parent d2e8980 commit 246ddac

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed

src/Files.App/UserControls/Widgets/QuickAccessWidget.xaml.cs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)