Skip to content

Commit b29f042

Browse files
committed
Handle drop to sidebar and pathbar
1 parent efbe164 commit b29f042

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

src/Files.App/Helpers/AutomaticDragHelper.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace Files.App.Helpers
1515
{
16+
// https://github.com/microsoft/microsoft-ui-xaml/blob/winui3/release/1.6.3/src/dxaml/xcp/dxaml/lib/AutomaticDragHelper.cpp
1617
public class AutomaticDragHelper : DependencyObject
1718
{
1819
public static AutomaticDragHelper GetDragHelper(DependencyObject obj)
@@ -125,10 +126,6 @@ public void RegisterDragPointerEvents()
125126
{
126127
if (m_shouldAddInputHandlers)
127128
{
128-
PointerEventHandler spDragDropPointerMovedHandler;
129-
PointerEventHandler spDragDropPointerReleasedHandler;
130-
PointerEventHandler spDragDropPointerCaptureLostHandler;
131-
132129
// Hookup pointer events so we can catch and handle it for drag and drop.
133130
if (!m_dragDropPointerMovedToken)
134131
{

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@
1111
using System.Collections.Specialized;
1212
using System.IO;
1313
using System.Windows.Input;
14+
using Vanara.PInvoke;
1415
using Windows.ApplicationModel.DataTransfer;
1516
using Windows.ApplicationModel.DataTransfer.DragDrop;
1617
using Windows.Storage;
1718
using Windows.System;
1819
using Windows.UI.Core;
20+
using WinRT;
1921

2022
namespace Files.App.ViewModels.UserControls
2123
{
@@ -1251,6 +1253,16 @@ private async Task HandleLocationItemDroppedAsync(LocationItem locationItem, Ite
12511253
await QuickAccessService.PinToSidebarAsync(item.Path);
12521254
}
12531255
}
1256+
else if ((bool)args.DroppedItem.Properties.GetValueOrDefault("dragRightButton", false))
1257+
{
1258+
Windows.Win32.PInvoke.GetCursorPos(out var dropPoint);
1259+
using var sf = new Vanara.Windows.Shell.ShellFolder(locationItem.Path);
1260+
var dataObjectProvider = args.DroppedItem.As<Shell32.IDataObjectProvider>();
1261+
var iddo = dataObjectProvider.GetDataObject();
1262+
var dropTarget = sf.GetViewObject<Ole32.IDropTarget>(HWND.NULL);
1263+
dropTarget.DragEnter(iddo, Vanara.PInvoke.MouseButtonState.MK_RBUTTON, new() { X=dropPoint.X, Y=dropPoint.Y }, (Ole32.DROPEFFECT)args.RawEvent.AcceptedOperation);
1264+
dropTarget.Drop(iddo, Vanara.PInvoke.MouseButtonState.MK_RBUTTON, new() { X=dropPoint.X, Y=dropPoint.Y }, (Ole32.DROPEFFECT)args.RawEvent.AcceptedOperation);
1265+
}
12541266
else
12551267
{
12561268
await FilesystemHelpers.PerformOperationTypeAsync(args.RawEvent.AcceptedOperation, args.DroppedItem, locationItem.Path, false, true);
@@ -1260,7 +1272,21 @@ private async Task HandleLocationItemDroppedAsync(LocationItem locationItem, Ite
12601272

12611273
private Task<ReturnResult> HandleDriveItemDroppedAsync(DriveItem driveItem, ItemDroppedEventArgs args)
12621274
{
1263-
return FilesystemHelpers.PerformOperationTypeAsync(args.RawEvent.AcceptedOperation, args.RawEvent.DataView, driveItem.Path, false, true);
1275+
if ((bool)args.DroppedItem.Properties.GetValueOrDefault("dragRightButton", false))
1276+
{
1277+
Windows.Win32.PInvoke.GetCursorPos(out var dropPoint);
1278+
using var sf = new Vanara.Windows.Shell.ShellFolder(driveItem.Path);
1279+
var dataObjectProvider = args.DroppedItem.As<Shell32.IDataObjectProvider>();
1280+
var iddo = dataObjectProvider.GetDataObject();
1281+
var dropTarget = sf.GetViewObject<Ole32.IDropTarget>(HWND.NULL);
1282+
dropTarget.DragEnter(iddo, Vanara.PInvoke.MouseButtonState.MK_RBUTTON, new() { X=dropPoint.X, Y=dropPoint.Y }, (Ole32.DROPEFFECT)args.RawEvent.AcceptedOperation);
1283+
dropTarget.Drop(iddo, Vanara.PInvoke.MouseButtonState.MK_RBUTTON, new() { X=dropPoint.X, Y=dropPoint.Y }, (Ole32.DROPEFFECT)args.RawEvent.AcceptedOperation);
1284+
return Task.FromResult(ReturnResult.Success);
1285+
}
1286+
else
1287+
{
1288+
return FilesystemHelpers.PerformOperationTypeAsync(args.RawEvent.AcceptedOperation, args.RawEvent.DataView, driveItem.Path, false, true);
1289+
}
12641290
}
12651291

12661292
private async Task HandleTagItemDroppedAsync(FileTagItem fileTagItem, ItemDroppedEventArgs args)

src/Files.App/Views/Shells/BaseShellPage.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
using Microsoft.UI.Xaml.Navigation;
1010
using System.Runtime.CompilerServices;
1111
using System.Runtime.InteropServices;
12+
using Vanara.PInvoke;
1213
using Windows.Foundation.Metadata;
1314
using Windows.System;
1415
using Windows.UI.Core;
16+
using WinRT;
1517
using DispatcherQueueTimer = Microsoft.UI.Dispatching.DispatcherQueueTimer;
1618

1719
namespace Files.App.Views.Shells
@@ -417,7 +419,20 @@ protected void CoreWindow_PointerPressed(object sender, PointerRoutedEventArgs a
417419

418420
protected async void ShellPage_PathBoxItemDropped(object sender, PathBoxItemDroppedEventArgs e)
419421
{
420-
await FilesystemHelpers.PerformOperationTypeAsync(e.AcceptedOperation, e.Package, e.Path, false, true);
422+
if ((bool)e.Package.Properties.GetValueOrDefault("dragRightButton", false))
423+
{
424+
Windows.Win32.PInvoke.GetCursorPos(out var dropPoint);
425+
using var sf = new Vanara.Windows.Shell.ShellFolder(e.Path);
426+
var dataObjectProvider = e.Package.As<Shell32.IDataObjectProvider>();
427+
var iddo = dataObjectProvider.GetDataObject();
428+
var dropTarget = sf.GetViewObject<Ole32.IDropTarget>(HWND.NULL);
429+
dropTarget.DragEnter(iddo, MouseButtonState.MK_RBUTTON, new() { X=dropPoint.X, Y=dropPoint.Y }, (Ole32.DROPEFFECT)e.AcceptedOperation);
430+
dropTarget.Drop(iddo, MouseButtonState.MK_RBUTTON, new() { X=dropPoint.X, Y=dropPoint.Y }, (Ole32.DROPEFFECT)e.AcceptedOperation);
431+
}
432+
else
433+
{
434+
await FilesystemHelpers.PerformOperationTypeAsync(e.AcceptedOperation, e.Package, e.Path, false, true);
435+
}
421436
e.SignalEvent?.Set();
422437
}
423438

0 commit comments

Comments
 (0)