Forge
csharpdeeb25a2
1#nullable enable
2using CascadeIDE.Models;
3using CascadeIDE.Services;
4using CommunityToolkit.Mvvm.Input;
5
6namespace CascadeIDE.ViewModels;
7
8/// <summary>Переключатель лобового якоря Intercom / Editor (ADR 0120).</summary>
9public partial class MainWindowViewModel
10{
11 public PrimaryWorkSurfaceKind PrimaryWorkSurface
12 {
13 get => PrimaryWorkSurfaceKindExtensions.ParseTomlValue(_settings.Workspace.PrimaryWorkSurface);
14 set
15 {
16 var normalized = value.ToTomlValue();
17 if (string.Equals(_settings.Workspace.PrimaryWorkSurface, normalized, StringComparison.OrdinalIgnoreCase))
18 return;
19 _settings.Workspace.PrimaryWorkSurface = normalized;
20 OnPropertyChanged();
21 ApplyIntercomHostPresentation();
22 CockpitCommandLineOverlay?.NotifyShellPresentationChanged();
23 SyncMfdShellPageForPrimaryWorkSurface();
24 try
25 {
26 SettingsService.Save(_settings);
27 }
28 catch
29 {
30 // ignore persistence errors during toggle
31 }
32 }
33 }
34
35 /// <summary>Синхронизирует ChatPanel chrome и compact слоты с <see cref="PrimaryWorkSurface"/> и tier.</summary>
36 internal void ApplyIntercomHostPresentation()
37 {
38 ChatPanel.IsForwardIntercomLayout = PrimaryWorkSurface == PrimaryWorkSurfaceKind.Intercom;
39 ChatPanel.IsCompactPanelIntercomLayout =
40 IsCompactPresentationTier && PrimaryWorkSurface == PrimaryWorkSurfaceKind.Editor;
41 OnPropertyChanged(nameof(IsForwardEditorHostVisible));
42 OnPropertyChanged(nameof(IsForwardIntercomHostVisible));
43 NotifyCompactIdeLayoutChanged();
44 }
45
46 private void SyncMfdShellPageForPrimaryWorkSurface()
47 {
48 if (PrimaryWorkSurface == PrimaryWorkSurfaceKind.Intercom)
49 {
50 if (IsMfdShellPageAllowed(MfdShellPage.Editor))
51 TryNavigateToMfdShellPage(MfdShellPage.Editor);
52 else
53 CoerceMfdShellPageToAllowed();
54 }
55 else if (CurrentMfdShellPage == MfdShellPage.Editor)
56 {
57 CoerceMfdShellPageToAllowed();
58 }
59 }
60
61 /// <summary>
62 /// После открытия файла: при Intercom в Forward — страница Editor на MFD; иначе фокус в лобовой редактор (ADR 0120).
63 /// </summary>
64 internal void RevealEditorForOpenedDocument()
65 {
66 if (PrimaryWorkSurface == PrimaryWorkSurfaceKind.Intercom)
67 {
68 if (IsMfdShellPageAllowed(MfdShellPage.Editor))
69 TryNavigateToMfdShellPage(MfdShellPage.Editor);
70 }
71
72 IdeMcp.FocusEditor();
73 }
74
75 public bool IsForwardEditorHostVisible =>
76 PrimaryWorkSurface == PrimaryWorkSurfaceKind.Editor;
77
78 public bool IsForwardIntercomHostVisible =>
79 PrimaryWorkSurface == PrimaryWorkSurfaceKind.Intercom;
80
81 [RelayCommand]
82 private void TogglePrimaryWorkSurface() =>
83 PrimaryWorkSurface = PrimaryWorkSurface == PrimaryWorkSurfaceKind.Editor
84 ? PrimaryWorkSurfaceKind.Intercom
85 : PrimaryWorkSurfaceKind.Editor;
86}
87
View only · write via MCP/CIDE