CI / fmt (rustfmt --check) (push) Waiting to run
CI / clippy (ubuntu-latest) (push) Waiting to run
CI / clippy (windows-latest) (push) Waiting to run
CI / test (ubuntu-latest) (push) Waiting to run
CI / test (windows-latest) (push) Waiting to run
CI / build release (ubuntu-latest) (push) Waiting to run
CI / build release (windows-latest) (push) Waiting to run
CI / runtime smoke (ubuntu x64, xvfb) (push) Waiting to run
CI / runtime smoke (macos arm64, probe) (push) Skipped
CI / update-e2e (windows x64) (push) Waiting to run
GPU evidence / GPU 判据自测(不需 GPU;跳过 ≠ 已验证) (push) Waiting to run
GPU evidence / GPU 证据 — 探测可用产物与硬件适配器 (push) Waiting to run
Guards / core 零 UI 守门 (push) Waiting to run
Guards / presenter 零 UI 守门 (push) Waiting to run
Guards / design 零第三方依赖守门 (push) Waiting to run
Guards / unsafe 落点守门(集合必须恰好等于期望) (push) Waiting to run
Guards / 文件行数 ≤400 守门 (push) Waiting to run
Guards / 依赖许可与来源(cargo-deny) (push) Waiting to run
Release guard / 发布标记语义守门(push tag → 稳定版) (push) Waiting to run
Signing status(播报,不是门禁) / 判据自测(三行/退出码/变异重放/接线) (push) Waiting to run
Signing status(播报,不是门禁) / 签名就绪度(播报) (push) Waiting to run
Release / 选槽位(默认四个:Windows 两档 + Linux 两档) (push) Waiting to run
本批内容见 CHANGELOG.md 的 0.2.4 段。按 D41 用孤儿快照推 main,保留「公开史只有里程碑」的模型。
58 lines
2.4 KiB
Plaintext
58 lines
2.4 KiB
Plaintext
// 横幅通知条:隔离档位切换提示(M30 ModeChangeWarning)/ 启动失败 / 启动告警。
|
||
// 与 Toast 的分工:Toast 是「刚发生了什么」,通知条是「现在需要你处理」(用户点了才收)。
|
||
import { Theme } from "../theme/tokens.slint";
|
||
import { Metrics } from "../theme/metrics.slint";
|
||
import { UiNotice, NoticeKind } from "../models.slint";
|
||
import { PageState } from "../page_state.slint";
|
||
import { UiText, TextRole } from "../components/label.slint";
|
||
import { AppIcon, IconKind } from "../components/icons.slint";
|
||
import { MetroButton, ButtonKind } from "../widgets/button.slint";
|
||
|
||
// 横幅通知:隔离档位切换提示(M30 ModeChangeWarning)/ 启动失败 / 启动告警。
|
||
// 与 Toast 的分工:Toast 是「刚发生了什么」,通知条是「现在需要你处理」。
|
||
export component NoticeBar inherits Rectangle {
|
||
in property <[UiNotice]> notices;
|
||
|
||
visible: root.notices.length > 0;
|
||
height: root.notices.length > 0 ? 48px : 0px;
|
||
background: Theme.state-warn-soft;
|
||
|
||
HorizontalLayout {
|
||
padding-left: Metrics.gap-4;
|
||
padding-right: Metrics.gap-3;
|
||
spacing: Metrics.gap-2;
|
||
|
||
for notice in root.notices : Rectangle {
|
||
horizontal-stretch: 1;
|
||
background: transparent;
|
||
HorizontalLayout {
|
||
spacing: Metrics.gap-2;
|
||
AppIcon {
|
||
icon-size: 16px;
|
||
kind: notice.kind == NoticeKind.error ? IconKind.error : IconKind.warn;
|
||
tint: notice.kind == NoticeKind.error ? Theme.state-danger : Theme.state-warn;
|
||
}
|
||
VerticalLayout {
|
||
vertical-stretch: 1;
|
||
spacing: 0px;
|
||
UiText { role: TextRole.caption; text: notice.title; horizontal-stretch: 1; }
|
||
UiText {
|
||
role: TextRole.caption;
|
||
text: notice.body;
|
||
horizontal-stretch: 1;
|
||
overflow: elide;
|
||
color: Theme.fg-secondary;
|
||
}
|
||
}
|
||
MetroButton {
|
||
kind: ButtonKind.subtle;
|
||
text: "知道了";
|
||
button-height: 22px;
|
||
clicked => { PageState.notice-dismiss(notice.id); }
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|