Forge
csharpdeeb25a2
1#nullable enable
2
3using Avalonia;
4using Avalonia.Controls;
5using Avalonia.Input;
6using Avalonia.Interactivity;
7using CascadeIDE.ViewModels;
8using CascadeIDE.Views;
9
10namespace CascadeIDE.Views;
11
12public 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
View only · write via MCP/CIDE