- src/storage.rs: AppState (last_window_width/height) + load/save atomic write 到 %APPDATA%/WindowsGotify/state.json(§18) - ui/settings-page.slint: 5 分组(Connection / Notifications / Startup / Appearance / Advanced),Appearance 实时切主题(System/Light/Dark radio);Advanced 折叠 - ui/dialogs.slint: AboutDialog + ConfirmDialog(§54) - ui/server-card.slint: 单 server 行(name/url/enabled toggle/edit/remove) - ui/app.slint: settings 页切换、About 导航、theme 联动 - src/lib.rs: load_state → 启动时应用窗口尺寸;ui.window() .on_close_requested 在 OS 关闭前 save_state;wire about/close callbacks - src/error.rs: 加 AppError::Storage(String) 变体 - Cargo.toml: 加 serde + serde_json 避坑: - Slint 1.x 同文件内 export component 必须在引用前定义(sub-components 移到 SettingsPage 上面) - Slint 不支持 padding 两值简写 (padding: 0 16px) → 用 padding-* 四属性 - Slint 不支持 Rectangle 内建 border-color 覆盖 → 命名 card-border - Slint 不支持 alignment: right → 用 spacer + horizontal-stretch: 1 - 修了一处 .slint 文件被 PowerShell Set-Content GBK 损坏的问题(已 通过 write 工具 + UTF-8 no BOM 重写并清理 ui/ 所有 .slint) 验证:cargo build / build --release 都 exit 0,0 warning - debug 27.55 MB, subsystem = WINDOWS_CUI - release 8.10 MB, subsystem = WINDOWS_GUI
155 lines
4.5 KiB
Plaintext
155 lines
4.5 KiB
Plaintext
// AGENTS.md §54 modals. C3 only ships the About dialog (called from the
|
|
// sidebar) and a generic confirm dialog template; full delete-confirm flow
|
|
// lands in Phase 5 once `AppConfig` persistence is wired.
|
|
|
|
export component AboutDialog inherits Dialog {
|
|
in property <string> version-string: "v0.1.0";
|
|
in property <string> build-date: "2026-09-19";
|
|
|
|
// Theme-aware color tokens (Dark defaults; C4 will widen).
|
|
in property <color> bg-color: #28292d;
|
|
in property <color> text-primary-color: #e6e6e6;
|
|
in property <color> text-secondary-color: #a0a0a0;
|
|
in property <color> accent-color: #4ea1ff;
|
|
in property <color> button-bg: #2f3035;
|
|
in property <color> button-border: #3a3b40;
|
|
|
|
title: "About Gotify Client";
|
|
background: bg-color;
|
|
|
|
VerticalLayout {
|
|
padding: 24px;
|
|
spacing: 12px;
|
|
width: 360px;
|
|
|
|
Text {
|
|
text: "Windows Gotify Client (Rust)";
|
|
color: text-primary-color;
|
|
font-size: 16px;
|
|
font-weight: 700;
|
|
}
|
|
Text {
|
|
text: version-string;
|
|
color: accent-color;
|
|
font-size: 13px;
|
|
}
|
|
Text {
|
|
text: "Built " + build-date;
|
|
color: text-secondary-color;
|
|
font-size: 11px;
|
|
}
|
|
Rectangle { height: 8px; }
|
|
Text {
|
|
text: "Lightweight, modern, Windows-native Gotify\ndesktop client. Phase 2 of 8.";
|
|
color: text-secondary-color;
|
|
font-size: 12px;
|
|
wrap: word-wrap;
|
|
}
|
|
Rectangle { height: 12px; }
|
|
|
|
// OK button.
|
|
Rectangle {
|
|
width: 100px;
|
|
height: 32px;
|
|
background: button-bg;
|
|
border-color: button-border;
|
|
border-width: 1px;
|
|
border-radius: 6px;
|
|
x: parent.width - self.width;
|
|
|
|
Text {
|
|
x: (parent.width - self.width) / 2;
|
|
y: (parent.height - self.height) / 2;
|
|
text: "Close";
|
|
color: text-primary-color;
|
|
font-size: 12px;
|
|
}
|
|
TouchArea {
|
|
clicked => {
|
|
root.close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
export component ConfirmDialog inherits Dialog {
|
|
in property <string> title-text: "Confirm";
|
|
in property <string> message: "Are you sure?";
|
|
in property <string> confirm-label: "Confirm";
|
|
in property <string> cancel-label: "Cancel";
|
|
|
|
callback confirmed();
|
|
callback cancelled();
|
|
|
|
in property <color> bg-color: #28292d;
|
|
in property <color> text-primary-color: #e6e6e6;
|
|
in property <color> text-secondary-color: #a0a0a0;
|
|
in property <color> danger-color: #f44336;
|
|
in property <color> button-bg: #2f3035;
|
|
in property <color> button-border: #3a3b40;
|
|
|
|
title: title-text;
|
|
background: bg-color;
|
|
|
|
VerticalLayout {
|
|
padding: 24px;
|
|
spacing: 16px;
|
|
width: 360px;
|
|
|
|
Text {
|
|
text: message;
|
|
color: text-primary-color;
|
|
font-size: 13px;
|
|
wrap: word-wrap;
|
|
}
|
|
|
|
HorizontalLayout {
|
|
spacing: 12px;
|
|
|
|
Rectangle { horizontal-stretch: 1; }
|
|
|
|
Rectangle {
|
|
width: 90px;
|
|
height: 32px;
|
|
background: button-bg;
|
|
border-color: button-border;
|
|
border-width: 1px;
|
|
border-radius: 6px;
|
|
Text {
|
|
x: (parent.width - self.width) / 2;
|
|
y: (parent.height - self.height) / 2;
|
|
text: cancel-label;
|
|
color: text-primary-color;
|
|
font-size: 12px;
|
|
}
|
|
TouchArea {
|
|
clicked => {
|
|
root.cancelled();
|
|
root.close();
|
|
}
|
|
}
|
|
}
|
|
Rectangle {
|
|
width: 90px;
|
|
height: 32px;
|
|
background: danger-color;
|
|
border-radius: 6px;
|
|
Text {
|
|
x: (parent.width - self.width) / 2;
|
|
y: (parent.height - self.height) / 2;
|
|
text: confirm-label;
|
|
color: #ffffff;
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
}
|
|
TouchArea {
|
|
clicked => {
|
|
root.confirmed();
|
|
root.close();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |