Forge
markdowndeeb25a2
1# Editor HUD (inline) — инвентаризация и граница strangler (v1)
2
3**Статус:** рабочий чек-лист
4**Дата:** 2026-04-26
5**Связь:** [ADR 0103](../adr/0103-editor-hud-substrate-semantic-projection-and-surface-adapter.md), [0085](../adr/0085-editor-hud-inline-layer-and-hud-banner.md), [ux roadmap editor-forward](../ui-ux/editor-forward-ui-cleanup-roadmap-v1.md), [banner vs inline policy](editor-hud-banner-inline-policy-v1.md)
6
7**Цель:** зафиксировать, **что сейчас** живёт в `Views/DockDocumentView` и **куда** по намерению ADR 0103 / 0085 должны переезжать **модель презентации** (не DAL) и **тонкий рендер** — без дублирования LSP-ввода-вывода в VM.
8
9---
10
11## Уже вынесено (0103, v1)
12
13| Область | Где | Примечание |
14|--------|-----|------------|
15| Стабилизированный ввод | `EditorStabilizedInputThrottler` + `EditorInputDelta` | Hi-freq не в DataBus; guard активного файла в VM |
16| Адаптер поверхности | `IEditorSurfaceAdapter` / `AvaloniaEditSurfaceAdapter` | Координаты, selection, `CaretOffset` |
17| File-level HUD banner (данные + текст) | `EditorDocumentHudLayer`, `EditorHudStabilizedContext`, `EditorHudBannerTextComposer` | VM оркестрирует баннер; DAL-полосы через `GetStripsForFile` |
18| Семантическая свёртка для баннера | `SemanticProjectionPipeline` / `EditorSemanticSnapshot` | Не путать с полным solution graph (см. 0098) |
19
20---
21
22## `DockDocumentView` — оставшийся inline / hover (по коду)
23
24| Блок | Файл / API | Смысл 0085 | Целевой владелец (strangler) |
25|------|------------|------------|------------------------------|
26| Squiggles (волны под текстом) | `EditorDiagnosticBackgroundRenderer` + `InstallVisualAdornersOnce` | Editor HUD inline | `Features/Editor` — **фасад установки** рендереров; сам рендерер сейчас `Services/EditorDiagnosticAdorner.cs` (можно позже co-locate с inline-слоем) |
27| Tooltip: диагностика hit-test | `WorkspaceDiagnosticsCoordinator.HitTestForToolTip` + `ToolTip` на `TextEditor` | inline hover | `EditorInlineHoverToolTipController` (Presentation) — **логика** debounce/seq; View только подключает pointer |
28| Tooltip: Quick Info (Roslyn / async) | `GetEditorQuickInfoAsync` + fallback `CSharpLanguage.GetQuickInfo` | Quick Info = Editor HUD | Те же колбэки в контроллер; **не** тащить VM в `Features/Editor` — только `Func<…>` / интерфейс с оркестрацией снаружи |
29| Debug / breakpoints визуально | `BreakpointLineBackgroundRenderer`, `DebugCurrentLineBackgroundRenderer`, `DebugInstructionArrowBackgroundRenderer` в `Services/EditorDocumentDebugLineBackgroundRenderers.cs` | Не LSP-диагностики; документные адорнеры | Регистрация через `EditorDocumentBackgroundVisualsHandle` / `EditorInlineHudLayer.InstallDocumentBackgroundVisuals` (не в `MainWindow` code-behind) |
30| ToolTip layout (placement, delay, offsets) | `EditorInlineHoverChrome.ApplyToolTipServiceTo` в `TrySetup` (константы в `EditorInlineHoverChrome`) | Презентация, не [0079](../adr/0079-ide-display-system-ids-overlay-pipeline.md) | Один источник чисел; **IDS** — глобальные оверлеи, это — якорь к `TextEditor`. При появлении **глобального** реестра таймингов тултипов — согласовать цифры, не меняя контур. |
31| EOL inlay `var` → тип | `CSharpLanguageService.GetVarInlayHintsForFile` + `EditorInlayHintBackgroundRenderer` (последний в Z-order) | 0085 inlay; не intra-line ([AvaloniaEdit #429](https://github.com/AvaloniaUI/AvaloniaEdit/discussions/429)) | sRGB **Editor HUD** = `EditorHudDiagnosticsChroma` + `EditorHud.Severity*` в `App.axaml` (MFD/Problems/волны). |
32| TextMate, selection chrome | `MainWindow.EnsureTextMate*`, `EditorSelectionChrome` | Подсветка синтаксиса, не HUD | Вне **inline HUD**-миграции (отдельная тема surface) |
33| Провайдеры MCP / состояние редактора | `SetEditorStateProvider`, `SetApplyEdit`, … | Интеграция агента, не визуальный HUD | Остаётся в VM + View wiring |
34
35---
36
37## Принципы границы (0103)
38
391. **DAL** (`Features/*/DataAcquisition`, LSP hosts) **не** перемещать в `DockDocumentView` — только **снимки/полосы** (`EditorDiagnosticStrip`, и т.д.) на границе.
402. **Стабилизированный** канал — для **сводок и баннера**; **hover** — **прореженный** (debounce), не поток `TextInput` в DataBus.
413. **Рендер** AvaloniaEdit (`IBackgroundRenderer`, `ToolTip`) остаётся **тонко** в View; **политика** «что показать» — в `Features/Editor/.../Presentation`.
42
43---
44
45## Следующие шаги (логичный порядок)
46
471. ~~Вынести тултип-контроллер из code-behind~~ — `EditorInlineHoverToolTipController`.
482. ~~Тонкий фасад для `IBackgroundRenderer` (диагностики + брейкпоинты + отладка)~~ — `EditorDocumentBackgroundVisualsHandle` + `EditorInlineHudLayer.InstallDocumentBackgroundVisuals` (`Services/EditorDocumentDebugLineBackgroundRenderers.cs` переносит бывший `MainWindow.LineRenderers`).
493. **Политика 0085** + токены MFD/Forward — [editor-hud-banner-inline-policy-v1](editor-hud-banner-inline-policy-v1.md) и [roadmap](../ui-ux/editor-forward-ui-cleanup-roadmap-v1.md) §4–6.
50
51---
52
53## Успех
54
55Можно прочитать `DockDocumentView.axaml.cs` и **по этой таблице** понять, что относится к **inline Editor HUD** vs отладка vs баннер — без «всё в одной куче».
56
View only · write via MCP/CIDE