Forge
csharpdeeb25a2
1using CascadeIDE.Features.Shell.Application;
2using CascadeIDE.Models;
3using CascadeIDE.Models.Shell;
4
5namespace CascadeIDE.ViewModels;
6
7/// <summary>Оболочка Mfd: одна активная страница; навигация — команды и палитра. Якорь на экране задаётся presentation (зона Mfd в main и/или окно-хост).</summary>
8public 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
View only · write via MCP/CIDE