20 releases (7 breaking)

new 0.9.1 Jun 22, 2024
0.8.2 Jun 13, 2024

#64 in GUI

Download history 536/week @ 2024-04-08 469/week @ 2024-04-15 105/week @ 2024-04-22 125/week @ 2024-04-29 150/week @ 2024-05-06 154/week @ 2024-05-13 228/week @ 2024-05-20 151/week @ 2024-05-27 276/week @ 2024-06-03 484/week @ 2024-06-10 371/week @ 2024-06-17

1,287 downloads per month

Apache-2.0 OR MIT

7MB
124K SLoC

Zng is a cross-platform GUI framework, it provides ready made highly customizable widgets, responsive layout, live data binding, easy localization, automatic focus navigation and accessibility, async and multi-threaded tasks, robust multi-process architecture and more.

Zng is pronounced "zing", or as an initialism: ZNG (Z Nesting Graphics).

Usage

First add zng to your Cargo.toml, or call cargo add zng -F view_prebuilt:

[dependencies]
zng = { version = "0.9.1", features = ["view_prebuilt"] }

Then create your first window:

use zng::prelude::*;

fn main() {
    zng::env::init!();
    APP.defaults().run_window(async {
        let size = var(layout::Size::new(800, 600));
        Window! {
            title = size.map(|s| formatx!("Button Example - {s}"));
            size;
            child_align = Align::CENTER;
            child = Button! {
                on_click = hn!(|_| {
                    println!("Button clicked!");
                });
                text::font_size = 28;
                child = Text!("Click Me!");
            }
        }
    })
}

See the documentation for more details.

Project Template

You can also use cargo zng new to generate a new project with useful boilerplate and distribution packaging already setup.

cargo install cargo-zng
cargo zng new "My App!"

The example above installs cargo-zng and uses it to generate a new './my-app' crate from the default template.

Cargo Features

This crate provides 29 feature flags, 4 enabled by default.

"view"

Include the default view-process implementation.

"view_prebuilt"

Include the default view-process implementation as an embedded precompiled binary.

"http"

Enables HTTP tasks and web features of widgets and services.

"debug_default"

Enable the "dyn_*", "inspector" features in debug builds.

Enabled by default.

"dyn_node"

Use more dynamic dispatch at the node level by enabling UiNode::cfg_boxed to box.

This speeds-up compilation time at the cost of runtime.

"inspector"

Instrument each property and widget instance with "Inspector" nodes and extend windows to be inspected on Ctrl+Shift+I.

"hot_reload"

Enable hot reload builds.

Note that you must configure the target library to hot reload, see zng::hot_reload for details.

"dyn_app_extension"

Use dynamic dispatch at the app-extension level.

This speeds-up compilation time at the cost of runtime.

"dyn_closure"

Box closures at opportune places, such as Var::map, reducing the number of monomorphised types.

This speeds-up compilation time at the cost of runtime.

"test_util"

Test utilities.

"multi_app"

Allows multiple app instances per-process.

This feature allows multiple apps, one app per thread at a time. The LocalContext tracks what app is currently running in each thread and app_local! statics switch to the value of each app depending on the current thread.

Not enabled by default, but enabled by feature="test_util".

"single_instance"

Enables single app-process instance mode.

Builds with this feature only allow one app-process, subsequent attempts to spawn the app redirect to the running app-process.

"crash_handler"

Allow app-process crash handler.

Builds with this feature spawn a crash monitor-process for each app-process.

Enabled by default.

"trace_widget"

Instrument every widget outer-most node to trace UI methods.

"trace_wgt_item"

Instrument every property and intrinsic node to trace UI methods.

Note that this can cause very large trace files and bad performance.

"deadlock_detection"

Spawns a thread on app creation that checks and prints parking_lot deadlocks.

"hyphenation_embed_all"

Embed hyphenation dictionaries for all supported languages.

If enabled some 2.8MB of data is embedded, you can provide an alternative dictionary source using the HYPHENATION::init_data_source method.

"material_icons"

Include all Material Icons icon sets in the default app.

"material_icons_outlined"

Material Icons Outlined icon set.

If enabled some icons of this set are used for some of the commands.

"material_icons_filled"

Material Icons Filled icon set.

"material_icons_rounded"

Material Icons Rounded icon set.

"material_icons_sharp"

Material Icons Sharp icon set.

"toml"

Enable TOML configs.

"ron"

Enable RON configs.

"yaml"

Enable YAML configs.

"view_software"

Enables software renderer fallback in the default view-process.

If enabled and a native OpenGL 3.2 driver is not available the swgl software renderer is used.

Enabled by default.

"view_bundle_licenses"

Collects and bundles third-party licenses used by the zng-view crate.

Needs cargo-about and Internet connection during build.

Not enabled by default. Note that "view_prebuilt" always bundles licenses.

"ipc"

Enables IPC tasks, pre-build views and connecting to views running in another process.

Enabled by default.

"built_res"

Check if zng::env::res path is available in init_built_res first.

Enabled by default in debug builds.

Repository

See the zng-ui/zng repository README for more information about build requirements, examples and license information.

Dependencies

~27–76MB
~1M SLoC