Skip to content

Commit 34e6fb7

Browse files
authored
Fix: Fixed COMException in HandleLocationItemDroppedAsync (#14680)
1 parent 9914ebb commit 34e6fb7

File tree

4 files changed

+37
-62
lines changed

4 files changed

+37
-62
lines changed

src/Files.App/UserControls/SideBar/ISideBarViewModel.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,15 @@ public interface ISidebarViewModel
3131
/// Gets invoked when an item drags over any item of the sidebar.
3232
/// </summary>
3333
/// <param name="args">The <see cref="ItemDragOverEventArgs"/> for this event.</param>
34-
void HandleItemDragOverAsync(ItemDragOverEventArgs args);
34+
/// <returns>A <see cref="Task"/> that represents the asynchronous operation.</returns>
35+
Task HandleItemDragOverAsync(ItemDragOverEventArgs args);
3536

3637
/// <summary>
3738
/// Gets invoked when an item is dropped on any item of the sidebar.
3839
/// </summary>
3940
/// <param name="args">The <see cref="ItemDroppedEventArgs"/> for this event.</param>
40-
void HandleItemDroppedAsync(ItemDroppedEventArgs args);
41+
/// <returns>A <see cref="Task"/> that represents the asynchronous operation.</returns>
42+
Task HandleItemDroppedAsync(ItemDroppedEventArgs args);
4143

4244
/// <summary>
4345
/// Gets invoked when an item is invoked (double clicked) on any item of the sidebar.

src/Files.App/UserControls/SideBar/SideBarItem.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ private void Item_PointerReleased(object sender, Microsoft.UI.Xaml.Input.Pointer
386386
}
387387
}
388388

389-
private void ItemGrid_DragOver(object sender, DragEventArgs e)
389+
private async void ItemGrid_DragOver(object sender, DragEventArgs e)
390390
{
391391
if (HasChildren)
392392
{
@@ -407,7 +407,12 @@ private void ItemGrid_DragOver(object sender, DragEventArgs e)
407407
VisualStateManager.GoToState(this, "DragInsertBelow", true);
408408
}
409409

410-
Owner?.RaiseItemDragOver(this, insertsAbove, e);
410+
if (Owner is not null)
411+
{
412+
var deferral = e.GetDeferral();
413+
await Owner.RaiseItemDragOver(this, insertsAbove, e);
414+
deferral.Complete();
415+
}
411416
}
412417

413418
private void ItemGrid_ContextRequested(UIElement sender, Microsoft.UI.Xaml.Input.ContextRequestedEventArgs args)
@@ -421,10 +426,15 @@ private void ItemGrid_DragLeave(object sender, DragEventArgs e)
421426
UpdatePointerState();
422427
}
423428

424-
private void ItemGrid_Drop(object sender, DragEventArgs e)
429+
private async void ItemGrid_Drop(object sender, DragEventArgs e)
425430
{
426431
UpdatePointerState();
427-
Owner?.RaiseItemDropped(this, DetermineDropTargetPosition(e), e);
432+
if (Owner is not null)
433+
{
434+
var deferral = e.GetDeferral();
435+
await Owner.RaiseItemDropped(this, DetermineDropTargetPosition(e), e);
436+
deferral.Complete();
437+
}
428438
}
429439

430440
private SidebarItemDropPosition DetermineDropTargetPosition(DragEventArgs args)

src/Files.App/UserControls/SideBar/SideBarView.xaml.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ public sealed partial class SidebarView : UserControl, INotifyPropertyChanged
1818

1919
private const double COMPACT_MAX_WIDTH = 200;
2020

21-
public event EventHandler<ItemDroppedEventArgs>? ItemDropped;
22-
public event EventHandler<ItemDragOverEventArgs>? ItemDragOver;
2321
public event EventHandler<object>? ItemInvoked;
2422
public event EventHandler<ItemContextInvokedArgs>? ItemContextInvoked;
2523
public event PropertyChangedEventHandler? PropertyChanged;
@@ -55,18 +53,16 @@ internal void RaiseContextRequested(SidebarItem item, Point e)
5553
ViewModel.HandleItemContextInvokedAsync(item, new ItemContextInvokedArgs(item.Item, e));
5654
}
5755

58-
internal void RaiseItemDropped(SidebarItem sideBarItem, SidebarItemDropPosition dropPosition, DragEventArgs rawEvent)
56+
internal async Task RaiseItemDropped(SidebarItem sideBarItem, SidebarItemDropPosition dropPosition, DragEventArgs rawEvent)
5957
{
6058
if (sideBarItem.Item is null) return;
61-
ItemDropped?.Invoke(sideBarItem, new ItemDroppedEventArgs(sideBarItem.Item, rawEvent.DataView, dropPosition, rawEvent));
62-
ViewModel.HandleItemDroppedAsync(new ItemDroppedEventArgs(sideBarItem.Item, rawEvent.DataView, dropPosition, rawEvent));
59+
await ViewModel.HandleItemDroppedAsync(new ItemDroppedEventArgs(sideBarItem.Item, rawEvent.DataView, dropPosition, rawEvent));
6360
}
6461

65-
internal void RaiseItemDragOver(SidebarItem sideBarItem, SidebarItemDropPosition dropPosition, DragEventArgs rawEvent)
62+
internal async Task RaiseItemDragOver(SidebarItem sideBarItem, SidebarItemDropPosition dropPosition, DragEventArgs rawEvent)
6663
{
6764
if (sideBarItem.Item is null) return;
68-
ItemDragOver?.Invoke(sideBarItem, new ItemDragOverEventArgs(sideBarItem.Item, rawEvent.DataView, dropPosition, rawEvent));
69-
ViewModel.HandleItemDragOverAsync(new ItemDragOverEventArgs(sideBarItem.Item, rawEvent.DataView, dropPosition, rawEvent));
65+
await ViewModel.HandleItemDragOverAsync(new ItemDragOverEventArgs(sideBarItem.Item, rawEvent.DataView, dropPosition, rawEvent));
7066
}
7167

7268
private void UpdateMinimalMode()

src/Files.App/ViewModels/UserControls/SidebarViewModel.cs

Lines changed: 15 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,26 +1077,19 @@ private List<ContextMenuFlyoutItemViewModel> GetLocationItemMenuItems(INavigatio
10771077
}.Where(x => x.ShowItem).ToList();
10781078
}
10791079

1080-
public async void HandleItemDragOverAsync(ItemDragOverEventArgs args)
1080+
public async Task HandleItemDragOverAsync(ItemDragOverEventArgs args)
10811081
{
10821082
if (args.DropTarget is LocationItem locationItem)
1083-
{
1084-
HandleLocationItemDragOverAsync(locationItem, args);
1085-
}
1083+
await HandleLocationItemDragOverAsync(locationItem, args);
10861084
else if (args.DropTarget is DriveItem driveItem)
1087-
{
1088-
HandleDriveItemDragOverAsync(driveItem, args);
1089-
}
1085+
await HandleDriveItemDragOverAsync(driveItem, args);
10901086
else if (args.DropTarget is FileTagItem fileTagItem)
1091-
{
1092-
HandleTagItemDragOverAsync(fileTagItem, args);
1093-
}
1087+
await HandleTagItemDragOverAsync(fileTagItem, args);
10941088
}
10951089

1096-
private async void HandleLocationItemDragOverAsync(LocationItem locationItem, ItemDragOverEventArgs args)
1090+
private async Task HandleLocationItemDragOverAsync(LocationItem locationItem, ItemDragOverEventArgs args)
10971091
{
10981092
var rawEvent = args.RawEvent;
1099-
var deferral = rawEvent.GetDeferral();
11001093

11011094
if (Utils.Storage.FilesystemHelpers.HasDraggedStorageItems(args.DroppedItem))
11021095
{
@@ -1173,16 +1166,13 @@ private async void HandleLocationItemDragOverAsync(LocationItem locationItem, It
11731166
CompleteDragEventArgs(rawEvent, captionText, operationType);
11741167
}
11751168
}
1176-
1177-
deferral.Complete();
11781169
}
11791170

1180-
private async void HandleDriveItemDragOverAsync(DriveItem driveItem, ItemDragOverEventArgs args)
1171+
private async Task HandleDriveItemDragOverAsync(DriveItem driveItem, ItemDragOverEventArgs args)
11811172
{
11821173
if (!Utils.Storage.FilesystemHelpers.HasDraggedStorageItems(args.DroppedItem))
11831174
return;
11841175

1185-
var deferral = args.RawEvent.GetDeferral();
11861176
args.RawEvent.Handled = true;
11871177

11881178
var storageItems = await Utils.Storage.FilesystemHelpers.GetDraggedStorageItems(args.DroppedItem);
@@ -1228,16 +1218,13 @@ private async void HandleDriveItemDragOverAsync(DriveItem driveItem, ItemDragOve
12281218
}
12291219
CompleteDragEventArgs(args.RawEvent, captionText, operationType);
12301220
}
1231-
1232-
deferral.Complete();
12331221
}
12341222

1235-
private async void HandleTagItemDragOverAsync(FileTagItem tagItem, ItemDragOverEventArgs args)
1223+
private async Task HandleTagItemDragOverAsync(FileTagItem tagItem, ItemDragOverEventArgs args)
12361224
{
12371225
if (!Utils.Storage.FilesystemHelpers.HasDraggedStorageItems(args.DroppedItem))
12381226
return;
12391227

1240-
var deferral = args.RawEvent.GetDeferral();
12411228
args.RawEvent.Handled = true;
12421229

12431230
var storageItems = await Utils.Storage.FilesystemHelpers.GetDraggedStorageItems(args.DroppedItem);
@@ -1252,32 +1239,23 @@ private async void HandleTagItemDragOverAsync(FileTagItem tagItem, ItemDragOverE
12521239
args.RawEvent.DragUIOverride.Caption = string.Format("LinkToFolderCaptionText".GetLocalizedResource(), tagItem.Text);
12531240
args.RawEvent.AcceptedOperation = DataPackageOperation.Link;
12541241
}
1255-
1256-
deferral.Complete();
12571242
}
12581243

12591244

1260-
public async void HandleItemDroppedAsync(ItemDroppedEventArgs args)
1245+
public async Task HandleItemDroppedAsync(ItemDroppedEventArgs args)
12611246
{
12621247
if (args.DropTarget is LocationItem locationItem)
1263-
{
1264-
HandleLocationItemDroppedAsync(locationItem, args);
1265-
}
1248+
await HandleLocationItemDroppedAsync(locationItem, args);
12661249
else if (args.DropTarget is DriveItem driveItem)
1267-
{
1268-
HandleDriveItemDroppedAsync(driveItem, args);
1269-
}
1250+
await HandleDriveItemDroppedAsync(driveItem, args);
12701251
else if (args.DropTarget is FileTagItem fileTagItem)
1271-
{
1272-
HandleTagItemDroppedAsync(fileTagItem, args);
1273-
}
1252+
await HandleTagItemDroppedAsync(fileTagItem, args);
12741253
}
12751254

1276-
private async void HandleLocationItemDroppedAsync(LocationItem locationItem, ItemDroppedEventArgs args)
1255+
private async Task HandleLocationItemDroppedAsync(LocationItem locationItem, ItemDroppedEventArgs args)
12771256
{
12781257
if (Utils.Storage.FilesystemHelpers.HasDraggedStorageItems(args.DroppedItem))
12791258
{
1280-
var deferral = args.RawEvent.GetDeferral();
12811259
if (string.IsNullOrEmpty(locationItem.Path) && SectionType.Favorites.Equals(locationItem.Section)) // Pin to Favorites section
12821260
{
12831261
var storageItems = await Utils.Storage.FilesystemHelpers.GetDraggedStorageItems(args.DroppedItem);
@@ -1291,24 +1269,16 @@ private async void HandleLocationItemDroppedAsync(LocationItem locationItem, Ite
12911269
{
12921270
await FilesystemHelpers.PerformOperationTypeAsync(args.RawEvent.AcceptedOperation, args.DroppedItem, locationItem.Path, false, true);
12931271
}
1294-
deferral.Complete();
12951272
}
12961273
}
12971274

1298-
private async void HandleDriveItemDroppedAsync(DriveItem driveItem, ItemDroppedEventArgs args)
1275+
private Task HandleDriveItemDroppedAsync(DriveItem driveItem, ItemDroppedEventArgs args)
12991276
{
1300-
var deferral = args.RawEvent.GetDeferral();
1301-
1302-
await FilesystemHelpers.PerformOperationTypeAsync(args.RawEvent.AcceptedOperation, args.RawEvent.DataView, driveItem.Path, false, true);
1303-
1304-
deferral.Complete();
1305-
await Task.Yield();
1277+
return FilesystemHelpers.PerformOperationTypeAsync(args.RawEvent.AcceptedOperation, args.RawEvent.DataView, driveItem.Path, false, true);
13061278
}
13071279

1308-
private async void HandleTagItemDroppedAsync(FileTagItem fileTagItem, ItemDroppedEventArgs args)
1280+
private async Task HandleTagItemDroppedAsync(FileTagItem fileTagItem, ItemDroppedEventArgs args)
13091281
{
1310-
var deferral = args.RawEvent.GetDeferral();
1311-
13121282
var storageItems = await Utils.Storage.FilesystemHelpers.GetDraggedStorageItems(args.DroppedItem);
13131283
foreach (var item in storageItems.Where(x => !string.IsNullOrEmpty(x.Path)))
13141284
{
@@ -1319,9 +1289,6 @@ private async void HandleTagItemDroppedAsync(FileTagItem fileTagItem, ItemDroppe
13191289
FileTags = new[] { fileTagItem.FileTag.Uid }
13201290
};
13211291
}
1322-
1323-
deferral.Complete();
1324-
await Task.Yield();
13251292
}
13261293

13271294
private static DragEventArgs CompleteDragEventArgs(DragEventArgs e, string captionText, DataPackageOperation operationType)

0 commit comments

Comments
 (0)