超轻量级、不引入GUI库、零代码依赖、不增加链接库的系统对话框。
设计用来在不引入额外复杂度的情况下,调用系统对话框,作为程序错误或异常的最后面向用户的提示手段。
- 零 rust 依赖
- 体积小,代码精简
- 代码不引入 GUI 库
- 编译时无需引入链接库
- 跨平台(windows/linux)
在运行时尝试调用系统的 GUI 组件,按需打开链接库并查找所需方法。
在 windows 平台上使用 win32 控件,在 linux 平台上尝试调用 GTK3。
显示模态对话框,标题为 Hello 内容是 World,附带一个警告图标和 Ok 按钮,点击后关闭对话框。
zero_dialog::show("Hello", "World", &Default::default());配置成显示错误图标,显示 Ok 和 Cancel 两个按钮,获取用户的选择结果。
let title = "Fatal Error";
let msg = "Required assets not found, click Ok to exit";
let config = DialogConfig {
icon: IconKind::Error,
btn: ButtonKind::OkCancel,
};
let result = zero_dialog::show(title, msg, &config);
match result {
Ok(Response::Ok) => std::process::exit(1),
Ok(Response::Cancel) => println!("Cancel"),
_ => println!("None"),
}可以在 panic 后调用显示错误提示。
use std::panic;
use zero_dialog::show;
fn main() {
panic::set_hook(Box::new(|_| {
let title = "Error";
let msg = "Something went wrong";
let _ = show(title, msg, &Default::default());
}));
panic!("Normal panic");
}显示的主题和图标都将保持系统样式,在 windows 平台下默认保持向后兼容,默认将显示成 XP 样式,需要设置控件风格才能显示为新版样式。这些配置将影响整个程序而不仅仅是此对话框,所以请妥善自行配置。
可以这样修改 windows 上的控件风格版本。
# Cargo.toml
[build-dependencies]
winres = "0.1"// build.rs
fn main() {
if cfg!(target_os = "windows") {
let mut res = winres::WindowsResource::new();
res.set_manifest(r#"
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
"#);
res.compile().expect("failed to compile");
}
}- 使用大量 unsafe 代码
- 运行环境缺乏所需GUI框架时会失败
- 动态执行可能引入以外的代码执行
- 显示样式不受控制