mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-05 02:36:19 +02:00
[PTRun] Drag and drop files (#22409)
* [PTRun] Support drag&drop to other application for files in result list * [PTRun] use file/folder thumbnail as drag image * (fix spellcheck) * [PTRun] use _mouseDownResultViewModel.Image to generate the drag image * fix spelling + refactoring
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reactive.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
@@ -12,6 +13,7 @@ using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Interop;
|
||||
using System.Windows.Media.Imaging;
|
||||
using Common.UI;
|
||||
using interop;
|
||||
using Microsoft.PowerLauncher.Telemetry;
|
||||
@@ -21,7 +23,10 @@ using PowerLauncher.Plugin;
|
||||
using PowerLauncher.Telemetry.Events;
|
||||
using PowerLauncher.ViewModel;
|
||||
using Wox.Infrastructure.UserSettings;
|
||||
using Wox.Plugin;
|
||||
using Wox.Plugin.Interfaces;
|
||||
using CancellationToken = System.Threading.CancellationToken;
|
||||
using Image = Wox.Infrastructure.Image;
|
||||
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
|
||||
using Log = Wox.Plugin.Logger.Log;
|
||||
using Screen = System.Windows.Forms.Screen;
|
||||
@@ -40,6 +45,8 @@ namespace PowerLauncher
|
||||
private bool _coldStateHotkeyPressed;
|
||||
private bool _disposedValue;
|
||||
private IDisposable _reactiveSubscription;
|
||||
private Point _mouseDownPosition;
|
||||
private ResultViewModel _mouseDownResultViewModel;
|
||||
|
||||
public MainWindow(PowerToysRunSettings settings, MainViewModel mainVM, CancellationToken nativeWaiterCancelToken)
|
||||
: this()
|
||||
@@ -191,6 +198,8 @@ namespace PowerLauncher
|
||||
ListBox.DataContext = _viewModel;
|
||||
ListBox.SuggestionsList.SelectionChanged += SuggestionsList_SelectionChanged;
|
||||
ListBox.SuggestionsList.PreviewMouseLeftButtonUp += SuggestionsList_PreviewMouseLeftButtonUp;
|
||||
ListBox.SuggestionsList.PreviewMouseLeftButtonDown += SuggestionsList_PreviewMouseLeftButtonDown;
|
||||
ListBox.SuggestionsList.MouseMove += SuggestionsList_MouseMove;
|
||||
_viewModel.PropertyChanged += ViewModel_PropertyChanged;
|
||||
_viewModel.MainWindowVisibility = Visibility.Collapsed;
|
||||
_viewModel.LoadedAtLeastOnce = true;
|
||||
@@ -282,6 +291,48 @@ namespace PowerLauncher
|
||||
}
|
||||
}
|
||||
|
||||
private void SuggestionsList_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
|
||||
{
|
||||
_mouseDownPosition = e.GetPosition(null);
|
||||
_mouseDownResultViewModel = ((FrameworkElement)e.OriginalSource).DataContext as ResultViewModel;
|
||||
}
|
||||
|
||||
private void SuggestionsList_MouseMove(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.LeftButton == MouseButtonState.Pressed && _mouseDownResultViewModel?.Result?.ContextData is IFileDropResult fileDropResult)
|
||||
{
|
||||
Vector dragDistance = _mouseDownPosition - e.GetPosition(null);
|
||||
if (Math.Abs(dragDistance.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(dragDistance.Y) > SystemParameters.MinimumVerticalDragDistance)
|
||||
{
|
||||
_viewModel.Hide();
|
||||
|
||||
try
|
||||
{
|
||||
// DoDragDrop with file thumbnail as drag image
|
||||
var dataObject = DragDataObject.FromFile(fileDropResult.Path);
|
||||
using var bitmap = DragDataObject.BitmapSourceToBitmap((BitmapSource)_mouseDownResultViewModel?.Image);
|
||||
IntPtr hBitmap = bitmap.GetHbitmap();
|
||||
|
||||
try
|
||||
{
|
||||
dataObject.SetDragImage(hBitmap, Constant.ThumbnailSize, Constant.ThumbnailSize);
|
||||
DragDrop.DoDragDrop(ListBox.SuggestionsList, dataObject, DragDropEffects.Copy);
|
||||
}
|
||||
finally
|
||||
{
|
||||
Image.NativeMethods.DeleteObject(hBitmap);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// DoDragDrop without drag image
|
||||
IDataObject dataObject = new DataObject(DataFormats.FileDrop, new[] { fileDropResult.Path });
|
||||
DragDrop.DoDragDrop(ListBox.SuggestionsList, dataObject, DragDropEffects.Copy);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e)
|
||||
{
|
||||
if (e.PropertyName == nameof(MainViewModel.MainWindowVisibility))
|
||||
|
||||
Reference in New Issue
Block a user