| 1 | #nullable enable |
| 2 | |
| 3 | using Avalonia.Media; |
| 4 | using CascadeIDE.Cockpit.Channels.Eicas; |
| 5 | using CascadeIDE.Models; |
| 6 | |
| 7 | namespace CascadeIDE.Cockpit.PrimitivesKit; |
| 8 | |
| 9 | /// <summary> |
| 10 | /// Единый слой ARGB для примитивов кабины (визуальный язык, ADR 0064). |
| 11 | /// Правки палитры — здесь; отрисовка и конвертеры только ссылаются на эти значения. |
| 12 | /// </summary> |
| 13 | public static class CockpitPrimitivesPalette |
| 14 | { |
| 15 | /// <summary> |
| 16 | /// Канал EICAS / CAS: три уровня W/C/A (ADR 0021 §5). Канон для текста полосы, бейджей и сопоставимых уровней ламп. |
| 17 | /// Значения совпадают с прежними hex в <c>EicasSeverityToBrushConverter</c>. |
| 18 | /// Соответствие бытовым словам (Error / Warning / Information) и <see cref="AnnunciatorLampLevel"/> — таблица в ADR 0021 §5. |
| 19 | /// </summary> |
| 20 | public static class Eicas |
| 21 | { |
| 22 | public static readonly Color Warning = Color.Parse("#C02828"); |
| 23 | public static readonly Color Caution = Color.Parse("#B8860B"); |
| 24 | public static readonly Color Advisory = Color.Parse("#1565C0"); |
| 25 | |
| 26 | public static Color Foreground(EicasSeverity severity) => |
| 27 | severity switch |
| 28 | { |
| 29 | EicasSeverity.Warning => Warning, |
| 30 | EicasSeverity.Caution => Caution, |
| 31 | _ => Advisory, |
| 32 | }; |
| 33 | } |
| 34 | |
| 35 | /// <summary>Annunciator / Korry: корпус, линзы, акценты списка. Маппинг уровней — ADR 0021 §5, таблица.</summary> |
| 36 | public static class Annunciator |
| 37 | { |
| 38 | public static readonly Color BezelOuter = Color.Parse("#3A3A3A"); |
| 39 | public static readonly Color BezelInner = Color.Parse("#1E1E1E"); |
| 40 | public static readonly Color Housing = Color.Parse("#080808"); |
| 41 | public static readonly Color PanelBackground = Color.Parse("#0C0C0C"); |
| 42 | public static readonly Color BevelHighlight = Color.Parse("#4A4A4A"); |
| 43 | public static readonly Color BevelShadow = Color.Parse("#0A0A0A"); |
| 44 | |
| 45 | public static readonly Color OffLensTop = Color.Parse("#101010"); |
| 46 | public static readonly Color OffLensBottom = Color.Parse("#1C1C1C"); |
| 47 | public static readonly Color OffLensBorder = Color.Parse("#050505"); |
| 48 | public static readonly Color OffLabelFill = Color.Parse("#5C5C5C"); |
| 49 | public static readonly Color OutlinedTextStrokeDim = Color.Parse("#121212"); |
| 50 | public static readonly Color OutlinedTextStrokeLit = Color.Parse("#0A0A0A"); |
| 51 | |
| 52 | /// <summary>Подсвеченная линза (не <see cref="AnnunciatorLampLevel.Ok"/>).</summary> |
| 53 | public static readonly Color LitLensCaution = Eicas.Caution; |
| 54 | public static readonly Color LitLensAdvisory = Eicas.Advisory; |
| 55 | public static readonly Color LitLensCritical = Eicas.Warning; |
| 56 | public static readonly Color LitLensUnknown = Color.Parse("#888888"); |
| 57 | |
| 58 | /// <summary>Акцент строки таблицы / списка по уровню (иконка, заголовок; Ok = «норма», не линза).</summary> |
| 59 | public static readonly Color RowAccentOk = Color.Parse("#2D8A5A"); |
| 60 | public static readonly Color RowAccentCaution = Eicas.Caution; |
| 61 | public static readonly Color RowAccentAdvisory = Eicas.Advisory; |
| 62 | public static readonly Color RowAccentCritical = Eicas.Warning; |
| 63 | public static readonly Color RowAccentUnknown = Color.Parse("#888888"); |
| 64 | |
| 65 | public static readonly Color TooltipDetailForeground = Color.Parse("#D0D0D0"); |
| 66 | |
| 67 | /// <summary>CascadeChord toolbar: лампа «CMD + полоса» в armed (ADR 0060/0064), не EICAS W/C/A.</summary> |
| 68 | public static readonly Color CommandArmedLabelAmber = Color.Parse("#FFB000"); |
| 69 | |
| 70 | /// <summary>Нижняя полоса активности (armed) — зелёный индикатор «вкл».</summary> |
| 71 | public static readonly Color CommandArmedStripGreen = Color.Parse("#00E676"); |
| 72 | |
| 73 | public static Color LitLens(AnnunciatorLampLevel level) => |
| 74 | level switch |
| 75 | { |
| 76 | AnnunciatorLampLevel.Caution => LitLensCaution, |
| 77 | AnnunciatorLampLevel.Advisory => LitLensAdvisory, |
| 78 | AnnunciatorLampLevel.Critical => LitLensCritical, |
| 79 | AnnunciatorLampLevel.Ok => throw new InvalidOperationException("Ok is drawn as off; no lit fill color."), |
| 80 | _ => LitLensUnknown, |
| 81 | }; |
| 82 | |
| 83 | public static Color RowAccent(AnnunciatorLampLevel level) => |
| 84 | level switch |
| 85 | { |
| 86 | AnnunciatorLampLevel.Ok => RowAccentOk, |
| 87 | AnnunciatorLampLevel.Caution => RowAccentCaution, |
| 88 | AnnunciatorLampLevel.Advisory => RowAccentAdvisory, |
| 89 | AnnunciatorLampLevel.Critical => RowAccentCritical, |
| 90 | _ => RowAccentUnknown, |
| 91 | }; |
| 92 | } |
| 93 | |
| 94 | /// <summary>Мини-карта навигации по коду (control flow / звезда) — узлы, рёбра, подписи; в UI — «Карта намерений».</summary> |
| 95 | public static class CodeNavigationMap |
| 96 | { |
| 97 | public static readonly Color AnchorFill = Color.Parse("#7CC9FF"); |
| 98 | public static readonly Color ConditionFill = Color.FromArgb(240, 255, 210, 120); |
| 99 | public static readonly Color ExitFill = Color.FromArgb(230, 165, 175, 190); |
| 100 | public static readonly Color CallFill = Color.Parse("#9B8CFF"); |
| 101 | /// <summary>Обработчик исключений (catch) / «защищённый» участок (ADR 0053).</summary> |
| 102 | public static readonly Color HandlerFill = Color.FromArgb(235, 70, 175, 155); |
| 103 | public static readonly Color SideLabel = Color.FromArgb(220, 225, 235, 255); |
| 104 | public static readonly Color BaseEdge = Color.FromArgb(180, 140, 140, 160); |
| 105 | public static readonly Color ConditionalEdge = Color.FromArgb(220, 255, 210, 120); |
| 106 | public static readonly Color MultiBranchEdge = Color.FromArgb(200, 110, 195, 255); |
| 107 | public static readonly Color LoopEdge = Color.FromArgb(235, 120, 230, 255); |
| 108 | public static readonly Color HighlightedEdge = Color.FromArgb(245, 255, 255, 190); |
| 109 | public static readonly Color HighlightedLoopEdge = Color.FromArgb(250, 255, 255, 200); |
| 110 | public static readonly Color HighlightedNode = Color.FromArgb(230, 255, 255, 200); |
| 111 | public static readonly Color NodeStroke = Color.Parse("#22000000"); |
| 112 | } |
| 113 | |
| 114 | /// <summary> |
| 115 | /// Мини-карта в режиме «связанные файлы» — отдельный акцент от CFG (тот же примитивный рендер, другая палитра; ADR 0067). |
| 116 | /// </summary> |
| 117 | public static class CodeNavigationMapWorkspace |
| 118 | { |
| 119 | public static readonly Color AnchorFill = Color.Parse("#4A9FD8"); |
| 120 | public static readonly Color ConditionFill = Color.FromArgb(235, 230, 195, 130); |
| 121 | public static readonly Color ExitFill = Color.FromArgb(225, 150, 165, 185); |
| 122 | public static readonly Color PeerFill = Color.FromArgb(235, 130, 175, 210); |
| 123 | public static readonly Color HandlerFill = Color.FromArgb(230, 55, 165, 145); |
| 124 | public static readonly Color SideLabel = Color.FromArgb(215, 210, 225, 240); |
| 125 | public static readonly Color BaseEdge = Color.FromArgb(175, 100, 140, 175); |
| 126 | public static readonly Color ConditionalEdge = Color.FromArgb(215, 220, 195, 130); |
| 127 | public static readonly Color MultiBranchEdge = Color.FromArgb(195, 95, 175, 220); |
| 128 | public static readonly Color LoopEdge = Color.FromArgb(225, 110, 200, 235); |
| 129 | public static readonly Color HighlightedEdge = Color.FromArgb(240, 255, 250, 185); |
| 130 | public static readonly Color HighlightedLoopEdge = Color.FromArgb(245, 255, 252, 195); |
| 131 | public static readonly Color HighlightedNode = Color.FromArgb(225, 255, 252, 200); |
| 132 | public static readonly Color NodeStroke = Color.Parse("#22000000"); |
| 133 | } |
| 134 | } |
| 135 | |