using System.Windows; using EmbyToolbox.ViewModels; namespace EmbyToolbox.Behaviors; public static class ConversionQueueDropTargetBehavior { public static readonly DependencyProperty IsDropTargetEnabledProperty = DependencyProperty.RegisterAttached( "IsDropTargetEnabled", typeof(bool), typeof(ConversionQueueDropTargetBehavior), new PropertyMetadata(false, OnIsDropTargetEnabledChanged)); public static void SetIsDropTargetEnabled(DependencyObject d, bool value) => d.SetValue(IsDropTargetEnabledProperty, value); public static bool GetIsDropTargetEnabled(DependencyObject d) => (bool)d.GetValue(IsDropTargetEnabledProperty); private static void OnIsDropTargetEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (d is not UIElement el) { return; } if (e.OldValue is true) { el.PreviewDragOver -= OnPreviewDragOver; el.DragLeave -= OnDragLeave; el.Drop -= OnDrop; } if (e.NewValue is not true) { return; } el.AllowDrop = true; el.PreviewDragOver += OnPreviewDragOver; el.DragLeave += OnDragLeave; el.Drop += OnDrop; } private static void OnDragLeave(object sender, DragEventArgs e) { if (sender is not FrameworkElement fe) { return; } if (fe.DataContext is ConversionViewModel vm) { vm.IsQueueDropHighlight = false; } } private static void OnPreviewDragOver(object sender, DragEventArgs e) { if (sender is not FrameworkElement fe) { return; } if (fe.DataContext is not ConversionViewModel vm) { return; } if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effects = DragDropEffects.Copy; e.Handled = true; vm.IsQueueDropHighlight = true; return; } e.Effects = DragDropEffects.None; vm.IsQueueDropHighlight = false; } private static void OnDrop(object sender, DragEventArgs e) { if (sender is not FrameworkElement fe) { return; } if (fe.DataContext is not ConversionViewModel vm) { return; } vm.IsQueueDropHighlight = false; if (e.Data.GetData(DataFormats.FileDrop) is not string[] paths || paths.Length == 0) { e.Handled = true; return; } vm.ProcessPathsDroppedOnQueue(paths); e.Handled = true; } }