Skip to content

Commit 14bde3d

Browse files
authored
Fix: Fixed issue where dragged items sometimes could not be dropped (#12898)
1 parent 184882e commit 14bde3d

File tree

1 file changed

+34
-28
lines changed

1 file changed

+34
-28
lines changed

src/Files.App/Views/LayoutModes/BaseLayout.cs

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// Licensed under the MIT License. See the LICENSE.
33

44
using CommunityToolkit.WinUI.UI;
5-
using Files.App.Utils.StorageItems;
65
using Files.App.Helpers.ContextFlyouts;
76
using Files.App.UserControls.Menus;
87
using Microsoft.UI.Xaml;
@@ -35,6 +34,8 @@ public abstract class BaseLayout : Page, IBaseLayout, INotifyPropertyChanged
3534
{
3635
private readonly DispatcherQueueTimer jumpTimer;
3736

37+
private readonly DragEventHandler Item_DragOverEventHandler;
38+
3839
protected IUserSettingsService UserSettingsService { get; } = Ioc.Default.GetService<IUserSettingsService>()!;
3940

4041
protected IFileTagsSettingsService FileTagsSettingsService { get; } = Ioc.Default.GetService<IFileTagsSettingsService>()!;
@@ -263,6 +264,8 @@ public BaseLayout()
263264
jumpTimer.Interval = TimeSpan.FromSeconds(0.8);
264265
jumpTimer.Tick += JumpTimer_Tick;
265266

267+
Item_DragOverEventHandler = new DragEventHandler(Item_DragOver);
268+
266269
SelectedItemsPropertiesViewModel = new SelectedItemsPropertiesViewModel();
267270
DirectoryPropertiesViewModel = new DirectoryPropertiesViewModel();
268271

@@ -944,7 +947,7 @@ private void Item_DragLeave(object sender, DragEventArgs e)
944947
dragOverItem = null;
945948
}
946949

947-
protected async void Item_DragOver(object sender, DragEventArgs e)
950+
private async void Item_DragOver(object sender, DragEventArgs e)
948951
{
949952
var item = GetItemFromElement(sender);
950953
if (item is null)
@@ -956,23 +959,6 @@ protected async void Item_DragOver(object sender, DragEventArgs e)
956959
{
957960
deferral = e.GetDeferral();
958961

959-
if (dragOverItem != item)
960-
{
961-
dragOverItem = item;
962-
dragOverTimer.Stop();
963-
dragOverTimer.Debounce(() =>
964-
{
965-
if (dragOverItem is not null && !dragOverItem.IsExecutable)
966-
{
967-
dragOverTimer.Stop();
968-
ItemManipulationModel.SetSelectedItem(dragOverItem);
969-
dragOverItem = null;
970-
_ = NavigationHelpers.OpenSelectedItems(ParentShellPageInstance!, false);
971-
}
972-
},
973-
TimeSpan.FromMilliseconds(1000), false);
974-
}
975-
976962
if (FilesystemHelpers.HasDraggedStorageItems(e.DataView))
977963
{
978964
e.Handled = true;
@@ -1030,14 +1016,35 @@ protected async void Item_DragOver(object sender, DragEventArgs e)
10301016
}
10311017
}
10321018
}
1019+
1020+
if (dragOverItem != item)
1021+
{
1022+
dragOverItem = item;
1023+
dragOverTimer.Stop();
1024+
1025+
if (e.AcceptedOperation != DataPackageOperation.None)
1026+
{
1027+
dragOverTimer.Debounce(() =>
1028+
{
1029+
if (dragOverItem is not null && !dragOverItem.IsExecutable)
1030+
{
1031+
dragOverTimer.Stop();
1032+
ItemManipulationModel.SetSelectedItem(dragOverItem);
1033+
dragOverItem = null;
1034+
_ = NavigationHelpers.OpenSelectedItems(ParentShellPageInstance!, false);
1035+
}
1036+
},
1037+
TimeSpan.FromMilliseconds(1000), false);
1038+
}
1039+
}
10331040
}
10341041
finally
10351042
{
10361043
deferral?.Complete();
10371044
}
10381045
}
10391046

1040-
protected async void Item_Drop(object sender, DragEventArgs e)
1047+
private async void Item_Drop(object sender, DragEventArgs e)
10411048
{
10421049
var deferral = e.GetDeferral();
10431050

@@ -1188,26 +1195,25 @@ protected void FileListItem_RightTapped(object sender, RightTappedRoutedEventArg
11881195
if (rightClickedItem is not null && !((SelectorItem)sender).IsSelected)
11891196
ItemManipulationModel.SetSelectedItem(rightClickedItem);
11901197
}
1191-
1192-
protected void InitializeDrag(UIElement containter, ListedItem item)
1198+
protected void InitializeDrag(UIElement container, ListedItem item)
11931199
{
11941200
if (item is null)
11951201
return;
11961202

1197-
UninitializeDrag(containter);
1203+
UninitializeDrag(container);
11981204
if ((item.PrimaryItemAttribute == StorageItemTypes.Folder && !RecycleBinHelpers.IsPathUnderRecycleBin(item.ItemPath)) || item.IsExecutable)
11991205
{
1200-
containter.AllowDrop = true;
1201-
containter.DragOver += Item_DragOver;
1202-
containter.DragLeave += Item_DragLeave;
1203-
containter.Drop += Item_Drop;
1206+
container.AllowDrop = true;
1207+
container.AddHandler(UIElement.DragOverEvent, Item_DragOverEventHandler, true);
1208+
container.DragLeave += Item_DragLeave;
1209+
container.Drop += Item_Drop;
12041210
}
12051211
}
12061212

12071213
protected void UninitializeDrag(UIElement element)
12081214
{
12091215
element.AllowDrop = false;
1210-
element.DragOver -= Item_DragOver;
1216+
element.RemoveHandler(UIElement.DragOverEvent, Item_DragOverEventHandler);
12111217
element.DragLeave -= Item_DragLeave;
12121218
element.Drop -= Item_Drop;
12131219
}

0 commit comments

Comments
 (0)