| 1 | using CascadeIDE.Features.Shell.Application; |
| 2 | using CascadeIDE.Models; |
| 3 | using CascadeIDE.Models.Shell; |
| 4 | |
| 5 | namespace CascadeIDE.ViewModels; |
| 6 | |
| 7 | /// <summary>Оболочка Mfd: одна активная страница; навигация — команды и палитра. Якорь на экране задаётся presentation (зона Mfd в main и/или окно-хост).</summary> |
| 8 | public partial class MainWindowViewModel |
| 9 | { |
| 10 | /// <summary>Та же <see cref="CurrentMfdShellPage"/>, в контракте <see cref="IShellPage"/>; Pfd — <see cref="PfdLayout"/>.</summary> |
| 11 | public IMfdShellPage CurrentMfdShellPageAsShell => new MfdShellPageDescriptor(CurrentMfdShellPage); |
| 12 | |
| 13 | /// <summary>v1 — единый расклад; будущий декларативный пресет — смена id (ADR 0088).</summary> |
| 14 | public IPfdLayout PfdLayout => PfdLayouts.Default; |
| 15 | |
| 16 | internal static readonly MfdShellPage[] MfdShellPageOrder = |
| 17 | MfdShellPageAllowanceProjection.PageOrder; |
| 18 | |
| 19 | /// <summary>MCP и палитра: перейти на страницу оболочки Mfd, если она разрешена пресетом.</summary> |
| 20 | public void TryNavigateToMfdShellPage(MfdShellPage page) |
| 21 | { |
| 22 | EnsureMfdShellSurfaceForLayout(); |
| 23 | if (IsMfdShellPageAllowed(page)) |
| 24 | CurrentMfdShellPage = page; |
| 25 | else |
| 26 | CoerceMfdShellPageToAllowed(); |
| 27 | } |
| 28 | |
| 29 | /// <summary> |
| 30 | /// Любая страница оболочки Mfd должна открываться с учетом активной раскладки: |
| 31 | /// при пресете с вынесенным MFD поднимаем/фокусируем TopLevel-хост. |
| 32 | /// </summary> |
| 33 | private void EnsureMfdShellSurfaceForLayout() |
| 34 | { |
| 35 | if (!IsCockpitPresentationTier) |
| 36 | return; |
| 37 | |
| 38 | if (PresentationRequestsMfdHostWindow) |
| 39 | RequestToggleMfdHostWindow?.Invoke(); |
| 40 | } |
| 41 | |
| 42 | private MfdShellPageAllowanceProjection.Snapshot MfdShellAllowanceSnapshot => new( |
| 43 | ShowIdeHealthMfdPage, |
| 44 | IsDockedMfdSolutionExplorerTree, |
| 45 | IsTerminalVisible, |
| 46 | IsBuildOutputVisible, |
| 47 | IsProblemsPanelVisible, |
| 48 | IsGitPanelVisible, |
| 49 | InstrumentationTabs, |
| 50 | HypothesesTab, |
| 51 | PrimaryWorkSurface == PrimaryWorkSurfaceKind.Intercom); |
| 52 | |
| 53 | private bool IsMfdShellPageAllowed(MfdShellPage page) => |
| 54 | MfdShellPageAllowanceProjection.IsAllowed(page, MfdShellAllowanceSnapshot); |
| 55 | |
| 56 | private MfdShellPage GetFirstAllowedMfdShellPage() => |
| 57 | IsCompactPresentationTier && IsMfdShellPageAllowed(MfdShellPage.Chat) |
| 58 | ? MfdShellPage.Chat |
| 59 | : MfdShellPageAllowanceProjection.FirstAllowedOrChat(MfdShellAllowanceSnapshot); |
| 60 | |
| 61 | private void CoerceMfdShellPageToAllowed() |
| 62 | { |
| 63 | if (IsMfdShellPageAllowed(CurrentMfdShellPage)) |
| 64 | return; |
| 65 | CurrentMfdShellPage = GetFirstAllowedMfdShellPage(); |
| 66 | } |
| 67 | |
| 68 | /// <summary> |
| 69 | /// Контент страницы «Обозреватель» в <c>MfdShellView</c> — только если карта реально монтирует дерево в слот MFD |
| 70 | /// (см. <see cref="IsDockedMfdSolutionExplorerTree"/>). Иначе, даже при устаревшем <see cref="CurrentMfdShellPage"/>, дубль с колонкой PFD не показываем. |
| 71 | /// </summary> |
| 72 | public bool IsMfdShellSolutionExplorerPageActive => |
| 73 | CurrentMfdShellPage == MfdShellPage.SolutionExplorer && IsDockedMfdSolutionExplorerTree; |
| 74 | } |
| 75 | |