zero-dialog 0.1.0

Ultra-lightweight, dependency-free system dialog library.
Documentation
# ZERO DIALOG

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

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

\[ [English]./README.md | [中文]./README-zh.md \]

## 设计

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

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

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

## 用例

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

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

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

```rust
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` 后调用显示错误提示。

```rust
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 上的控件风格版本。

```toml
# Cargo.toml
[build-dependencies]
winres = "0.1"
```

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