Перейти к содержанию

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 Стабильный ключ панели в сетке / доке HostAttentionPanelIdAttentionPanelCanonicalIds / AttentionPanelIds
Презентация Видимость, размер, вкладки TOML overlay (0010), Axaml

Топология презентации (одно окно с колонками vs несколько окон/мониторов) в коде задаётся отдельно от id зоны: AttentionLayoutSurfaceKind (сейчас только MainWindowDockedGrid); на MainWindowViewModelActiveAttentionLayoutSurface. Свойства 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

  1. Выбрать канонический id зоны (AttentionZoneCanonicalIds) для ментальной модели.
  2. Если поверхность = конкретная панель дока: задать HostAttentionPanelId тем же строковым id, что в таблице выше (или добавить новый id в AttentionPanelCanonicalIds, AttentionPanelIds, дефолт в AttentionZonePanelRuntime).
  3. Заполнить оба поля (PrimaryAttentionZoneId + HostAttentionPanelId) — тогда при BuildMap() проверка CapabilityAttentionConsistency сравнит с текущей картой рантайма и выведет предупреждение в Debug при рассинхроне.
  4. Для переопределения места панели пользователем — только TOML (attention_zone_panels), не подмена семантики в SDK.

Чего этот playbook не делает

  • Не задаёт пиксели и не заменяет разметку Axaml.
  • Не заставляет вешать зону на команды без привязки к панели.