Forge
csharpdeeb25a2
1#nullable enable
2using CascadeIDE.Models;
3using CommunityToolkit.Mvvm.ComponentModel;
4
5namespace CascadeIDE.Features.Chat;
6
7public partial class ChatPanelViewModel
8{
9 /// <summary>Intercom в лобовом Forward (ADR 0120): <c>primary_work_surface = intercom</c>, на всю зону.</summary>
10 [ObservableProperty]
11 private bool _isForwardIntercomLayout;
12
13 /// <summary>Compact side/bottom panel (ADR 0171): feed-first nav, navigator toggle not pinned.</summary>
14 [ObservableProperty]
15 private bool _isCompactPanelIntercomLayout;
16
17 /// <summary>Устаревшее имя: side panel only.</summary>
18 public bool IsCompactSideIntercomLayout
19 {
20 get => IsCompactPanelIntercomLayout;
21 set => IsCompactPanelIntercomLayout = value;
22 }
23
24 /// <summary>Skia chrome: toolbar, spine, вкладки (лобовой Forward на весь экран).</summary>
25 public bool IntercomForwardChrome => IsForwardIntercomLayout;
26
27 /// <summary>Лента и composer: <c>comfortable</c> vs <c>compact</c> из <c>[intercom] feed_metrics</c>.</summary>
28 [ObservableProperty]
29 private bool _intercomComfortableFeed = true;
30
31 /// <summary>Устаревшее имя привязки: только chrome, не плотность ленты.</summary>
32 public bool IntercomForwardHost => IntercomForwardChrome;
33
34 /// <summary>Topic Navigator: Forward toggle; MFD comfortable pinned; compact side — toggle only.</summary>
35 [ObservableProperty]
36 private bool _isTopicNavigatorVisible;
37
38 public bool IntercomTopicNavigatorVisible =>
39 IsCompactPanelIntercomLayout
40 ? IsTopicNavigatorVisible
41 : IsTopicNavigatorVisible || !IntercomForwardChrome;
42
43 [ObservableProperty]
44 private string _topicNavigatorSearchQuery = "";
45
46 /// <summary>Шрифты Skia-ленты и MFD-панели из <c>[fonts.intercom]</c>.</summary>
47 [ObservableProperty]
48 private IntercomFontsSettings _intercomFonts = new();
49
50 public event EventHandler<IntercomFontsSettings>? IntercomPanelFontsChanged;
51
52 partial void OnIsForwardIntercomLayoutChanged(bool value)
53 {
54 OnPropertyChanged(nameof(IntercomForwardChrome));
55 OnPropertyChanged(nameof(IntercomForwardHost));
56 OnPropertyChanged(nameof(IntercomTopicNavigatorVisible));
57 if (value && IntercomComfortableFeed)
58 IsTopicNavigatorVisible = true;
59 }
60
61 partial void OnIsCompactPanelIntercomLayoutChanged(bool value)
62 {
63 OnPropertyChanged(nameof(IsCompactSideIntercomLayout));
64 OnPropertyChanged(nameof(IntercomTopicNavigatorVisible));
65 if (value)
66 IsTopicNavigatorVisible = false;
67 }
68
69 public void SetIntercomFontsSettings(IntercomFontsSettings fonts) =>
70 IntercomFonts = fonts;
71
72 partial void OnIntercomFontsChanged(IntercomFontsSettings value) =>
73 IntercomPanelFontsChanged?.Invoke(this, value);
74
75 partial void OnIsTopicNavigatorVisibleChanged(bool value) =>
76 OnPropertyChanged(nameof(IntercomTopicNavigatorVisible));
77
78 public void ToggleIntercomTopicNavigator() =>
79 IsTopicNavigatorVisible = !IsTopicNavigatorVisible;
80
81 /// <summary>TOML <c>[intercom] tci_validation_icon</c> (left | right | highlight_only).</summary>
82 public string IntercomTciValidationIcon { get; private set; } = TciValidationIconModes.Right;
83
84 /// <summary>Сбросить Skia TCI chrome (pill placement) после load/save settings.</summary>
85 public event EventHandler? IntercomTciChromeChanged;
86
87 /// <summary>Применить <c>[intercom]</c> (плотность ленты, TCI icon) после load/save settings.</summary>
88 public void ApplyIntercomPresentationSettings(IntercomSettings intercom)
89 {
90 IntercomComfortableFeed = intercom.UseComfortableFeedMetrics();
91 IntercomTciValidationIcon = string.IsNullOrWhiteSpace(intercom.TciValidationIcon)
92 ? TciValidationIconModes.Right
93 : intercom.TciValidationIcon.Trim();
94 IntercomTciChromeChanged?.Invoke(this, EventArgs.Empty);
95 }
96
97 partial void OnIntercomComfortableFeedChanged(bool value) =>
98 OnPropertyChanged(nameof(IntercomTopicNavigatorVisible));
99}
100
View only · write via MCP/CIDE