| 1 | namespace CascadeIDE.Features.UiChrome; |
| 2 | |
| 3 | /// <summary>Какую встроенную тему подставить при входе в режим.</summary> |
| 4 | public enum UiModeThemeSlot |
| 5 | { |
| 6 | CursorLike, |
| 7 | Dark, |
| 8 | PowerCockpit, |
| 9 | } |
| 10 | |
| 11 | /// <summary>Снимок раскладки панелей и темы для одного нормализованного режима (<see cref="UiChromeViewModel.NormalizeUiMode"/>).</summary> |
| 12 | public sealed record UiModeLayoutSpec( |
| 13 | bool PfdRegionExpanded, |
| 14 | bool BuildOutputVisible, |
| 15 | bool TerminalVisible, |
| 16 | bool MfdRegionExpanded, |
| 17 | int EditorGroupCount, |
| 18 | UiModeThemeSlot ThemeSlot, |
| 19 | bool SelectTerminalTabWhenTerminalShown, |
| 20 | bool InstrumentationDockVisible); |
| 21 | |
| 22 | /// <summary> |
| 23 | /// Встроенный режим UI: порядок в списке UI, раскладка при <c>ApplyUiModeLayout</c>, ширина региона Mfd. |
| 24 | /// Шипнутый бандл <c>UiModes/index.toml</c> задаёт id (в т.ч. <c>Flight</c>, <c>Editor</c>); неизвестный id в спеке — как Flight. |
| 25 | /// </summary> |
| 26 | public static class UiModeLayoutRegistry |
| 27 | { |
| 28 | /// <summary>Стабильный порядок пункта «Режим интерфейса» и комбо.</summary> |
| 29 | public static readonly IReadOnlyList<string> OrderedModeIds = ["Flight"]; |
| 30 | |
| 31 | private static readonly Dictionary<string, UiModeLayoutSpec> ByNormalizedMode = |
| 32 | new(StringComparer.OrdinalIgnoreCase) |
| 33 | { |
| 34 | // Базовая «рабочая» раскладка (раньше Balanced): терминал/сборка, два редактора, MFD. |
| 35 | ["Flight"] = new UiModeLayoutSpec( |
| 36 | PfdRegionExpanded: true, |
| 37 | BuildOutputVisible: true, |
| 38 | TerminalVisible: true, |
| 39 | MfdRegionExpanded: true, |
| 40 | EditorGroupCount: 2, |
| 41 | ThemeSlot: UiModeThemeSlot.CursorLike, |
| 42 | SelectTerminalTabWhenTerminalShown: false, |
| 43 | InstrumentationDockVisible: true), |
| 44 | }; |
| 45 | |
| 46 | /// <summary>Спека для режима; неизвестный режим — как Flight.</summary> |
| 47 | public static UiModeLayoutSpec Get(string normalizedMode) => |
| 48 | ByNormalizedMode.TryGetValue(normalizedMode, out var spec) |
| 49 | ? spec |
| 50 | : ByNormalizedMode["Flight"]; |
| 51 | |
| 52 | /// <summary>Ширина развёрнутого региона Mfd в пикселях для нормализованного режима (с учётом <c>workspace.toml</c> через <see cref="UiWorkspaceLayoutRuntimeMetrics"/>).</summary> |
| 53 | public static int GetMfdRegionExpandedWidthPixels(string normalizedMode) => normalizedMode switch |
| 54 | { |
| 55 | "Flight" => UiWorkspaceLayoutRuntimeMetrics.MfdRegionExpandedAgentChatWidthPixels, |
| 56 | _ => UiWorkspaceLayoutRuntimeMetrics.MfdRegionExpandedDefaultWidthPixels, |
| 57 | }; |
| 58 | } |
| 59 | |