| 1 | using CascadeIDE.Cockpit.Composition.Shell; |
| 2 | |
| 3 | namespace CascadeIDE.Cockpit.Composition.HostSurface; |
| 4 | |
| 5 | /// <summary> |
| 6 | /// Композитор кадра хоста главного окна: shell + <see cref="CockpitInstrumentDescriptor"/> (ADR 0047). |
| 7 | /// Держит слабую связность с Avalonia — только DTO для привязок и будущего Skia-backend слотов. |
| 8 | /// </summary> |
| 9 | public static class MainWindowHostSurfaceCompositor |
| 10 | { |
| 11 | /// <summary>Собирает <see cref="MainWindowHostSurfaceFrame"/> за один проход поверх <see cref="MainWindowShellSurfaceCompositor"/>.</summary> |
| 12 | public static MainWindowHostSurfaceFrame ComposeFrame(in MainWindowShellSurfaceCompositionInput input) |
| 13 | { |
| 14 | var shell = MainWindowShellSurfaceCompositor.Compose(input); |
| 15 | var surfaceId = ResolveSurfaceId(input); |
| 16 | var instruments = BuildInstruments(shell, surfaceId, input); |
| 17 | return new MainWindowHostSurfaceFrame(shell, instruments); |
| 18 | } |
| 19 | |
| 20 | private static string ResolveSurfaceId(in MainWindowShellSurfaceCompositionInput input) |
| 21 | { |
| 22 | if (input.SuppressPfdColumnForPfdHostWindow && input.SuppressMfdColumnForMfdHostWindow) |
| 23 | return MainWindowHostSurfaceIds.PlusPfdMfdHostTopLevel; |
| 24 | if (input.SuppressPfdColumnForPfdHostWindow) |
| 25 | return MainWindowHostSurfaceIds.PlusPfdHostTopLevel; |
| 26 | if (input.SuppressMfdColumnForMfdHostWindow) |
| 27 | return MainWindowHostSurfaceIds.PlusMfdHostTopLevel; |
| 28 | return MainWindowHostSurfaceIds.DockedGrid; |
| 29 | } |
| 30 | |
| 31 | private static IReadOnlyList<CockpitInstrumentDescriptor> BuildInstruments( |
| 32 | in MainWindowShellSurfaceComposition shell, |
| 33 | string surfaceId, |
| 34 | in MainWindowShellSurfaceCompositionInput input) |
| 35 | { |
| 36 | var list = new List<CockpitInstrumentDescriptor>(2); |
| 37 | if (shell.PfdSurfaceVisible |
| 38 | && InstrumentPlacementRuntime.TryResolveInstrument(surfaceId, CockpitSlotIds.Pfd, input.DisplaySettings, out var pfdInstrumentId)) |
| 39 | { |
| 40 | list.Add(new CockpitInstrumentDescriptor(pfdInstrumentId, CockpitSlotIds.Pfd)); |
| 41 | } |
| 42 | |
| 43 | if (shell.PfdRightColumnVisible |
| 44 | && InstrumentPlacementRuntime.TryResolveInstrument(surfaceId, CockpitSlotIds.Pfd, input.DisplaySettings, out var pfdRightInstrumentId)) |
| 45 | { |
| 46 | list.Add(new CockpitInstrumentDescriptor(pfdRightInstrumentId, CockpitSlotIds.Pfd)); |
| 47 | } |
| 48 | |
| 49 | if (shell.MfdColumnVisibleInMainGrid |
| 50 | && InstrumentPlacementRuntime.TryResolveInstrument(surfaceId, CockpitSlotIds.Mfd, input.DisplaySettings, out var mfdInstrumentId)) |
| 51 | { |
| 52 | list.Add(new CockpitInstrumentDescriptor(mfdInstrumentId, CockpitSlotIds.Mfd)); |
| 53 | } |
| 54 | |
| 55 | return list; |
| 56 | } |
| 57 | } |
| 58 | |