emby-toolbox/EmbyToolbox/Behaviors/MergeDropTargetBehavior.cs
Emby Toolbox 6264b487fe Initial commit: Emby Toolbox (conversion scroll fix, bulk Del for tracks).
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-12 21:33:47 +05:00

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;
}
}