Skip to content

Latest commit

 

History

History
113 lines (90 loc) · 3.36 KB

File metadata and controls

113 lines (90 loc) · 3.36 KB

ZERO DIALOG

超轻量级、不引入GUI库、零代码依赖、不增加链接库的系统对话框。

设计用来在不引入额外复杂度的情况下,调用系统对话框,作为程序错误或异常的最后面向用户的提示手段。

[ English | 中文 ]

设计

  • 零 rust 依赖
  • 体积小,代码精简
  • 代码不引入 GUI 库
  • 编译时无需引入链接库
  • 跨平台(windows/linux)

在运行时尝试调用系统的 GUI 组件,按需打开链接库并查找所需方法。

在 windows 平台上使用 win32 控件,在 linux 平台上尝试调用 GTK3。

用例

显示模态对话框,标题为 Hello 内容是 World,附带一个警告图标和 Ok 按钮,点击后关闭对话框。

zero_dialog::show("Hello", "World", &Default::default());

配置成显示错误图标,显示 OkCancel 两个按钮,获取用户的选择结果。

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框架时会失败
  • 动态执行可能引入以外的代码执行
  • 显示样式不受控制