98 lines
2.7 KiB
C#
98 lines
2.7 KiB
C#
using System.Windows;
|
|
using EmbyToolbox.ViewModels;
|
|
|
|
namespace EmbyToolbox.Behaviors;
|
|
|
|
public static class MergeDropTargetBehavior
|
|
{
|
|
public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached(
|
|
"IsEnabled",
|
|
typeof(bool),
|
|
typeof(MergeDropTargetBehavior),
|
|
new PropertyMetadata(false, OnIsEnabledChanged));
|
|
|
|
public static void SetIsEnabled(DependencyObject d, bool value) => d.SetValue(IsEnabledProperty, value);
|
|
public static bool GetIsEnabled(DependencyObject d) => (bool)d.GetValue(IsEnabledProperty);
|
|
|
|
private static void OnIsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
{
|
|
if (d is not FrameworkElement fe)
|
|
{
|
|
return;
|
|
}
|
|
|
|
fe.AllowDrop = false;
|
|
fe.PreviewDragOver -= OnPreviewDragOver;
|
|
fe.PreviewDragLeave -= OnPreviewDragLeave;
|
|
fe.PreviewDrop -= OnPreviewDrop;
|
|
|
|
if (e.NewValue is true)
|
|
{
|
|
fe.AllowDrop = true;
|
|
fe.PreviewDragOver += OnPreviewDragOver;
|
|
fe.PreviewDragLeave += OnPreviewDragLeave;
|
|
fe.PreviewDrop += OnPreviewDrop;
|
|
}
|
|
}
|
|
|
|
private static void OnPreviewDragOver(object sender, DragEventArgs e)
|
|
{
|
|
if (sender is not FrameworkElement fe || fe.DataContext is not MergeViewModel vm)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (vm.IsRunning)
|
|
{
|
|
e.Effects = DragDropEffects.None;
|
|
vm.IsMergeDropHighlight = false;
|
|
return;
|
|
}
|
|
|
|
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
|
{
|
|
e.Effects = DragDropEffects.Copy;
|
|
e.Handled = true;
|
|
vm.IsMergeDropHighlight = true;
|
|
}
|
|
else
|
|
{
|
|
e.Effects = DragDropEffects.None;
|
|
vm.IsMergeDropHighlight = false;
|
|
}
|
|
}
|
|
|
|
private static void OnPreviewDragLeave(object sender, DragEventArgs e)
|
|
{
|
|
if (sender is not FrameworkElement fe || fe.DataContext is not MergeViewModel vm)
|
|
{
|
|
return;
|
|
}
|
|
|
|
vm.IsMergeDropHighlight = false;
|
|
}
|
|
|
|
private static void OnPreviewDrop(object sender, DragEventArgs e)
|
|
{
|
|
if (sender is not FrameworkElement fe || fe.DataContext is not MergeViewModel vm)
|
|
{
|
|
return;
|
|
}
|
|
|
|
vm.IsMergeDropHighlight = false;
|
|
if (vm.IsRunning)
|
|
{
|
|
e.Handled = true;
|
|
return;
|
|
}
|
|
if (e.Data.GetData(DataFormats.FileDrop) is not string[] paths || paths.Length == 0)
|
|
{
|
|
e.Handled = true;
|
|
return;
|
|
}
|
|
|
|
vm.ApplyDroppedPaths(paths);
|
|
e.Handled = true;
|
|
}
|
|
}
|