Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,41 @@ this file as both a release log and a lightweight development progress record.

### Added

- Phase36 architecture guard: documented the PEI -> DXE services ->
ModernSetupApp/DisplayEngine dynamic data/configuration pipeline in English and
zh-CN, with smoke coverage that keeps DisplayEngine focused on rendering state
rather than owning hardware probing or config mutation.
- Phase36 UX iteration: Modern footer hotkey help now reserves left-side text
columns for the GOP status chip, preventing key-help text from colliding with
live/unsaved/reboot-required state indicators.
- Phase36 UX iteration: highlighted interactive rows now draw a subtle right-side
value lane, making prompt/value separation clearer without taking ownership of
FormBrowser text or value semantics.
- Phase36 UX iteration: the Modern UI header time now includes seconds, making
redraw/refresh activity visible without adding a new timer path or changing
FormBrowser event ownership.
- Phase36 UX iteration: DisplayEngine page status now normalizes through a
private page-state enum with an explicit future `REBOOT REQUIRED` state, so
reboot-after-save policy can be surfaced later without conflating it with
generic unsaved changes.
- Phase36 UX iteration: the shared Modern UI footer now renders page status as a
compact color-coded chip, giving live/refresh/unsaved/modal states a durable
visual slot for future PEI/DXE/App data handoff and reboot-required flows.
- Phase36 UX iteration: DisplayEngine page chrome now surfaces FormBrowser-owned
page state in the footer (`LIVE VIEW`, `LIVE REFRESH`, `UNSAVED CHANGES`, or
`MODAL VIEW`), establishing a presentation slot for future PEI/DXE/App data
handoff and dynamic refresh without adding renderer-owned policy/storage logic.
- Phase36 UX iteration: the modern DisplayEngine page chrome now adds a subtle
right-rail divider, clarifying the split between the actionable statement list
and contextual help without changing FormBrowser help text placement.
- Phase36 UX iteration: native FormBrowser prompt/value glyphs printed inside
the modern statement list now receive a small GOP-only inset so text no longer
crowds the accent rail or rounded row surface while preserving text-mode cursor
accounting and FormBrowser ownership.
- Phase36 DisplayEngine row visual polish: FormModel-driven row surfaces now add
conservative GOP accents for editable/action rows, changed settings,
invalid/warning feedback, and disabled/read-only states without changing
FormBrowser text/value rendering or HII/config ownership.
- Phase35 native-vs-modern DisplayEngine visual validation foundation for OVMF
X64: `Scripts/capture-displayengine-ovmf-x64.sh` creates separated native and
modern overlay/build/capture artifact paths under a safe TMPDIR default,
Expand Down
91 changes: 91 additions & 0 deletions Docs/DisplayEngineDynamicDataFlow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# DisplayEngine Dynamic Data Flow Contract

This document defines the intended product direction for ModernSetupPkg dynamic platform data, setup configuration, and refresh UX.

## Goal

ModernSetupApp and the Modern DisplayEngine must be able to show current platform information, reflect configuration changes, and update dynamic data such as time or sensor-like values without turning the renderer into a policy or hardware owner.

## Intended pipeline

```text
PEI platform discovery / defaults
-> HOB / PCD / Variable / protocol handoff
-> DXE platform services
-> ModernSetupApp / DisplayEngine view model
-> Modern UI display + dynamic refresh
-> app writes selected config through platform-owned PCD / Variable / protocol paths
-> immediate effect where safe, or reboot-required effect
-> next PEI consumes non-default config and republishes latest state
```

## Responsibilities

### PEI / platform discovery

- Collect early platform information.
- Read default and non-default configuration inputs.
- Publish handoff data through platform-owned mechanisms.
- Consume reboot-persistent configuration on the next boot.

### DXE platform services

- Normalize platform data for applications.
- Own policy, validation, persistence, and reset requirements.
- Expose current data and update notifications to the app/display layer.

### ModernSetupApp

- Presents product-level setup pages.
- Initiates configuration changes through approved platform services or existing setup mechanisms.
- Shows whether changes are live, unsaved, or require reboot.

### Modern DisplayEngine

- Renders FormBrowser-owned form state and ModernSetup page state.
- Shows live/refresh/unsaved/reboot-required/status affordances.
- Supports redraw-friendly dynamic fields such as time.
- Must not own hardware probing, policy decisions, or storage writes.

## DisplayEngine constraints

Allowed in DisplayEngine/UI code:

- Consume already-materialized FormBrowser display data.
- Consume future app/platform view-model state.
- Render row kind/state, status chips, refresh indicators, and dynamic values.
- Repaint on FormBrowser refresh events or app-driven redraws.

Forbidden in DisplayEngine/UI renderer code:

- Direct hardware probing.
- Independent IFR parsing.
- ConfigAccess semantics.
- Direct `SetVariable`, `RouteConfig`, `ExtractConfig`, or `HiiSetBrowserData` ownership.
- Treating generic unsaved changes as reboot-required without a platform/FormBrowser source.

## UX states

Current private DisplayEngine status slots:

```text
LIVE VIEW default live page surface
LIVE REFRESH FormBrowser/page has a refresh event or equivalent update source
UNSAVED CHANGES changed state exists but is not committed
REBOOT REQUIRED future platform/FormBrowser source says reboot is required
MODAL VIEW modal FormBrowser state
```

`REBOOT REQUIRED` is intentionally a reserved UX state until a real source is wired. The UI must not infer it from generic changed state.

## Validation expectation

Routine UX iteration should stay Modern DisplayEngine focused:

```bash
python3 Tests/Smoke/smoke_validate.py
git diff --check
TARGET=RELEASE MODERN_SETUP_DISPLAY_ENGINE=modern MODERN_SETUP_REPLACE_UIAPP=1 Scripts/build-ovmf-x64.sh
```

Use native-vs-modern capture only for milestones or PR review baselines, not every iteration.
91 changes: 91 additions & 0 deletions Docs/DisplayEngineDynamicDataFlow.zh-CN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# DisplayEngine 动态数据流约束

本文档定义 ModernSetupPkg 后续动态平台数据、Setup 配置和刷新 UX 的产品方向。

## 目标

ModernSetupApp 和 Modern DisplayEngine 需要能显示当前平台信息、反映配置变更,并更新时间或类似 sensor 的动态数据;但 renderer 不能变成 policy owner 或 hardware owner。

## 目标链路

```text
PEI 平台发现 / 默认策略
-> HOB / PCD / Variable / protocol handoff
-> DXE platform services
-> ModernSetupApp / DisplayEngine view model
-> Modern UI display + dynamic refresh
-> app 通过平台拥有的 PCD / Variable / protocol 路径写入配置
-> 安全时立即生效,或标记 reboot-required
-> 下一次 PEI 消费非默认配置并重新发布最新状态
```

## 职责边界

### PEI / platform discovery

- 收集早期平台信息。
- 读取默认和非默认配置输入。
- 通过平台拥有的机制发布 handoff 数据。
- 下一次启动时消费 reboot-persistent 配置。

### DXE platform services

- 为 app 归一化平台数据。
- 拥有 policy、validation、persistence 和 reset requirement。
- 向 app/display 层暴露当前数据和更新通知。

### ModernSetupApp

- 展示产品级 Setup 页面。
- 通过批准的平台服务或现有 setup 机制发起配置变更。
- 显示变更是 live、unsaved,还是 require reboot。

### Modern DisplayEngine

- 渲染 FormBrowser-owned form state 和 ModernSetup page state。
- 显示 live/refresh/unsaved/reboot-required/status affordances。
- 支持 redraw-friendly 的动态字段,例如时间。
- 不拥有硬件探测、policy decision 或 storage writes。

## DisplayEngine 约束

DisplayEngine/UI code 允许:

- 消费已经 materialized 的 FormBrowser display data。
- 消费未来 app/platform view-model state。
- 渲染 row kind/state、status chips、refresh indicators 和 dynamic values。
- 在 FormBrowser refresh event 或 app-driven redraw 时重绘。

DisplayEngine/UI renderer code 禁止:

- 直接硬件探测。
- 独立 IFR parsing。
- ConfigAccess 语义。
- 直接拥有 `SetVariable`、`RouteConfig`、`ExtractConfig` 或 `HiiSetBrowserData`。
- 没有 platform/FormBrowser source 时,把普通 unsaved changes 当成 reboot-required。

## UX 状态

当前私有 DisplayEngine status slots:

```text
LIVE VIEW 默认 live page surface
LIVE REFRESH FormBrowser/page 有 refresh event 或等价 update source
UNSAVED CHANGES 存在 changed state,但尚未提交
REBOOT REQUIRED 未来 platform/FormBrowser source 明确要求重启
MODAL VIEW modal FormBrowser state
```

`REBOOT REQUIRED` 现在只是预留 UX state,直到真实来源接入前不能伪造。UI 不能从 generic changed state 推断它。

## 验证预期

日常 UX iteration 保持 Modern DisplayEngine focused:

```bash
python3 Tests/Smoke/smoke_validate.py
git diff --check
TARGET=RELEASE MODERN_SETUP_DISPLAY_ENGINE=modern MODERN_SETUP_REPLACE_UIAPP=1 Scripts/build-ovmf-x64.sh
```

native-vs-modern capture 只在 milestone 或 PR review baseline 使用,不要每轮 iteration 都跑。
Loading
Loading