| 1 | #nullable enable |
| 2 | using CascadeIDE.Models; |
| 3 | using CommunityToolkit.Mvvm.ComponentModel; |
| 4 | |
| 5 | namespace CascadeIDE.Features.Chat; |
| 6 | |
| 7 | public 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 | |