| 1 | #nullable enable |
| 2 | |
| 3 | using Avalonia; |
| 4 | using Avalonia.Controls; |
| 5 | using Avalonia.Input; |
| 6 | using Avalonia.Interactivity; |
| 7 | using CascadeIDE.ViewModels; |
| 8 | using CascadeIDE.Views; |
| 9 | |
| 10 | namespace CascadeIDE.Views; |
| 11 | |
| 12 | public partial class ProblemsMfdPageView : UserControl |
| 13 | { |
| 14 | private Point _problemDragStart; |
| 15 | private bool _problemDragArmed; |
| 16 | private PointerPressedEventArgs? _problemDragPress; |
| 17 | |
| 18 | public ProblemsMfdPageView() |
| 19 | { |
| 20 | InitializeComponent(); |
| 21 | AddHandler(PointerPressedEvent, OnProblemsPointerPressed, RoutingStrategies.Tunnel); |
| 22 | AddHandler(PointerMovedEvent, OnProblemsPointerMoved, RoutingStrategies.Tunnel); |
| 23 | AddHandler(PointerReleasedEvent, OnProblemsPointerReleased, RoutingStrategies.Tunnel); |
| 24 | } |
| 25 | |
| 26 | private void ProblemsList_OnDoubleTapped(object? sender, TappedEventArgs e) |
| 27 | { |
| 28 | if (sender is not ListBox lb || lb.DataContext is not ProblemsPanelViewModel panel) |
| 29 | return; |
| 30 | if (lb.SelectedItem is not ProblemListItem item) |
| 31 | return; |
| 32 | if (panel.NavigateCommand.CanExecute(item)) |
| 33 | panel.NavigateCommand.Execute(item); |
| 34 | } |
| 35 | |
| 36 | private void ProblemsList_OnContextRequested(object? sender, ContextRequestedEventArgs e) |
| 37 | { |
| 38 | if (sender is not ListBox lb || lb.DataContext is not ProblemsPanelViewModel panel) |
| 39 | return; |
| 40 | if (lb.SelectedItem is not ProblemListItem item) |
| 41 | return; |
| 42 | if (panel.AttachToIntercomCommand.CanExecute(item) != true) |
| 43 | return; |
| 44 | |
| 45 | e.Handled = true; |
| 46 | var menu = new ContextMenu(); |
| 47 | var attach = new MenuItem { Header = "Прикрепить к Intercom" }; |
| 48 | attach.Click += (_, _) => panel.AttachToIntercomCommand.Execute(item); |
| 49 | menu.Items.Add(attach); |
| 50 | menu.Open(lb); |
| 51 | } |
| 52 | |
| 53 | private void OnProblemsPointerPressed(object? sender, PointerPressedEventArgs e) |
| 54 | { |
| 55 | if (sender is not ProblemsMfdPageView || e.Source is not ListBox lb) |
| 56 | return; |
| 57 | if (lb.DataContext is not ProblemsPanelViewModel panel) |
| 58 | return; |
| 59 | if (lb.SelectedItem is not ProblemListItem item) |
| 60 | return; |
| 61 | if (!e.GetCurrentPoint(lb).Properties.IsLeftButtonPressed) |
| 62 | return; |
| 63 | |
| 64 | _problemDragStart = e.GetPosition(lb); |
| 65 | _problemDragPress = e; |
| 66 | _problemDragArmed = panel.AttachToIntercomCommand.CanExecute(item); |
| 67 | } |
| 68 | |
| 69 | private async void OnProblemsPointerMoved(object? sender, PointerEventArgs e) |
| 70 | { |
| 71 | if (!_problemDragArmed || _problemDragPress is null || e.Source is not ListBox lb || lb.SelectedItem is not ProblemListItem item) |
| 72 | return; |
| 73 | |
| 74 | var point = e.GetPosition(lb); |
| 75 | if (Math.Abs(point.X - _problemDragStart.X) < 6 && Math.Abs(point.Y - _problemDragStart.Y) < 6) |
| 76 | return; |
| 77 | |
| 78 | _problemDragArmed = false; |
| 79 | var press = _problemDragPress; |
| 80 | _problemDragPress = null; |
| 81 | var data = new DataTransfer(); |
| 82 | data.Add(DataTransferItem.Create( |
| 83 | DataFormat.Text, |
| 84 | IntercomAttachDragPayload.ForProblem(item))); |
| 85 | await DragDrop.DoDragDropAsync(press, data, DragDropEffects.Copy); |
| 86 | } |
| 87 | |
| 88 | private void OnProblemsPointerReleased(object? sender, PointerReleasedEventArgs e) |
| 89 | { |
| 90 | _problemDragArmed = false; |
| 91 | _problemDragPress = null; |
| 92 | } |
| 93 | } |
| 94 | |