Forge
csharpdeeb25a2
1using Avalonia.Controls;
2using Avalonia.Input;
3using Avalonia.Interactivity;
4using CascadeIDE.Models.Shell;
5using System.ComponentModel;
6
7namespace CascadeIDE.Views;
8
9/// <summary>Второй <c>TopLevel</c> под зону Mfd: только <see cref="MfdShellView"/> (вторичный контур). Дерево и прочий UI — контент страниц внутри shell, не дублирование колонки главного окна в этом хосте — ADR 0017 п. 8.</summary>
10public partial class MfdHostWindow : PointerTrackingWindow
11{
12 private INotifyPropertyChanged? _boundVm;
13 private CockpitSkiaSceneRenderer? _renderer;
14
15 public MfdHostWindow()
16 {
17 InitializeComponent();
18 AddHandler(InputElement.KeyDownEvent, OnTunnelKeyDown, RoutingStrategies.Tunnel, handledEventsToo: true);
19 DataContextChanged += OnDataContextChanged;
20 Activated += OnActivated;
21 Closed += (_, _) =>
22 {
23 if (_boundVm is not null)
24 _boundVm.PropertyChanged -= OnVmPropertyChanged;
25 _boundVm = null;
26 };
27 }
28
29 private void OnTunnelKeyDown(object? sender, KeyEventArgs e)
30 {
31 if (DataContext is not ViewModels.MainWindowViewModel vm)
32 return;
33 vm.CommandPaletteHost = CommandPaletteHost.MfdHost;
34 MainWindowHotkeyService.TryHandleTunnelKeyDownFromWindow(nameof(MfdHostWindow), e, vm);
35 }
36
37 private void OnActivated(object? sender, EventArgs e)
38 {
39 if (DataContext is ViewModels.MainWindowViewModel vm)
40 vm.CommandPaletteHost = CommandPaletteHost.MfdHost;
41 }
42
43 private void OnDataContextChanged(object? sender, EventArgs e)
44 {
45 if (_boundVm is not null)
46 _boundVm.PropertyChanged -= OnVmPropertyChanged;
47
48 _boundVm = DataContext as INotifyPropertyChanged;
49 if (_boundVm is not null)
50 _boundVm.PropertyChanged += OnVmPropertyChanged;
51
52 if (this.FindControl<SkiaHost>("MfdHostSkiaHost") is { } host)
53 {
54 _renderer ??= new CockpitSkiaSceneRenderer(
55 () => DataContext as ViewModels.MainWindowViewModel,
56 SkiaHostSurface.MfdHostWindow);
57 host.Renderer = _renderer;
58 host.InvalidateVisual();
59 }
60 }
61
62 private void OnVmPropertyChanged(object? sender, PropertyChangedEventArgs e)
63 {
64 if (!MainWindow.IsSkiaHostRelatedProperty(e.PropertyName))
65 return;
66
67 if (this.FindControl<SkiaHost>("MfdHostSkiaHost") is { } host)
68 host.InvalidateVisual();
69 }
70}
71
View only · write via MCP/CIDE