Playbook: зона внимания ↔ панель shell ↔ SDK¶
Статус: чертёж v1.
Связь: ADR 0021 (семантика), ADR 0017 (несколько окон / поверхности), ADR 0025 (контракты), 0010 (overlay).
Проверка среза: vertical-slice-attention-capabilities-v1.
Зачем¶
Чтобы после фразы «эта поверхность в PFD» был следующий шаг без догадок: какой id панели, где дефолт зоны в рантайме, что переопределяет workspace.toml.
Три слоя (не смешивать)¶
| Слой | Что это | Где живёт |
|---|---|---|
| Семантика зоны | «Где в модели внимания» (PFD / Forward / …) | PrimaryAttentionZoneId в UiSurfaceCapabilityDescriptor, константы AttentionZoneCanonicalIds |
| Панель shell | Стабильный ключ панели в сетке / доке | HostAttentionPanelId ↔ AttentionPanelCanonicalIds / AttentionPanelIds |
| Презентация | Видимость, размер, вкладки | TOML overlay (0010), Axaml |
Топология презентации (одно окно с колонками vs несколько окон/мониторов) в коде задаётся отдельно от id зоны: AttentionLayoutSurfaceKind (сейчас только MainWindowDockedGrid); на MainWindowViewModel — ActiveAttentionLayoutSurface. Свойства IsPfdColumnVisible / IsMfdColumnVisible относятся только к этой топологии.
Колонки MainGrid ≠ содержимое зоны. Свойства вроде «видна колонка под якорь PFD/MFD» в VM описывают разметку главного окна (есть ли место под левую/правую колонку в одном MainGrid). Какая панель сейчас привязана к зоне pfd / mfd / forward — это слой карты AttentionZonePanelRuntime и TOML, а не то же имя, что у колонки сплиттера.
Колонки — не единственная форма раскладки. Три семантики (PFD / лобовое / MFD) на одном мониторе часто складываются в три колонки одного окна; при мультимониторе или нескольких top-level те же зоны могут жить в отдельных окнах или на разных дисплеях — семантика зон сохраняется, меняется только геометрия презентации (ADR 0021 §13 «Мультиоконность и мультимонитор», ADR 0017). Пример целевой схемы на двух мониторах: первый — PFD + лобовое, второй — MFD (см. 0017 §«Два монитора»). Playbook про колонки описывает текущий путь «главное окно → MainGrid»; роутинг зон по окнам — предмет 0017 и будущей реализации, не замена таблицы панель→зона выше.
Дефолтная карта панель → зона¶
Источник в коде: AttentionZonePanelRuntime.BuildDefaultMap() (после загрузки workspace накладываются переопределения из attention_zone_panels).
Панель (AttentionPanelIds) |
Дефолтная зона (канонический id) | Примечание |
|---|---|---|
solution_explorer |
pfd |
контекст workspace слева |
chat_panel |
mfd |
|
git |
mfd |
|
terminal_dock |
mfd |
|
editor |
forward |
лобовое |
editor_hud |
hud |
слой над редактором, не отдельная колонка |
EICAS как канал оповещений в этой таблице не как отдельная строка-панель — см. ADR 0021.
Что делать при добавлении UI surface¶
- Выбрать канонический id зоны (
AttentionZoneCanonicalIds) для ментальной модели. - Если поверхность = конкретная панель дока: задать
HostAttentionPanelIdтем же строковым id, что в таблице выше (или добавить новый id вAttentionPanelCanonicalIds,AttentionPanelIds, дефолт вAttentionZonePanelRuntime). - Заполнить оба поля (
PrimaryAttentionZoneId+HostAttentionPanelId) — тогда приBuildMap()проверкаCapabilityAttentionConsistencyсравнит с текущей картой рантайма и выведет предупреждение в Debug при рассинхроне. - Для переопределения места панели пользователем — только TOML (
attention_zone_panels), не подмена семантики в SDK.
Чего этот playbook не делает¶
- Не задаёт пиксели и не заменяет разметку Axaml.
- Не заставляет вешать зону на команды без привязки к панели.