# bevy_file_dialog [![crates.io](https://img.shields.io/crates/v/bevy_file_dialog)](https://crates.io/crates/bevy_file_dialog) [![docs.rs](https://docs.rs/bevy_file_dialog/badge.svg)](https://docs.rs/bevy_file_dialog) A plugin for loading and saving files using system dialogs for the Bevy game engine. ## Usage See usage below for loading and saving and the [examples](https://github.com/richardhozak/bevy_file_dialog/tree/main/examples) for separate load/save dialogs. This example is also present in [examples](https://github.com/richardhozak/bevy_file_dialog/tree/main/examples) and you can run it with `cargo run --example save_and_load`. ```rust use bevy::prelude::*; use bevy_file_dialog::prelude::*; struct TextFileContents; fn main() { App::new() .add_plugins(DefaultPlugins) // Add the file dialog plugin .add_plugins( FileDialogPlugin::new() // allow saving of files marked with TextFileContents .with_save_file::() // allow loading of files marked with TextFileContents .with_load_file::(), ) .add_systems(Startup, setup) .add_systems( Update, ( dialog, file_loaded, file_saved, file_load_canceled, file_save_canceled, ), ) .run(); } fn setup(mut commands: Commands) { commands.spawn(Camera2dBundle::default()); } fn dialog(mut commands: Commands, keys: Res>) { // Ctrl+S - save file // Ctrl+O - load file if keys.any_pressed([KeyCode::ControlLeft, KeyCode::ControlRight]) { if keys.just_pressed(KeyCode::S) { // save contents to selected file commands .dialog() .add_filter("Text", &["txt"]) .set_file_name("hello.txt") .save_file::(b"hello".to_vec()); } else if keys.just_pressed(KeyCode::O) { // read contents from selected file commands .dialog() .add_filter("Text", &["txt"]) .load_file::(); } } } fn file_loaded(mut ev_loaded: EventReader>) { for ev in ev_loaded.read() { eprintln!( "Loaded file {} with contents '{}'", ev.file_name, std::str::from_utf8(&ev.contents).unwrap() ); } } fn file_load_canceled(mut ev_canceled: EventReader>) { for _ in ev_canceled.read() { eprintln!("Text file content load canceled"); } } fn file_saved(mut ev_saved: EventReader>) { for ev in ev_saved.read() { match ev.result { Ok(_) => eprintln!("File {} successfully saved", ev.file_name), Err(ref err) => eprintln!("Failed to save {}: {}", ev.file_name, err), } } } fn file_save_canceled(mut ev_canceled: EventReader>) { for _ in ev_canceled.read() { eprintln!("Text file content save canceled"); } } ``` ## File dialogs on Linux and BSDs You can use one of the two backends on linux to create file dialogs that is specified with features, either `gtk3` or `xdg-portal`. By default `bevy_file_dialog` uses the default provided by `rfd` which is `xdg-portal`. You can change this by specifying the correct features in your `Cargo.toml`: ``` bevy_file_dialog = { version = "*", default-features = false, features = ["gtk3"] } ``` More information in [rfd docs](https://docs.rs/rfd/0.12.1/rfd/index.html#linux--bsd-backends), the information there matches `bevy_file_dialog`. --- | bevy | bevy_file_dialog | | ---- | ---------------- | | 0.14 | 0.6.0 | | 0.13 | 0.4.0 - 0.5.0 | | 0.12 | 0.1.0 - 0.3.1 |