Files
Unlucky-Launcher/crates/app/ui/components/install-panel.slint
T
AskaEth a5d1dec495
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
release: v0.2.4 里程碑快照(孤儿提交,无父;树 = dev 68362e5)
本批内容见 CHANGELOG.md 的 0.2.4 段。按 D41 用孤儿快照推 main,保留「公开史只有里程碑」的模型。
2026-11-11 21:41:38 +08:00

74 lines
2.6 KiB
Plaintext

// 安装进度卡片(下载页底部 / 向导进度步共用):阶段 + 进度条 + 文件/字节/速度/剩余 + 取消。
import { Theme } from "../theme/tokens.slint";
import { Metrics } from "../theme/metrics.slint";
import { UiInstallProgress, InstallStage } from "../models.slint";
import { UiText, TextRole } from "../components/label.slint";
import { ProgressBar } from "../components/progress-bar.slint";
import { AppIcon, IconKind } from "../components/icons.slint";
import { MetroButton, ButtonKind } from "../widgets/button.slint";
export component InstallPanel inherits Rectangle {
in property <UiInstallProgress> data;
callback cancel();
height: 96px;
visible: root.data.visible;
background: Theme.bg-surface;
border-width: 1px;
border-color: Theme.stroke;
VerticalLayout {
padding: Metrics.gap-3;
spacing: Metrics.gap-1;
HorizontalLayout {
spacing: Metrics.gap-2;
AppIcon {
icon-size: 16px;
kind: root.data.failed ? IconKind.error
: root.data.terminal ? IconKind.check
: IconKind.download;
tint: root.data.failed ? Theme.state-danger
: root.data.terminal ? Theme.state-success
: Theme.accent;
}
UiText {
role: TextRole.bodyStrong;
text: root.data.instance + " · " + root.data.loader;
horizontal-stretch: 1;
}
UiText {
role: TextRole.caption;
text: root.data.stage_label;
color: root.data.failed ? Theme.state-danger : Theme.fg-secondary;
}
if !root.data.terminal : MetroButton {
kind: ButtonKind.subtle;
text: "取消";
button-height: 24px;
clicked => { root.cancel(); }
}
}
ProgressBar {
ratio: root.data.ratio;
known: root.data.known;
}
HorizontalLayout {
spacing: Metrics.gap-3;
UiText {
role: TextRole.caption;
text: root.data.message;
horizontal-stretch: 1;
overflow: elide;
}
UiText { role: TextRole.caption; text: root.data.files_label; }
UiText { role: TextRole.caption; text: root.data.bytes_label; }
UiText { role: TextRole.caption; text: root.data.speed; color: Theme.accent; }
UiText { role: TextRole.caption; text: root.data.eta; }
}
}
}