using System.Windows; using EmbyToolbox.ViewModels; namespace EmbyToolbox.Behaviors; public static class VideoInfoDropTargetBehavior { public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached( "IsEnabled", typeof(bool), typeof(VideoInfoDropTargetBehavior), 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 VideoInfoViewModel vm) { return; } if (vm.IsBusy) { e.Effects = DragDropEffects.None; vm.IsVideoInfoDropHighlight = false; return; } if (e.Data.GetDataPresent(DataFormats.FileDrop)) { e.Effects = DragDropEffects.Copy; e.Handled = true; vm.IsVideoInfoDropHighlight = true; } else { e.Effects = DragDropEffects.None; vm.IsVideoInfoDropHighlight = false; } } private static void OnPreviewDragLeave(object sender, DragEventArgs e) { if (sender is not FrameworkElement fe || fe.DataContext is not VideoInfoViewModel vm) { return; } vm.IsVideoInfoDropHighlight = false; } private static void OnPreviewDrop(object sender, DragEventArgs e) { if (sender is not FrameworkElement fe || fe.DataContext is not VideoInfoViewModel vm) { return; } vm.IsVideoInfoDropHighlight = false; if (e.Data.GetData(DataFormats.FileDrop) is not string[] paths || paths.Length == 0) { e.Handled = true; return; } vm.ApplyDroppedPathsAndAnalyze(paths); e.Handled = true; } }